About
CicleCIでbuildしたものをmasterにマージした際にS3の特定のバケットにアップロードしたかったので調べました。
AWSのIAM設定
不要な権限を渡したくなかったので、aws s3 cp
で特定のバケット全体にアップロードする権限を絞りました。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject"
],
"Resource": "arn:aws:s3:::sample*"
}
]
}
今回の検証の範囲では"PutObject"だけで問題ありませんでした。ListObjectないとダメという噂も見かけたのですが、バケットを指定してやるぶんには問題ないみたいでした。
sample
の後の*
がキモでこれがないとエラーになったので、要注意です。
CircleCIの設定
事前設定
CircleCIのProject settings
より、AWS Permissions
を選択肢、アクセス情報を設定します。
circle.yml
circle.yml
machine:
timezone:
Asia/Tokyo
dependencies:
pre:
- sudo pip install awscli
post:
- touch application-`date +"%Y-%m%d-%I-%M-%S"` && mv application-* $CIRCLE_ARTIFACTS
deployment:
master:
branch: master
commands:
- sh script/upload-s3.sh
dependencies
や``testの中で作成した成果物がある場合は、それを$CIRCLE_ARIFACTSにおくことで、
deployment`タスクにてその成果物をアップロードすることができます。中身は適当です。
script/upload-s3.sh
#!/bin/bash
aws s3 cp $CIRCLE_ARTIFACTS/application* $S3_BUCKET/assets/
これを動かすとアップロードできました。