ITと筋トレの二刀流

未だゼロ刀流

CodeBuildでawsコマンド実行時にエラーになった話

前回の記事ではGitBookのドキュメントをCodeCommitのリポジトリにコミットするところまで実施しました。

GitBookでドキュメント作成〜導入編〜 - Tatsuyashi's Blog

目標としては、

  • CodeBuildでGitBookをビルド
  • ビルドしたHTMLをS3に配置し、静的ファイルホスティングで公開する

を目指しているのですが、途中でドはまりしてしまったのでメモとして残したいと思います。

buildspec.ymlの内容

完全版はまた次回に書きますが、CodeBuildの流れを以下のようにbuildspec.ymlに書きました。

version: 0.2

env:
  variables:
      S3_BUCKET: "xxxxxxx"
     # key: "value"
  #parameter-store:
     # key: "value"
     # key: "value"

phases:
  install:
    commands:
       - npm install gitbook-cli
  #pre_build:
    #commands:
      # - command
  build:
    commands:
       - node ./node_modules/gitbook-cli/bin/gitbook.js build
  post_build:
    commands:
       - aws s3 cp --recursive _book/ s3://S3_BUCKET/book/
#artifacts:
  #files:
     # - files
  #discard-paths: yes
  #base-directory: location
#cache:
  #paths:
    # - paths

GitBookのビルドまでは成功していたので、あとはS3へコピーするだけと思って楽観視していたのですが、、

f:id:tatsuyashi:20180809233343p:plain

失敗してるw

原因調査

まずはログを確認します。

f:id:tatsuyashi:20180809233926p:plain

Access Denied ??

そんなはずはない。
最初はCodeBuildのArtifactアップロード機能を使ってS3にアップロードできていたので権限はあるはず。
第一、CodeBuildが自動生成してくれたサービスロールを適用しているのです。

もっと調査

ログをもっと目を凝らして見てみます。

f:id:tatsuyashi:20180809234500p:plain

ん??

upload failed: _book/search_index.json to s3://S3_BUCKET/book/search_index.json

ん????

s3://S3_BUCKET/book/search_index.json

はっ!!

S3_BUCKETってなんやねんですw
何をs3://S3_BUCKETにアクセスしてんねんw

ここにはアクセスしたURLが表示されるので、変数ではなくて

s3://tatsuyashi-bucket/book/search_index.json

のように正しいバケットが設定されないといけないのに、変数名がそのまま出ています。

正解

buildspec.ymlの冒頭で宣言する変数を使用するためには「$」を付けなければいけないのでした。

- aws s3 cp --recursive _book/ s3://$S3_BUCKET/book/

これで早速ビルドしてみます。

f:id:tatsuyashi:20180809235118p:plain

成功しました。
S3にも正しくコピーできています。

まとめ

CodeBuild内の変数を使用する際は「$」を付ける、という教訓を得ました。

素人のようなミスですが、結構長い時間悩んで試行錯誤していましたw

ログのヒントから気付いたときはまるで探偵になったような気分でした。

「奮闘記」らしい内容だったと思います。

次回は、最終的にGitBookのビルドがどのように完成したかを書きたいと思います。