ここでは継続的なデプロイのための環境を構成してみます。
まず CodeBuild プロジェクトを作る前にまず hako 定義を用意しましょう。
レポジトリの hako/
の下にはすでに定義が用意されてるのでそれを使いましょう。
hako/tinypad-staging.jsonnet.example
を hako/<iam username>-staging.jsonnet
にリネームしてください。hako/tinypad-production.jsonnet.example
を hako/<iam username>-production.jsonnet
にリネームしてください。そして適切なコミットメッセージと一緒にコミットしてください。 レポジトリ側にプッシュするのも忘れずに。
定義の詳細に関してはファイルに書かれてるので必要なタイミングで読んでください。
さて、パイプラインは以下のような仕事をする必要があります。
各作業を 1 CodeBuild プロジェクトとして扱いましょう。 やることは独立しているし、その方が扱いやすいからです。
CodeBuild -> Build projects 画面で Create build project
をクリックします。
以下、必須の設定を書きます
<iam username>-test
<iam username>
作られたら試しに Start Build してみましょう。実行時に聞かれる設定はデフォルトのままで大丈夫です。 テストが通ったら成功です。
このファイルは CodeBuild 上でテスト環境を構成し、テストを実行します。 詳細は該当ファイルを読んでください。
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
のチェックを外してください。
ECR はすでに作成済みです。
気になる方は以下の URL にアクセスすると一覧から自分の iam username
で作られているのが確認できます。
https://ap-northeast-1.console.aws.amazon.com/ecr/repositories?region=ap-northeast-1
それではプロジェクトの Docker イメージをビルドし、レポジトリにプッシュする CodeBuild プロジェクトを作りましょう。
<iam username>-docker
<iam username>
<aws account id>.dkr.ecr.ap-northeast-1.amazonaws.com/<iam username>
こちらも試しに実行してみましょう。ビルドが成功し、 ECR レポジトリにイメージがプッシュされていれば大丈夫です。
このファイルは CodeBuild 上で docker build を実行し、 ECR にビルドしたイメージをプッシュするよう指示を出します。 詳細は該当ファイルを読んでください。
それではまた CodeBuild プロジェクトを作りましょう。これが最後です。
<iam username>-staging-deploy
<iam username>
<iam username>-staging.jsonnet
echo $ACCOUNT_ID
すれば確認できますMisc: 実は CodeDeploy というものがありますが、今回は Hako を利用しているので CodeBuild で充分です。
こちらも実行してみましょう。 デプロイが完了したら、次の命令を実行して hako アプリケーションに紐付いている ALB の DNSName を確認します。
aws elbv2 describe-load-balancers --region ap-northeast-1 --names hako-<iam username>-staging
確認ができたら正常にデプロイされているかアクセスしてみましょう。
このファイルは CodeBuild 上で staging 環境にデプロイをするように指示を出します。 詳細は該当ファイルを読んでください。
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 をクリックします。 以下のように埋めていきましょう
<iam username>-ci
<iam username>
<iam username>-test
出来上がったら Edit をクリックしてテストが終了したら Docker イメージを作り ECR にプッシュし、 staging 環境にデプロイするようにしましょう。 やることは今まで作った CodeBuild プロジェクトを順次実行するようにするだけです。
一番下の Add stage をクリックして、 Docker
, StagingDeploy
という stage を作ります。
そして、各 stage に対して Add action group をクリックし、実行したいプロジェクトを選択肢ましょう。
<iam username>-docker
<iam username>-staging-deploy
できたら保存します。警告が出ますが、今回は初期設定なので無視して進めて問題ありません。 そして実際実行するために、コードに適当な変更を入れてプッシュしてみましょう。 少し待つと pipeline が勝手に動き始めるのが観測できると思います。
パイプラインを作り終えたので、最後に本番を手元からデプロイしてましょう。 何の安全装置もなしに 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つ前のもの、というのがそもそも存在しないためです。