Help us understand the problem. What is going on with this article?

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-06-19 15.08.42.png

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

参考:
nisevi/config.yml

fkymnbkz
イケてる人に憧れるイケてない人
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした