Edited at

CircleCIからAWS S3にアップロードする

More than 1 year has passed since last update.

よくある、静的ファイルを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? すみませんまだ勉強中なもので…。


config.yml

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はどこで設定すればいいのか。

「環境変数でええやん」と思い、当初はこうしていました。


config.yml

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に更新してちょ」の文字を見る限り、正しい設定ではないようです。

どないせーと。

参考:

nisevi/config.yml