copilot pipelineで作ったCI が「COMMAND_EXECUTION_ERROR Message: Error while executing command: for workload in $WORKLOADS」で FAILする

これについて。

ここ最近 copilot cliが楽しくて、ドキュメント流し見してチュートリアル試して、手元のDockerイメージをデプロイして、、といった感じで遊んでいた。

aws.amazon.com

AWS App Runner がリリースされたことで、コンテナイメージデプロイがとーーーーーーっってもカジュアルにできるようになった。

で、App RunnerでもGithubへのpushをフックして自動デプロイなんてことはやってくれるのだけど、もうちょっと実戦での運用を考えたときに、CI/CDの環境があったほうが便利。copilot ならコマンド一発でそれができる。

copilot pipeline コマンドを叩くとCodePipelineによるCI/CD環境を作ってくれる。

さて、そこでお試しで作ったSinatraアプリケーションを copilot でパイプラインを作ってデプロイしようとした。

copilot pipeline init

このコマンドを実行すると、プロジェクトディレクトリ内に pipeline用のファイルが生成される。

$ tree
.
├── Dockerfile
├── Gemfile
├── Gemfile.lock
├── README.md
├── app.rb
├── copilot
│   ├── buildspec.yml     # これと
│   ├── pipeline.yml       # これ
│   └── sinatra-svc
│       └── manifest.yml
└── views
    └── index.erb

3 directories, 10 files

んで、その2つのファイルをGithubにpushして、

copilot pipeline update

とやると、CodeBuild/CodePipelineの環境が構築され、デプロイが走る。

はずなのだが。

自分で作ったDockerイメージだと、pipeline の途中で以下のようなエラーが出て FAILしてしまうのでした。

[Container] 2021/06/20 18:24:37 Phase complete: POST_BUILD State: FAILED
[Container] 2021/06/20 18:24:37 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: for workload in $WORKLOADS; do

問題となったDockerfileはこちら。

FROM ruby:3.0.0-alpine

WORKDIR /app

COPY Gemfile* .
COPY app.rb .
COPY views/ ./views
RUN bundle install1

EXPOSE 80

CMD ["bundle", "exec", "ruby", "app.rb"]

ローカルでは問題なくビルドできるし、App Runnerへのデプロイは成功しているのに何が原因なのか。。。?

copilotが自動で作ってくれる buildspec.yml にはコンテナイメージをビルドしてECRにpushする、という一連の流れがインラインで書かれているのだけど、その処理中にエラーが起きていたため、どの行でエラーになっているのが調べるのに時間がかかった。

f:id:jacoyutorius:20210622085005p:plain
ビルドログにはこんな感じで出力される

50行くらいのスクリプトにちまちま printfデバッグを仕掛けて(シェルスクリプトなんでechoですけど)やっと原因がわかった。

結局、ただの warningだと思ってスルーしていた Dockerfileの記述が原因だったらしい。

Step 3/8 : COPY Gemfile* .
When using COPY with more than one source file, the destination must be a directory and end with a /

COPYでファイルをコンテナイメージへコピーする際には、コピー先のディレクトリ名の末尾に / を付けてやる必要がある、と。 以下のように修正して無事デプロイできるようになったのでした。

github.com