バケット内に10,000ファイルのフォルダがあります。それらをアップロードしてすぐに公開する方法はないようです。だから私はそれらすべてをアップロードしました、それらは非公開であり、私はそれらをすべて公開する必要があります。
私はawsコンソールを試してみましたが、エラーが発生します(ファイル数の少ないフォルダでは正常に機能します)。
同じことで、FirefoxでS3を整理してみました。
これらすべてを公開するために実行できるソフトウェアまたはスクリプトはありますか?
バケット内に10,000ファイルのフォルダがあります。それらをアップロードしてすぐに公開する方法はないようです。だから私はそれらすべてをアップロードしました、それらは非公開であり、私はそれらをすべて公開する必要があります。
私はawsコンソールを試してみましたが、エラーが発生します(ファイル数の少ないフォルダでは正常に機能します)。
同じことで、FirefoxでS3を整理してみました。
これらすべてを公開するために実行できるソフトウェアまたはスクリプトはありますか?
回答:
バケット内のすべてのファイルへのアクセスを許可するバケットポリシー(以下の例を参照)を生成できます。バケットポリシーは、AWSコンソールからバケットに追加できます。
{
"Id": "...",
"Statement": [ {
"Sid": "...",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::bucket/*",
"Principal": {
"AWS": [ "*" ]
}
} ]
}
また、Amazonが提供する次のポリシージェネレータツールもご覧ください。
bucket/avatars/*
。(*
最後のを忘れないでください。私はそうしましたが、しばらくの間、輪になって走り回っていました。)
初めてアップロードする場合は、コマンドラインでアップロード時にファイルを公開するように設定できます。
aws s3 sync . s3://my-bucket/path --acl public-read
AWSコマンドラインインターフェイスでの高レベルのs3コマンドの使用に記載されているとおり
残念ながら、ファイルがアップロードされたときにのみACLが適用されます。(私のテストでは)既にアップロードされたファイルにACLを適用しません。
既存のオブジェクトを更新する場合、以前はバケットをそれ自体と同期できましたが、これは機能しなくなったようです。
[もう機能していません]これはコマンドラインから実行できます:
aws s3 sync s3://my-bucket/path s3://my-bucket/path --acl public-read
(つまり、これはもはや質問には答えませんが、以前は機能していた参照用に答えを残します。)
数十万のオブジェクトを変更する必要がありました。これを実行するためにEC2インスタンスを起動しました。これにより、すべてが速くなります。aws-sdk
最初にgem をインストールする必要があります。
これがコードです:
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
同じ問題がありました。SDKの新しいバージョンがリリースされているため、@ DanielVonFangeによるソリューションは古くなっています。
AWS Ruby SDKで今すぐ機能するコードスニペットを追加します。
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
CLIの使用:
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)}'
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)}'
これには自分自身が必要でしたが、ファイルの数が多いため、シリアルで実行するのが遅くなります。そこで、私はiron.ioのIronWorkerサービスでそれを行うスクリプトを書きました。1か月あたり500コンピューティングの無料の計算時間は、大きなバケットでも処理するのに十分です(それを超えると、料金は妥当です)。並行して行われるため、私が持っていた32,000個のオブジェクトについては1分未満で完了します。また、私は彼らのサーバーがEC2で実行されているので、ジョブとS3の間の通信が速いと思います。
だれでも自分のニーズに合わせて私のスクリプトを使用できます。
一括操作を非常に適切に管理し、堅牢なS3クライアントであるBucketExplorerをご覧ください。
あなたは彼らがデフォルトの振る舞いを一般公開するようにすると思いますか?:)C#ソリューションからS3とインターフェースするカスタムAPIを構築しているときに、私はあなたの欲求不満を共有しました。S3オブジェクトをアップロードし、デフォルトでpublic-readアクセスに設定するスニペットを次に示します。
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));
}
}
ToACLString(acl)関数はpublic-readを返し、BASE_SERVICE_URLはs3.amazonaws.comで、AWS_ACL_HEADER定数はx-amz-aclです。プラグインとDreamMessageは、Dreamフレームワークを使用してhttp通信を合理化しているため、奇妙に見えるかもしれません。基本的に、指定されたヘッダーとaws仕様ごとの特別なヘッダー署名を使用してhttp PUTを実行しています(認証ヘッダーの作成方法の例については、awsドキュメントのこのページを参照してください)。
既存の1000個のオブジェクトACLを変更するには、スクリプトを記述しますが、GUIツールを使用して当面の問題を修正する方がおそらく簡単です。これまで使用した中で最高のものは、S3用のcloudberryという会社のものです。少なくとも1つの製品を15日間無料で試用できるようです。一度に複数のオブジェクトを選択して、コンテキストメニューからACLをパブリックに設定できることを確認しました。クラウドをお楽しみください!