背景
s3バケット内のオブジェクトのパーミッションでeveryoneにリード権限がないので、サイトが公開できない...(なぜ、、wordpressとか使っているとたまにある...)
↓↓↓↓↓
_人人人人人人人人人人人人人人人人人人人人人人人人人人人人_
バケット内のオブジェクトに一括でpublic-readの権限を与えたい
 ̄YYYYYYYYYYYYYYYYYYYYYYYYYYYY ̄
↓↓↓↓↓
なんかブラウザのコンソール画面からバケットに権限与えても各オブジェクトのpermissionは変わらないしどうしようと思ってググったところ
下記で公開されているようなsdkを使ってパーミッションを変更するもの等ありました。
- [S3, CloudFront] アップロード済みファイルのメタ情報を一括で変更する
- AWS S3 のファイルを rails console から一括変更する
- One shot S3 permission changer. 一括でS3 のオブジェクトのパーミッションを変更するスクリプト。
、、、がsdk入れるのめんどくさい。。。
AmazonLinuxAMIだからaws-cliは入ってる。これでいけるだろ、いけるに決まってる。
と思い書いてみました。
AWS CLIを使ってS3のバケット内オブジェクトのpermission(ACL)を一括変更する
- 対象のs3バケットに権限のあるアクセスキーを登録
$ aws configure
AWS Access Key ID []:
AWS Secret Access Key []:
Default region name [ap-northeast-1]:
Default output format [json]:
もしくは
$ export AWS_ACCESS_KEY_ID=xxxxxxxxxx
$ export AWS_SECRET_ACCESS_KEY=xxxxxxxxxx
$ export AWS_DEFAULT_REGION=ap-northeast-1
$ export AWS_DEFAULT_OUTPUT=json
参考:【AWS】CLIの初期設定について(認証情報とコマンド補完)
- スクリプト
[直列で実行]
aws s3 ls --recursive s3://{{ bucketName }}/ | awk '{print $4}' | xargs -I{} aws s3api put-object-acl --acl public-read --bucket {{ bucketName }} --key "{}"
[並列で実行]
aws s3 ls --recursive s3://{{ bucketName }}/ | awk '{print $4}' | xargs -P4 -I{} aws s3api put-object-acl --acl public-read --bucket {{ bucketName }} --key "{}"
※ 並列実行は試していないが、直列だと結構時間かかったので...(-P 並列実行数 のオプションをつけて)
- あるフォルダのみ対象にする
aws s3 ls --recursive s3://{{ bucketName }}/path/ | awk '{print $4}' | xargs -P4 -I{} aws s3api put-object-acl --acl public-read --bucket {{ bucketName }} --key "{}"
こんな感じでできる。
lsの値にpath指定をしてあげればOK!
もっと良い方法ありそうだが、なかなかでてこなかったのでひとまずこれで乗り切りました。
もし良い方法あれば教えてください。
[追記]
s3cmdを入れる方がだいぶ楽だったようです..笑
s3cmd setacl -r --acl-public s3://{{ bucketName }}