কীভাবে এস 3 টিতে 10,000 টি ফাইল তৈরি করা যায়


93

আমার কাছে বালতিতে 10,000 টি ফাইল রয়েছে 10,000 এগুলিকে আপলোড করার এবং এখুনি তাদের জনসাধারণ করার কোনও উপায় নেই বলে মনে হচ্ছে। সুতরাং আমি এগুলি সমস্ত আপলোড করেছি, তারা ব্যক্তিগত and এবং এগুলি সকলকে আমার প্রকাশ করা দরকার।

আমি আউস কনসোলটি চেষ্টা করেছি, এটি কেবল একটি ত্রুটি দেয় (কম ফাইলের সাথে ফোল্ডারগুলি নিয়ে কাজ করে)।

আমি ফায়ারফক্সে এস 3 ব্যবহার করার চেষ্টা করেছি, একই জিনিস।

এই সমস্ত জনসাধারণের জন্য চালানোর জন্য এমন কোনও সফ্টওয়্যার বা কোনও স্ক্রিপ্ট রয়েছে কি?


4
প্রতিটি সরঞ্জাম ক্র্যাশ করার চেষ্টা করেছি, তাই আমি একটি পিএইচপি স্ক্রিপ্ট লিখে শেষ করেছি যা কয়েক ঘন্টা সময় নিয়েছিল এবং কেবল বালতিতে থাকা প্রতিটি বস্তুর মধ্যে লুপ করে এটিকে জনসমক্ষে প্রচার করে।
পিটারভি

উত্তর:


120

আপনি বালতি নীতি তৈরি করতে পারেন (নীচের উদাহরণ দেখুন) যা বালতিতে থাকা সমস্ত ফাইলগুলিতে অ্যাক্সেস দেয়। বালতি নীতি AWS কনসোলের মাধ্যমে একটি বালতিতে যুক্ত করা যেতে পারে।

