web-dev-qa-db-ja.com

S3で10,000個のファイルを公開する方法

バケットに10,000個のファイルがあるフォルダーがあります。それらをアップロードしてすぐに公開する方法はないようです。だから私はそれらをすべてアップロードしました、それらはプライベートです、そして私はそれらをすべて公開する必要があります。

私はawsコンソールを試しましたが、エラーが発生するだけです(ファイルの少ないフォルダでうまく動作します)。

FirefoxでS3を整理するのと同じことを試しました。

これらすべてを公開するために実行できるソフトウェアまたはスクリプトはありますか?

80
PeterV

バケット内のすべてのファイルへのアクセスを許可するバケットポリシーを生成できます(以下の例を参照)。バケットポリシーは、AWSコンソールからバケットに追加できます。

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

また、Amazonが提供する次のポリシージェネレーターツールもご覧ください。

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

110
Rajiv

初めてアップロードする場合は、コマンドラインでアップロード時にファイルを公開するように設定できます。

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

AWS Command Line Interfaceでの高レベルs3コマンドの使用

残念ながら、ファイルのアップロード時にのみACLが適用されます。 (私のテストでは)既にアップロードされたファイルにACLを適用しません。

既存のオブジェクトを更新したい場合、以前はバケットをそれ自体に同期できましたが、これは動作を停止したようです。

[もう動作していません]これはコマンドラインから実行できます:

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

(したがって、これは質問に答えなくなりましたが、参照用に答えを残しました。

54
David Roussel

数十万個のオブジェクトを変更する必要がありました。これを実行するために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
33

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
22
ksarunas

新しいS3コンソールでそれを追加したかったので、フォルダを選択してMake publicフォルダー内のすべてのファイルを公開します。バックグラウンドタスクとして機能するため、任意の数のファイルを処理する必要があります。

Make Public

14
Selcuk

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)}'

6

これには自分自身が必要でしたが、ファイル数が多いため、シリアルでの実行が遅くなります。そこで、私は スクリプトiron.ioIronWorker サービスでそれを書いた。 1か月あたり500時間の無料計算時間は、大きなバケットを処理するのに十分です(それを超えた場合、価格設定は妥当です)。並行して行われるため、32,000個のオブジェクトに対して1分未満で完了します。また、サーバーはEC2で実行されるため、ジョブとS3間の通信は高速であると考えています。

誰でも自分のニーズに合わせて私のスクリプトを使用できます。

2
Eric Anderson

BucketExplorer をご覧ください。これは、一括操作を非常にうまく管理し、堅実なS3クライアントです。

2
willbt

彼らは、デフォルトの動作を公開して読むと思いますか? :)C#ソリューションからS3とインターフェイスするカスタムAPIを構築する際のフラストレーションを共有しました。 S3オブジェクトをアップロードし、デフォルトでパブリック読み取りアクセスに設定するスニペットを次に示します。

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.comAWS_ACL_HEADER定数はx-amz-aclです。プラグインとDreamMessageのものは、Dreamフレームワークを使用してhttp通信を合理化しているため、奇妙に見えるでしょう。基本的に、指定されたヘッダーとaws仕様ごとの特別なヘッダー署名を使用してhttp PUTを実行しています(認証ヘッダーの構築方法の例については、このページを参照してください aws docs )。

既存の1000個のオブジェクトACLを変更するには、スクリプトを記述できますが、GUIツールを使用して当面の問題を修正する方がおそらく簡単です。これまで使用した中で最高ののは、S3の cloudberry という会社のものです。少なくとも1つの製品について15日間の無料試用版があるようです。複数のオブジェクトを一度に選択し、コンテキストメニューからACLをパブリックに設定できることを確認しました。クラウドをお楽しみください!

0
Tahbaza