14
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

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

よくある、静的ファイルを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-06-19 15.08.42.png

画面上に燦然と輝く「2018年8月31日に使えなくなるから2.0に更新してちょ」の文字を見る限り、正しい設定ではないようです。
どないせーと。

参考:
nisevi/config.yml

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
14
Help us understand the problem. What are the problem?