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


92

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

私はawsコンソールを試してみましたが、エラーが発生します(ファイル数の少ないフォルダでは正常に機能します)。

同じことで、FirefoxでS3を整理してみました。

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


4
私が試したすべてのツールがクラッシュしたため、数時間かかり、バケット内のすべてのオブジェクトをループして公開するPHPスクリプトを作成しました。
PeterV 2010

回答:


119

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

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

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

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


5
これは私にはうまくいきませんでした。一部のオブジェクトは、バケットポリシーが設定されていても、「アクセス拒否」応答を返します。バケット名のみが変更された状態で、上からコピーペーストされます。130万個すべてのオブジェクトをループするスクリプトを書く時がきたと思います...ちょっと苛立たしい
Blake Miller

「bucket」をバケットの名前に変更する必要があります
karnage

11
私はこの方法でそれをしなければならないことに憤慨しています。これは見苦しいJSONです。
超照明

6
注:当たり前のように見えるかもしれませんが、特定のフォルダへのアクセスを制限することもできますbucket/avatars/*。(*最後のを忘れないでください。私はそうしましたが、しばらくの間、輪になって走り回っていました。)
bschaeffer

2
@Benjamin誰にとってもセキュリティ要件が異なるため、「基本的な」構成はあなたにとって不適切です。AWSは、これらのポリシーをカスタマイズする統一された方法を提供します。したがって、セキュリティポリシーを適切に学習するために時間をかけ、JSONのいくつかの単純な行を避けないでください。
afilina 2017

69

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

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

(つまり、これはもはや質問には答えませんが、以前は機能していた参照用に答えを残します。)


このコマンドは、既にアップロードされているがまだ一般公開されていないファイルに影響しますか?
Alston、2016

10
テストしたところ、新しく同期されたファイルにのみACLが追加されているようです。
David Roussel

リプレイありがとうございます、私もテストしました。アップロードされたファイルの権限を一括変更する方法はありますか?
Alston、2016

ああ、不思議ではありません。これに戸惑いました。ご清聴ありがとうございました。
Sridhar Sarnobat 16年

既存のファイルを変更する方法を含むように回答が更新されました。
David Roussel

34

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

1
単純な方法は、最初にpublic_readフラグを設定してそれらをアップロードすることですが、失敗した場合、これは良いオプションです。
超照明

このコードは古くなっています。
ksarunas '13 / 07/13

26

同じ問題がありました。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

1
素晴らしい答え-狭い場所で必要なスクリプトだけ
Phantomwhale

@ksarunas私の場合、publicをprivate権限に変更する必要があるため、public-readをprivateに置き換えると、アクセスが変更されましたが、それでもURLにアクセスできますか?
Rahul

19

新しいS3コンソールでそれを追加したいだけで、フォルダーを選択Make publicして、フォルダー内のすべてのファイルをパブリックにすることができます。バックグラウンドタスクとして機能するため、任意の数のファイルを処理できます。

公にする


5
残念ながら、これには長い時間がかかり、コマンドが実行されている間はブラウザを閉じることができません。ブラウザは各ファイルに対して2つのリクエストを送信しています。私の場合、2つのリクエストには500ミリ秒かかりました。ファイルがたくさんある場合は、時間がかかります=(
Herlon Aguiar

2
そして、別の問題があります。これは完全に公開されます。公開読み取りアクセスのみが必要な場合、それは問題です。
MarceloAgimóvel18年

非常に注意してください-私はこれを公開したので、ポップアップする「進行状況バー」は非常に微妙です。私が確認し、おそらく1時間かけてこの作業に費やしたのは、[公開する]をクリックして、小さな微妙な "進行状況バーが表示される"と気づくまでです... 。私は今それを実行しています-それはかなり迅速です-120kの画像でおそらく20分
スコット

11

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


3
すべてのfiles.txtでディスクに書き込むのではなく、単にgrepへのパイプを使用できませんか?これは可能です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)}'
sakurashinken

3

これには自分自身が必要でしたが、ファイルの数が多いため、シリアルで実行するのが遅くなります。そこで、私はiron.ioIronWorkerサービスでそれを行うスクリプトを書きまし。1か月あたり500コンピューティングの無料の計算時間は、大きなバケットでも処理するのに十分です(それを超えると、料金は妥当です)。並行して行われるため、私が持っていた32,000個のオブジェクトについては1分未満で完了します。また、私は彼らのサーバーがEC2で実行されているので、ジョブとS3の間の通信が速いと思います。

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


2

一括操作を非常に適切に管理し、堅牢なS3クライアントであるBucketExplorerをご覧ください。


3
情報パレットを介してCyber​​duck(無料)の権限を一括変更することも可能になりました。
テイラーエドミストン2014

BucketExplorerは、すべてのバケットを一覧表示する権限がある場合にのみ役立ちます。この操作にはCLIまたはSDKを使用し、ユーザーに制限された権限を残す方がはるかに優れています。
perilandmishap 2016年

0

あなたは彼らがデフォルトの振る舞いを一般公開するようにすると思いますか?:)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をパブリックに設定できることを確認しました。クラウドをお楽しみください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.