{
    "Id": "...",
    "Statement": [ {
        "Sid": "...",
        "Action": [
            "s3:GetObject"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::bucket/*",
        "Principal": {
            "AWS": [ "*" ]
        }
    } ]
}

অ্যামাজন দ্বারা সরবরাহিত নীতির নীতিগত জেনারেটর সরঞ্জামটিও দেখুন।

http://awspolicygen.s3.amazonaws.com/policygen.html


5
এটি আমার পক্ষে কার্যকর হয়নি। কিছু বস্তু বালতি নীতিমালা থাকা সত্ত্বেও এখনও 'অ্যাক্সেস অস্বীকৃত' প্রতিক্রিয়া ফিরিয়ে দিচ্ছে। এটি কেবল বালতির নাম পরিবর্তিত হয়ে উপরের থেকে অনুলিপি-আটকানো হয়েছে। আমি অনুমান করি যে সমস্ত 1.3 মিলিয়ন অবজেক্টের মধ্যে লুপ করার জন্য একটি স্ক্রিপ্ট লেখার সময় এসেছে ... বিরক্তিকর
ব্লেক মিলার

আপনার বালতিটির নামে "বালতি" পরিবর্তন করতে হবে
কার্নেজ

11
আমি এইভাবে এটি করতে রাগ। এটি কিছু কুরুচিপূর্ণ JSON।
সুপারলুমিনারি

7
শুধু একটি নোট: এটা সুস্পষ্ট বলে মনে হতে পারে, কিন্তু আপনি নির্দিষ্ট সীমা এক্সেস করা চয়ন করতে পারেন ফোল্ডার : bucket/avatars/*। ( *শেষে
এটিকে

4
@ বেঞ্জামিন আপনার জন্য "বেসিক" কনফিগারেশনটি অন্যের পক্ষে অনুপযুক্ত, কারণ প্রত্যেকের সুরক্ষার প্রয়োজনীয়তা আলাদা different এডাব্লুএস এই নীতিগুলি কাস্টমাইজ করার জন্য অভিন্ন উপায় সরবরাহ করে। অতএব, সুরক্ষা নীতিগুলি সঠিকভাবে শিখতে এবং জেএসএনের কয়েকটি সাধারণ লাইন থেকে লজ্জা পাবে না এমন জন্য অবশ্যই একটি সময় নিতে হবে।
আফিলিনা

71

আপনি যদি প্রথমবার আপলোড করছেন, আপনি ফাইলগুলি কমান্ড লাইনে আপলোড করার জন্য সর্বজনীন হতে সেট করতে পারেন:

aws s3 sync . s3://my-bucket/path --acl public-read

এডাব্লুএস কমান্ড লাইন ইন্টারফেসের সাথে হাই-লেভেল এস 3 কমান্ড ব্যবহার করার নথি হিসাবে

দুর্ভাগ্যক্রমে ফাইলগুলি আপলোড করা হলে এটি কেবল এসিএল প্রয়োগ করে। এটি (আমার পরীক্ষায়) ইতিমধ্যে আপলোড করা ফাইলগুলিতে এসিএল প্রয়োগ করে না।

আপনি যদি বিদ্যমান অবজেক্টগুলি আপডেট করতে চান তবে আপনি বালতিটি নিজের সাথে সিঙ্ক করতে সক্ষম হতেন তবে এটি কাজ বন্ধ করে দিয়েছে বলে মনে হয়।

[আর কাজ করছে না] কমান্ড লাইন থেকে এটি করা যেতে পারে:

aws s3 sync s3://my-bucket/path s3://my-bucket/path --acl public-read

(সুতরাং এটি আর প্রশ্নের উত্তর দেয় না, তবে রেফারেন্সের জন্য উত্তরটি রেখে দেয় কারণ এটি কাজ করত))


এই কমান্ডটি ইতিমধ্যে আপলোড করা তবে এখনও প্রকাশ্য নয় এমন ফাইলগুলিতে প্রভাবিত হয়েছে?
অ্যালস্টন

10
যখন আমি এটি পরীক্ষা করেছি, মনে হচ্ছে কেবল নতুন সিঙ্ক হওয়া ফাইলগুলিতে এসিএল যুক্ত হবে।
ডেভিড রুসেল

রিপ্লে করার জন্য আপনাকে ধন্যবাদ, আমি এটিও পরীক্ষা করেছি। ব্যাচের কোনও উপায় কি আপলোড করা ফাইলগুলির অনুমতি পরিবর্তন করে?
অ্যালস্টন

ওহ, অবাক হওয়ার কিছু নেই। এতে আমি বিভ্রান্ত হয়ে পড়েছিলাম। আপনি স্পষ্ট করে সত্যিই প্রশংসা।
শ্রীধর সারনোবাত

বিদ্যমান ফাইলগুলি কীভাবে পরিবর্তন করা যায় তা অন্তর্ভুক্ত করার জন্য উত্তর আপডেট হয়েছে।
ডেভিড রুসেল

34

আমাকে কয়েক লক্ষ বস্তু পরিবর্তন করতে হয়েছিল। এটি চালানোর জন্য আমি একটি ইসি 2 উদাহরণ উত্সাহিত করেছি, যার ফলে এটি সমস্ত দ্রুত হয়। আপনি aws-sdkপ্রথমে রত্নটি ইনস্টল করতে চাইবেন ।

কোডটি এখানে:

require 'rubygems'
require 'aws-sdk'


# Change this stuff.
AWS.config({
    :access_key_id => 'YOURS_HERE',
    :secret_access_key => 'YOURS_HERE',
})
bucket_name = 'YOUR_BUCKET_NAME'


s3 = AWS::S3.new()
bucket = s3.buckets[bucket_name]
bucket.objects.each do |object|
    puts object.key
    object.acl = :public_read
end

4
সহজ উপায় হ'ল প্রথম স্থানে সেট করা পাবলিক_ড ফ্ল্যাগ সহ তাদের আপলোড করা, তবে এটি ব্যর্থ হয়ে, এটি একটি ভাল বিকল্প।
সুপারলুমিনিয়াম

এই কোড স্নিপেড পুরানো, আমার পড়ুন উত্তর
ksarunas

27

আমার একই সমস্যা ছিল, @ ডানিয়েলভ্যানফ্যাঞ্জের সমাধান পুরানো, এসডিকে নতুন সংস্করণ শেষ হওয়ার কারণে।

কোড স্নিপেট যোগ করা যা আমার জন্য এখনই এডাব্লুএস রুবি এসডিকে দিয়ে কাজ করে:

require 'aws-sdk'

Aws.config.update({
  region: 'REGION_CODE_HERE',
  credentials: Aws::Credentials.new(
    'ACCESS_KEY_ID_HERE',
    'SECRET_ACCESS_KEY_HERE'
  )
})
bucket_name = 'BUCKET_NAME_HERE'

s3 = Aws::S3::Resource.new
s3.bucket(bucket_name).objects.each do |object|
  puts object.key
  object.acl.put({ acl: 'public-read' })
end

4
চমত্কার উত্তর - একটি স্ক্রিপ্টের জন্য আমার দরকার কেবল স্ক্রিপ্ট
ফ্যান্টমওহলে

@ksarunas আমার ক্ষেত্রে, আমাকে জনসাধারণকে ব্যক্তিগত অনুমতিতে পরিবর্তন করতে হবে তাই পাবলিক-পঠনগুলি ব্যক্তিগতের সাথে প্রতিস্থাপন করুন এবং অ্যাক্সেস বদলে গেল তবে কী, আমি ইউআরএল অ্যাক্সেস করতে পারছি?
রাহুল

19

নতুন এস 3 কনসোলের সাহায্যে কেবল এটি যুক্ত করতে চেয়েছিলেন আপনি নিজের ফোল্ডার (গুলি) নির্বাচন Make publicকরতে পারেন এবং ফোল্ডারগুলির অভ্যন্তরে সমস্ত ফাইলগুলি সর্বজনীন করতে নির্বাচন করতে পারেন। এটি ব্যাকগ্রাউন্ড টাস্ক হিসাবে কাজ করে তাই এতে যে কোনও সংখ্যক ফাইল হ্যান্ডল হওয়া উচিত।

জনসাধারণের জন্য উন্মুক্ত করো


5
দুর্ভাগ্যক্রমে এটি একটি দীর্ঘ সময় নেয় এবং কমান্ড রানার থাকা অবস্থায় আপনি ব্রাউজারটি বন্ধ করতে পারবেন না। আপনার ব্রাউজারটি প্রতিটি ফাইলের জন্য ২ টি অনুরোধ প্রেরণ করছে, আমার ক্ষেত্রে দুটি অনুরোধটি 500 মিমি নিয়েছে। আপনার কাছে যদি অনেকগুলি ফাইল থাকে তবে এটি একটি দীর্ঘ সময় নিতে পারে = (
হার্লন আগুইয়ার

4
এবং, আরও একটি সমস্যা আছে: এটি সম্পূর্ণরূপে সর্বজনীন করে দেবে। আপনি যদি কেবল সর্বজনীন-পঠিত অ্যাক্সেস চান তবে এটি একটি সমস্যা।
মার্সেলো আগিমিভেল

খুব সচেতন থাকুন - আমি এই মেক পাবলিকটি করেছি এবং "অগ্রগতি বার" যে পপস আপ হয়েছে তা খুব সূক্ষ্ম, আমি ভেবেছিলাম এটি হয়ে গেছে। আমি চেক করেছিলাম এবং সম্ভবত এটি তৈরি করার জন্য একটি ঘন্টা সময় কাটিয়েছি আমি বুঝতে পেরেছি আপনি পাবলিক এবং ছোট সূক্ষ্ম "প্রগতি বারটি দেখায়" ক্লিক করুন ... গ্রার ... যেহেতু আমি ব্রাউজার উইন্ডোটি প্রায় 10 বার বন্ধ করেছি, তাই আমি ধরে নিয়েছি যে এটি প্রতিবারই মারা গেছে । আমি এখন এটি চালিয়ে যাচ্ছি - এটি বেশ দ্রুত - 120k চিত্রের 20 মিনিটের জন্য
স্কট

13

ক্লাইট ব্যবহার:

aws s3 ls s3://bucket-name --recursive > all_files.txt && grep .jpg all_files.txt > files.txt && cat files.txt | awk '{cmd="aws s3api put-object-acl --acl public-read --bucket bucket-name --key "$4;system(cmd)}'


4
আপনি সমস্ত ফাইল.টিএসটিএসটি দিয়ে ডিস্কে লেখার পরিবর্তে গ্রেপ করার জন্য কোনও পাইপ ব্যবহার করতে পারেন না? এটি হতে পারেaws s3 ls s3://bucket-name --recursive | grep .jpg | awk '{cmd="aws s3api put-object-acl --acl public-read --bucket bucket-name --key "$4;system(cmd)}'
সাকুরাশিঙ্কেন

@ সাকুরাশিঙ্কেন উত্তর পুরোপুরি কার্যকর করে। আপনি যদি এটি দেখতে পান। এটি ব্যবহার করার জন্য এক।
আজপিয়ের

3

এটির আমার নিজের দরকার থাকলেও ফাইলগুলির সংখ্যা সিরিয়ালে ধীর হওয়ার জন্য ওয়ে করে তোলে। তাই আমি লিখেছি একটি স্ক্রিপ্ট এটি উপর আছে iron.io এর IronWorker সেবা। তাদের প্রতি মাসে 500 ফ্রি গণনা ঘন্টা এমনকি বড় বালতিগুলি হ্যান্ডেল করার জন্য যথেষ্ট (এবং যদি আপনি এর চেয়ে বেশি মূল্য নির্ধারণ করেন তবে)। যেহেতু এটি সমান্তরালভাবে করা হয় এটি আমার কাছে থাকা 32,000 বস্তুর জন্য এক মিনিটেরও কম সময়ে সম্পূর্ণ হয় tes এছাড়াও আমি বিশ্বাস করি যে তাদের সার্ভারগুলি ইসি 2 তে চলে তাই কাজ এবং এস 3 এর মধ্যে যোগাযোগটি দ্রুত হয়।

আমার স্ক্রিপ্টটি তাদের নিজস্ব প্রয়োজনের জন্য ব্যবহার করতে যে কেউ স্বাগত।


2

বিকেটএক্সপ্লোরার এ দেখুন এটি বাল্ক অপারেশনগুলি খুব ভাল পরিচালনা করে এবং এটি একটি শক্ত এস 3 ক্লায়েন্ট।


4
তথ্য প্যালেটের মাধ্যমে সাইবারডাক্কে (ফ্রি) বাল্ক পরিবর্তন করার অনুমতি এখন পাওয়া সম্ভব।
টেলর এডমিস্টন

আপনার কাছে সমস্ত বালতি তালিকাভুক্ত করার অনুমতি থাকলে বিকেট এক্সপ্লোরার কেবলমাত্র কার্যকর। এই ক্রিয়াকলাপের জন্য সিএলআই বা একটি এসডিকে ব্যবহার করা আরও ভাল এবং আপনার ব্যবহারকারীদের সীমাবদ্ধ অনুমতি দিয়ে রেখে দিন।
পেরিল্যান্ডমিশাপ

0

আপনি ভাববেন যে তারা জনসাধারণকে ডিফল্ট আচরণটি পড়তে বাধ্য করবে, তাই না? :) একটি সি # সমাধান থেকে এস 3 এর সাথে ইন্টারফেসে একটি কাস্টম এপিআই তৈরি করার সময় আমি আপনার হতাশাকে ভাগ করেছি। এখানে একটি স্নিপেট যা একটি S3 অবজেক্ট আপলোড করতে এবং এটি ডিফল্টরূপে পাবলিক-পঠিত অ্যাক্সেসে সেট করে lis

public void Put(string bucketName, string id, byte[] bytes, string contentType, S3ACLType acl) {
     string uri = String.Format("https://{0}/{1}", BASE_SERVICE_URL, bucketName.ToLower());
     DreamMessage msg = DreamMessage.Ok(MimeType.BINARY, bytes);
     msg.Headers[DreamHeaders.CONTENT_TYPE] = contentType;
     msg.Headers[DreamHeaders.EXPECT] = "100-continue";
     msg.Headers[AWS_ACL_HEADER] = ToACLString(acl);
     try {
        Plug s3Client = Plug.New(uri).WithPreHandler(S3AuthenticationHeader);
        s3Client.At(id).Put(msg);
     } catch (Exception ex) {
        throw new ApplicationException(String.Format("S3 upload error: {0}", ex.Message));
     }
}

টোএসিএলস্ট্রিং (এসিএল) ফাংশনটি সর্বজনীন-পঠিত ফেরত দেয় , BASE_SERVICE_URL হল s3.amazonaws.com এবং AWS_ACL_HEADER ধ্রুবকটি এক্স-এমজেজ-এসিএল । প্লাগ এবং ড্রিমমেজেজ স্টাফগুলি সম্ভবত আপনার কাছে অদ্ভুত লাগবে কারণ আমরা আমাদের HTTP যোগাযোগগুলিকে আরও সহজ করার জন্য স্বপ্নের কাঠামোটি ব্যবহার করছি। মূলত আমরা নির্দিষ্ট শিরোলেখগুলির সাথে একটি HTTP PUT করছি এবং প্রতি বিশেষ উল্লেখের জন্য একটি বিশেষ শিরোনাম স্বাক্ষর ( অনুমোদনের শিরোনাম কীভাবে তৈরি করা যায় তার উদাহরণগুলির জন্য এই ডাবস ডক্সে এই পৃষ্ঠাটি দেখুন )।

বিদ্যমান 1000 অবজেক্ট এসিএল পরিবর্তন করতে আপনি স্ক্রিপ্ট লিখতে পারেন তবে তাত্ক্ষণিক সমস্যা সমাধানের জন্য জিইউআই সরঞ্জামটি ব্যবহার করা আরও সহজ। আমি এখন অবধি সবচেয়ে ভাল ব্যবহার করেছি এস 3 এর ক্লাউডবেরি নামক একটি সংস্থা থেকে ; দেখে মনে হচ্ছে তাদের কমপক্ষে একটি পণ্যের জন্য তারা নিখরচায় 15 দিনের পরীক্ষা আছে। আমি কেবল যাচাই করেছি যে এটি আপনাকে একবারে একাধিক অবজেক্ট নির্বাচন করতে এবং প্রসঙ্গ মেনুটির মাধ্যমে তাদের এসিএল সর্বজনীনতে সেট করতে দেয়। মেঘ উপভোগ করুন!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.