よくある、静的ファイルをGitHubにpushしてマスターブランチだったらS3にアップロードする動き。
簡単にできるはずなのにやたらハマったのでメモ。
IAMの準備
S3にアクセスする用の権限を作成します。
ListBucketがないと怒られます。
また、aws s3 sync
に--delete
オプションを付ける場合はDeleteObjectも必要です。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:ListBucket",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::your-s3-bucket-name",
"arn:aws:s3:::your-s3-bucket-name/*"
]
}
]
}
config.ymlを作成する
aws-cliがインストール済みのDocker imageを探していたところ、Innovator Japanさんが見つかったので利用させてもらいます。
CodeDeploy? すみませんまだ勉強中なもので…。
version: 2
jobs:
build:
working_directory: ~/repo
environment:
- AWS_S3_BUCKET_NAME: your-s3-bucket-name
docker:
- image: innovatorjapan/awscli:latest
steps:
- checkout
- run:
name: Deploy to S3 if branch is Master.
command: |
if [ "${CIRCLE_BRANCH}" == "master" ]; then
aws s3 sync ~/repo s3://${AWS_S3_BUCKET_NAME}/ --exact-timestamps --delete
fi
リポジトリのルートに.circleci
ディレクトリを作成し、その中にconfig.yml
を置きます。
SECRET_KEYはどこに登録するの問題
あとはIAMで作成したSECRET_KEYを設定し、プロジェクトをビルドすれば動きます。
ではこのSECRET_KEYはどこで設定すればいいのか。
「環境変数でええやん」と思い、当初はこうしていました。
version: 2
jobs:
build:
working_directory: ~/repo
environment:
- AWS_DEFAULT_REGION: ap-northeast-1
- AWS_SECRET_ACCESS_KEY: your-secret-access-key
- AWS_ACCESS_KEY_ID: your-access-key-id
- AWS_S3_BUCKET_NAME: your-s3-bucket-name
docker:
- image: innovatorjapan/awscli:latest
steps:
- checkout
- run:
name: Deploy to S3 if branch is Master.
command: |
if [ "${CIRCLE_BRANCH}" == "master" ]; then
aws s3 sync ~/repo s3://${AWS_S3_BUCKET_NAME}/ --exact-timestamps --delete
fi
結果はこう。
#!/bin/sh -eo pipefail
if [ "${CIRCLE_BRANCH}" == "master" ]; then
aws s3 sync ~/repo s3://${AWS_S3_BUCKET_NAME}/ --exact-timestamps --delete
fi
fatal error: An error occurred (AuthorizationHeaderMalformed) when calling the ListObjects operation: The authorization header is malformed; the Credential is mal-formed; expecting "<YOUR-AKID>/YYYYMMDD/REGION/SERVICE/aws4_request".
Exited with code 1
色々探したところ、プロジェクトのEnvironment Variablesに設定しろという書き込みを見つけたのでその通りにしたところ、結果は全く同じ。
仕方ないのでプロジェクトのAWS Permissionsに設定したところ、バッチリ動きました。
画面上に燦然と輝く**「2018年8月31日に使えなくなるから2.0に更新してちょ」**の文字を見る限り、正しい設定ではないようです。
どないせーと。