S3で公開している静的コンテンツについて、バケット単位でのポリシー設定を行ないます。
これにより、#3まででは新規ファイルをアップロードするたびに個別設定が必要だったACL指定が不要になります。
(実際にはバケットポリシーとACLは組み合わせて使うものですが。)
前提条件
- [JAWS-UG CLI] 総合案内: http://qiita.com/tcsh/items/14c3278f69ab073afe0f を確認して、必要な手順を終えていること。
S3への権限
S3に対してフルアクセス権限があること。
AWS CLIのバージョン
以下のバージョンで動作確認済
- AWS CLI 1.10.1
- AWS CLI 1.7.39
コマンド
aws --version
結果(例)
aws-cli/1.10.1 Python/2.7.5 Darwin/13.4.0 botocore/1.3.23
- 準備
=======
0.1. リージョンの決定
変数の設定
export AWS_DEFAULT_REGION='ap-northeast-1'
0.2. 変数の確認
変数の確認
aws configure list
結果(例)
Name Value Type Location
---- ----- ---- --------
profile s3Full-prjZ-mbp13 env AWS_DEFAULT_PROFILE
access_key ****************LOAQ shared-credentials-file
secret_key ****************I1O1 shared-credentials-file
region ap-northeast-1 env AWS_DEFAULT_REGION
AssumeRoleを利用している場合はprofileが '<not set>'と表示されます。
それ以外のときにprofileが '<not set>' と表示される場合は、以下を実行してください。
コマンド
export AWS_DEFAULT_PROFILE=<IAMユーザ名>
0.3. コンテンツの公開
http://qiita.com/tcsh/items/70694da357c1738c6bf8 (ハイレベルS3コマンドで静的Webホスティング)の手順を実施しておいてください。
- 事前作業
=============
1. コンテンツのアクセス確認
コンテンツファイルを増やしてみます。
コマンド(jawsug-cli-sample-webディレクトリで)
cp img.jpg img2.jpg
aws s3 sync . s3://${S3_BUCKET_NAME}/ \
--exclude ".git*"
ブラウザで img2.jpg (下記で表示されるURL)を開いてみましょう。
コマンド
echo "http://${S3_BUCKET_NAME}.s3-website-${AWS_DEFAULT_REGION}.amazonaws.com/img2.jpg"
"404 File Not Found"となって表示されないはずです。
2. コンテンツ用バケットのポリシー設定
2.1. 設定ファイルの作成
変数の設定
FILE_S3_BUCKET_POLICY='s3-policy-readonly.json'
変数の確認
cat << ETX
FILE_S3_BUCKET_POLICY: ${FILE_S3_BUCKET_POLICY}
S3_BUCKET_NAME: ${S3_BUCKET_NAME}
ETX
コマンド
cat << EOF > ${FILE_S3_BUCKET_POLICY}
{
"Version":"2012-10-17",
"Statement":[{
"Sid":"AddPerm",
"Effect":"Allow",
"Principal": "*",
"Action":["s3:GetObject"],
"Resource":["arn:aws:s3:::${S3_BUCKET_NAME}/*"]
}
]
}
EOF
cat ${FILE_S3_BUCKET_POLICY}
s3-policy-readonly.json
{
"Version":"2012-10-17",
"Statement":[{
"Sid":"AddPerm",
"Effect":"Allow",
"Principal": "*",
"Action":["s3:GetObject"],
"Resource":["arn:aws:s3:::example-handson-201602011830/*"]
}
]
}
JSONファイルを作成したら、フォーマットが壊れてないか必ず確認します。
コマンド
jsonlint -q ${FILE_S3_BUCKET_POLICY}
result
(戻り値なし)
2.2. ポリシーの適用
変数の確認
cat << ETX
S3_BUCKET_NAME: ${S3_BUCKET_NAME}
FILE_S3_BUCKET_POLICY: ${FILE_S3_BUCKET_POLICY}
ETX
コマンド
aws s3api put-bucket-policy \
--bucket ${S3_BUCKET_NAME} \
--policy file://${FILE_S3_BUCKET_POLICY}
result
(戻り値なし)
2.3. ポリシーの確認
コマンド
aws s3api get-bucket-policy \
--bucket ${S3_BUCKET_NAME}
result
{
"Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"AddPerm\",\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"s3:GetObject\",\"Resource\":\"arn:aws:s3:::example-handson-201602011830/*\"}]}"
}
3. コンテンツのアクセス確認
ブラウザで先程の img2.jpg を開いてみましょう。
コマンド
echo "http://${S3_BUCKET_NAME}.s3-website-${AWS_DEFAULT_REGION}.amazonaws.com/img2.jpg"
今度は表示されたはずです。