cookpad-internship-2020-summer-web

Let’s ci

ここでは継続的なデプロイのための環境を構成してみます。

ゴール

入る前に

まず CodeBuild プロジェクトを作る前にまず hako 定義を用意しましょう。 レポジトリの hako/ の下にはすでに定義が用意されてるのでそれを使いましょう。

そして適切なコミットメッセージと一緒にコミットしてください。 レポジトリ側にプッシュするのも忘れずに。

定義の詳細に関してはファイルに書かれてるので必要なタイミングで読んでください。

パイプラインの作成

さて、パイプラインは以下のような仕事をする必要があります。

各作業を 1 CodeBuild プロジェクトとして扱いましょう。 やることは独立しているし、その方が扱いやすいからです。

テスト用プロジェクトを作る

CodeBuild -> Build projects 画面で Create build project をクリックします。 以下、必須の設定を書きます

作られたら試しに Start Build してみましょう。実行時に聞かれる設定はデフォルトのままで大丈夫です。 テストが通ったら成功です。

buildspec.rspec.yml

このファイルは CodeBuild 上でテスト環境を構成し、テストを実行します。 詳細は該当ファイルを読んでください。

Troubleshooting

User: arn:aws:iam::xxxxx:user/riseshia is not authorized to perform: iam:DeletePolicyVersion on resource: policy CodeBuildBasePolicy-riseshia-docker-ap-northeast-1

設定を変更したいけどこのように権限がないと出てくる場合があります。 この場合は Allow AWS CodeBuild to modify this service role so it can be used with this build project のチェックを外してください。

Docker build 用プロジェクトを作る

ECR はすでに作成済みです。 気になる方は以下の URL にアクセスすると一覧から自分の iam username で作られているのが確認できます。 https://ap-northeast-1.console.aws.amazon.com/ecr/repositories?region=ap-northeast-1

それではプロジェクトの Docker イメージをビルドし、レポジトリにプッシュする CodeBuild プロジェクトを作りましょう。

こちらも試しに実行してみましょう。ビルドが成功し、 ECR レポジトリにイメージがプッシュされていれば大丈夫です。

buildspec.docker.yml

このファイルは CodeBuild 上で docker build を実行し、 ECR にビルドしたイメージをプッシュするよう指示を出します。 詳細は該当ファイルを読んでください。

Staging デプロイプロジェクトを作る

CodeBuild のプロジェクトを作る

それではまた CodeBuild プロジェクトを作りましょう。これが最後です。

Misc: 実は CodeDeploy というものがありますが、今回は Hako を利用しているので CodeBuild で充分です。

こちらも実行してみましょう。 デプロイが完了したら、次の命令を実行して hako アプリケーションに紐付いている ALB の DNSName を確認します。

aws elbv2 describe-load-balancers --region ap-northeast-1 --names hako-<iam username>-staging

確認ができたら正常にデプロイされているかアクセスしてみましょう。

buildspec.staging-deploy.yml

このファイルは CodeBuild 上で staging 環境にデプロイをするように指示を出します。 詳細は該当ファイルを読んでください。

Troubleshooting

app has stopped without exit_code: reason=CannotPullContainerError: Error response from daemon: manifest for xxxx.dkr.ecr.ap-northeast-1.amazonaws.com/riseshia:xxxx not found

現在組み込まれてるスクリプトはレポジトリの HEAD revision をタグ名として使うようになっているので、 該当リビジョンの Docker イメージがまだ作られてないということになります。 Docker build & push するプロジェクトのビルドを実行して最新リビジョンのイメージを作り再度実行しましょう。

パイプラインを作成してみよう!

Pipeline コンソールから Create pipeline をクリックします。 以下のように埋めていきましょう

出来上がったら Edit をクリックしてテストが終了したら Docker イメージを作り ECR にプッシュし、 staging 環境にデプロイするようにしましょう。 やることは今まで作った CodeBuild プロジェクトを順次実行するようにするだけです。

一番下の Add stage をクリックして、 Docker, StagingDeploy という stage を作ります。 そして、各 stage に対して Add action group をクリックし、実行したいプロジェクトを選択肢ましょう。

できたら保存します。警告が出ますが、今回は初期設定なので無視して進めて問題ありません。 そして実際実行するために、コードに適当な変更を入れてプッシュしてみましょう。 少し待つと pipeline が勝手に動き始めるのが観測できると思います。

production デプロイ

パイプラインを作り終えたので、最後に本番を手元からデプロイしてましょう。 何の安全装置もなしに production 環境へのデプロイを自動化するのは危険なので今回は staging を確認してから手ですることにします。

作業インスタンスのプロジェクトディレクトリに移動して次を打ちます。

scripts/hako-deploy.sh <iam username>-production.jsonnet

これで production 環境のアプリケーションがデプロイされます。 staging 環境と同様に、次の命令を実行して hako アプリケーションに紐付いている ALB の DNSName を確認します。

aws elbv2 describe-load-balancers --region ap-northeast-1 --names hako-<iam username>-production

ロールバックは以下のコマンドでできますので必要なら利用してください。

scripts/hako-rollback.sh <iam username>-production.jsonnet

ちなみにデプロイを 1回しかやってない状態だと、ロールバックができません。 hako のロールバックは 1つ前の Task definition を使うようにするのですが、 デプロイを1回しかしたことがない場合、持っている Task definition が一つしかないだめ、 1つ前のもの、というのがそもそも存在しないためです。