Nuxt.js + AWS ECS Fargate その3(CI/CD環境作成)
前回に続いてAWSのCodePipelineを使用してCI/CD環境を作成しようと思います。
アプリケーションコードのリポジトリはGitHubを使用しているので、GitHub Actionsでもできるようですが、そちらは一度触ったことがありAWSサービスの理解を深めたいので今回はAWSサービスを使用してみます。
ECS → CodeDeploy だけでECRリポジトリにプッシュされた際にデプロイ実行をできますが、CodePipeline を使って少し実戦的にやってみました。
参考にしたのは下記の記事などです。
- AWS CodePipelineを使用してgit pushでAmazon ECSをデプロイする | SEEDS Creators' Blog | 株式会社シーズ
- Aws Code PipelineでReactjs/Nextのデプロイを自動化!ECSへ展開してみました | Ragate ブログ
- ECSのCI/CD環境をCodePipelineに変えた話 | 株式会社CAM
- 【AWS】GithubからCodePipelineでECS/Fargateにデプロイする方法 - Qiita
- 【備忘録】AWS ECS Blue / Green Deploy 実現のために学んだこと - Qiita
- AWS_CICD_ECS_Handson.pdf
パイプラインを作成
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
設定ファイルの準備
- 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にデプロイされる。
次回はこれまでのまとめを兼ねて構成図等で振り返りをして終わりにしようと思います。