LoginSignup
13
14

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-06-19

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

13
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
14