Nuxt.js + AWS ECS Fargate その3(CI/CD環境作成)

f:id:jotaki:20210321165648p:plain

前回に続いてAWSのCodePipelineを使用してCI/CD環境を作成しようと思います。

アプリケーションコードのリポジトリGitHubを使用しているので、GitHub Actionsでもできるようですが、そちらは一度触ったことがありAWSサービスの理解を深めたいので今回はAWSサービスを使用してみます。

ECS → CodeDeploy だけでECRリポジトリにプッシュされた際にデプロイ実行をできますが、CodePipeline を使って少し実戦的にやってみました。

参考にしたのは下記の記事などです。

パイプラインを作成

ECS > クラスター > 該当のサービスを選択 > 「デプロイメント」タブ > パイプラインを作成

# Step1 パイプラインの設定を選択する
パイプライン名: nuxt-fargate-pipeline
サービスロール: 新しいサービスロール
ロール名: AWSCodePipelineServiceRole-ap-northeast-1-nuxt-fargate-pipeline

# Step2 ソースステージを追加する
ソースプロバイダー: GitHub(バージョン2)
接続 → 接続名: 任意のもの
リポジトリ: 該当リポジトリ
ブランチ名: master
ソースコードの変更時にパイプラインを開始する: チェック

# Step3 ビルドステージを追加する
プロバイダーを構築する: AWS CodeBuild
リージョン: アジアパシフィック(東京)

## ビルドプロジェクト
プロジェクト名: nuxt-fargate-build
オペレーティングシステム: Amazon Linux
ランタイム: Standard
イメージ: 最新のもの
イメージのバージョン: 最新のもの
環境タイプ: Linux
Docker権限付与: チェック
サービスロール: 新しいサービスロール
ロール名: codebuild-nuxt-fargate-build-service-role

## 環境変数
AWS_ACCOUNT_ID: <アカウントID>
AWS_DEFAULT_REGION: ap-northeast-1
REPOSITORY_NAME: nuxt-fargate_app
REPOSITORY_URI: 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
IMAGE_TAG: latest

# Step4 デプロイステージを追加する
デプロイプロバイダー: Amazon ECS(ブルー/グリーン)
リージョン: アジアパシフィック(東京)
入力アーティファクト: BuildArtifact
AWS CodeDeploy アプリケーション名: nuxt-fargate-deploy
AWS CodeDeploy デプロイグループ: nuxt-fargate-deploy-group
Amazon ECS タスク定義: BuildArtifact
AWS CodeDeploy AppSpec ファイル: BuildArtifact
入力アーティファクトを持つイメージの詳細: BuildArtifact
タスク定義のプレースホルダー文字: IMAGE1_NAME

サービスロールの設定

ECRにアクセスできるようにCodeBuildのサービスロールを設定する。

CodeBuild > ビルドプロジェクト > 該当のプロジェクト > 「ビルドの詳細」タブ > 環境 > サービスロール
のARNをクリックし、 AmazonEC2ContainerRegistryPowerUser ポリシーをアタッチする。

参考: 【備忘録】CodeBuildでaws ecr get-loginコマンド実行時にエラーが発生する - Qiita

設定ファイルの準備

GitHub

  • buildspec.yml: ビルド設定ファイル
  • appspec.yaml: ECSサービスに含めるタスク定義の設定ファイル
  • task-definition.json: デプロイするタスク定義の設定ファイル

ビルドしてみて、エラー参考にググってみたいにしてなんとかビルド成功しました。
雰囲気はGitHub ActionsやNetlifyと同じですが、コンソール内の権限周りが悪いのか、コードの記述が分からなくてハマってしまいました。
10回もしないうちにDockerのRate Limitに引っかかったので、下記の対策を行うなどを推奨します。

参考: Docker Hub の Rate Limitに引っかかったのでdocker loginで対策した - fu3ak1's tech days

確認

以上の手順でパイプライン作成。
masterにプッシュしたら、ECRリポジトリにプッシュされ、ビルドしたイメージがALBにデプロイされる。
次回はこれまでのまとめを兼ねて構成図等で振り返りをして終わりにしようと思います。