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へコピーするだけと思って楽観視していたのですが、、
失敗してるw
原因調査
まずはログを確認します。
Access Denied ??
そんなはずはない。
最初はCodeBuildのArtifactアップロード機能を使ってS3にアップロードできていたので権限はあるはず。
第一、CodeBuildが自動生成してくれたサービスロールを適用しているのです。
もっと調査
ログをもっと目を凝らして見てみます。
ん??
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/
これで早速ビルドしてみます。
成功しました。
S3にも正しくコピーできています。
まとめ
CodeBuild内の変数を使用する際は「$」を付ける、という教訓を得ました。
素人のようなミスですが、結構長い時間悩んで試行錯誤していましたw
ログのヒントから気付いたときはまるで探偵になったような気分でした。
「奮闘記」らしい内容だったと思います。
次回は、最終的にGitBookのビルドがどのように完成したかを書きたいと思います。