AWS S3パブリックフォルダーを再びプライベートにするにはどうすればよいですか?
ステージングデータをテストしていたので、フォルダー全体をバケット内で公開しました。アクセスを再度制限したいです。では、フォルダを再びプライベートにするにはどうすればよいですか?
私が理解していることから、管理コンソールの「パブリックにする」オプションは、ディレクトリ内のすべてのオブジェクトにパブリック許可を再帰的に追加します。これを確認するには、1つのファイルを右クリックして、[プロパティ]をクリックします。次に、「Permissions」をクリックする必要があります。行が必要です。
Grantee: Everyone [x] open/download [] view permissions [] edit permission.
このディレクトリ内に新しいファイルをアップロードすると、このパブリックアクセスが設定されないため、プライベートになります。
いくつかのキーしかない場合は手動で、またはスクリプトを使用して、パブリック読み取り許可を1つずつ削除する必要があります。
S3フォルダー内のすべてのキーの 'public read'属性を再帰的に削除する 'boto'モジュールを使用して、Pythonで小さなスクリプトを作成しました。
#!/usr/bin/env python
#remove public read right for all keys within a directory
#usage: remove_public.py bucketName folderName
import sys
import boto
bucketname = sys.argv[1]
dirname = sys.argv[2]
s3 = boto.connect_s3()
bucket = s3.get_bucket(bucketname)
keys = bucket.list(dirname)
for k in keys:
new_grants = []
acl = k.get_acl()
for g in acl.acl.grants:
if g.uri != "http://acs.amazonaws.com/groups/global/AllUsers":
new_grants.append(g)
acl.acl.grants = new_grants
k.set_acl(acl)
2つのオブジェクト(のみ)を含むフォルダーでテストし、動作しました。 lotsのキーがある場合、完了するまでに時間がかかる場合があり、並列アプローチが必要になる場合があります。
受け入れられた答えはうまく機能します-与えられたs3パスにもACLを再帰的に設定しているようです。ただし、これは s3cmd と呼ばれるサードパーティのツールによっても簡単に実行できます-私たちは会社で頻繁に使用しており、AWSコミュニティでかなり人気があるようです。
たとえば、この種のs3バケットとディレクトリ構造s3://mybucket.com/topleveldir/scripts/bootstrap/tmp/
があるとします。ここで、Amazon S3コンソールを使用して、scripts
"ディレクトリ"全体をパブリックとしてマークしたとします。
scripts
"ディレクトリツリー"全体を再帰的に(つまり、サブディレクトリとそのファイルを含む)再びプライベートにするには:
s3cmd setacl --acl-private --recursive s3://mybucket.com/topleveldir/scripts/
必要に応じて、scripts
"ディレクトリツリー"を再帰的に再びパブリックにすることも簡単です。
s3cmd setacl --acl-public --recursive s3://mybucket.com/topleveldir/scripts/
また、上記のコマンドで--recursive
を省略するだけで、特定のs3 "ディレクトリ"(つまり、非再帰的)にのみアクセス許可/ ACLを設定することもできます。
s3cmd
が機能するには、まずs3cmd --configure
を介してs3cmdにAWSアクセスキーと秘密キーを提供する必要があります(詳細については http://s3tools.org/s3cmd を参照してください) 。
AWS CLIの場合、これはかなり簡単です。
オブジェクトが次の場合:s3://<bucket-name>/file.txt
単一オブジェクトの場合:
aws s3api put-object-acl --acl private --bucket <bucket-name> --key file.txt
バケット内のすべてのオブジェクト(bash one-liner):
aws s3 ls --recursive s3://<bucket-name> | cut -d' ' -f5- | awk '{print $NF}' | while read line; do
echo "$line"
aws s3api put-object-acl --acl private --bucket <bucket-name> --key "$line"
done
AWS S3バケットリスト(AWS S3 UI)から、individualファイルのアクセス許可を変更できますeitherone file public またはフォルダー全体のコンテンツを公開することにより(明確にするために、バケット内のフォルダーを参照しています)。パブリック属性をプライベートに戻すには、ファイルをクリックしてからアクセス許可に移動し、「EVERYONE」見出しの下にある放射状ボタンをクリックします。 * read object "属性のチェックを外すことができる2番目のフローティングウィンドウが表示されます。変更を保存することを忘れないでください。リンクにアクセスしようとすると、通常の" Access Denied "メッセージが表示されます。ファイルをクリックして前述の手順を実行すると、4つのステップを示す2番目のスクリーンショットが表示されます。複数のファイルを変更するには、以前の投稿で提案したスクリプトを使用する必要があります。 -Kf
このガイドに従って実際にAmazonのUIを使用しました http://aws.Amazon.com/articles/5050/
現時点では、 boto docs に従って、この方法でそれを行うことができます
#!/usr/bin/env python
#remove public read right for all keys within a directory
#usage: remove_public.py bucketName folderName
import sys
import boto
bucketname = sys.argv[1]
dirname = sys.argv[2]
s3 = boto.connect_s3()
bucket = s3.get_bucket(bucketname)
keys = bucket.list(dirname)
for k in keys:
# options are 'private', 'public-read'
# 'public-read-write', 'authenticated-read'
k.set_acl('private')
また、s3バケットの[権限]タブでバケットポリシーを削除することも検討できます。
@kintuparantuの答えはうまく機能しますが、awk
部分のために、スクリプトはls
の結果の最後の部分のみを説明することに言及する価値があります。ファイル名にスペースが含まれている場合、awk
は、ファイル名全体ではなく、スペースで分割されたファイル名の最後のセグメントのみを取得します。
例:folder1/subfolder1/this is my file.txt
のようなパスを持つファイルは、単にfile.txt
と呼ばれるエントリになります。
スクリプトを使用している間にそれを防ぐには、$NF
のawk {print $NF}
を、「スペースで分割」操作が行うセグメントの数を考慮した一連の可変プレースホルダーで置き換える必要があります。ファイル名の名前には非常に多くのスペースが含まれている可能性があるため、誇張しましたが、正直なところ、これらのケースに対処するには完全に新しいアプローチの方が良いと思います。更新されたコードは次のとおりです。
#!/bin/sh
aws s3 ls --recursive s3://plusplus-staging | awk '{print $4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25}' | while read line; do
echo "$line"
aws s3api put-object-acl --acl private --bucket plusplus-staging --key "$line"
done
cut
を使用しても結果が得られなかったため、削除しました。彼がスクリプトを作成したので、クレジットはまだ@kintuparantuに送られます。
これは現在Amazonによって対処されているようです。
次のチェックボックスを選択すると、バケットとそのコンテンツが再びプライベートになります。
バケットにパブリックポリシーがある場合、パブリックおよびクロスアカウントアクセスをブロックする
今日これをやった。私の状況では、ファイルを非公開にする必要がある特定のトップレベルディレクトリがありました。公開する必要があるフォルダがいくつかありました。
私は、他の多くの人がすでに示したように、s3cmd
を使用することにしました。しかし、膨大な数のファイルがあるため、各ディレクトリに対して並列s3cmd
ジョブを実行したかったのです。そして、1日かそこらかかるので、EC2マシンでバックグラウンドプロセスとして実行したかったのです。
t2.xlarge
タイプを使用してUbuntuマシンをセットアップしました。マイクロインスタンスでメモリ不足のメッセージでs3cmd
が失敗した後、xlargeを選択しました。 xlargeはおそらく過剰ですが、このサーバーは1日だけ稼働します。
サーバーにログインした後、s3cmd
をインストールして構成しました。
Sudo apt-get install python-setuptools wget https://sourceforge.net/projects/s3tools/files/s3cmd/2.0.2/s3cmd-2.0.2.tar.gz/download mv download s3cmd.tar.gz tar xvfz s3cmd.tar.gz cd s3cmd-2.0.2/ python setup.py install Sudo python setup.py install cd ~ s3cmd --configure
私はもともとscreen
を使用しようとしましたが、いくつかの問題がありました。主にscreen -r
のような適切な画面コマンドを実行しているにもかかわらず、プロセスはscreen -S directory_1 -d -m s3cmd setacl --acl-private --recursive --verbose s3://my_bucket/directory_1
から落ちていました。そこで、いくつかの検索を行って、Nohup
コマンドを見つけました。ここに私が終わったものがあります:
Nohup s3cmd setacl --acl-private --recursive --verbose s3://my_bucket/directory_1 > directory_1.out & Nohup s3cmd setacl --acl-private --recursive --verbose s3://my_bucket/directory_2 > directory_2.out & Nohup s3cmd setacl --acl-private --recursive --verbose s3://my_bucket/directory_3 > directory_3.out &
マルチカーソルエラーの場合、これは非常に簡単になります(ディレクトリのリストにaws s3 ls s3//my_bucket
を使用しました)。
そうすることで、logout
を好きなように設定し、再度ログインしてログを追跡することができます。次のような複数のファイルを末尾に追加できます:tail -f directory_1.out -f directory_2.out -f directory_3.out
したがって、s3cmd
を設定し、Nohup
を使用しました。楽しむ!