レック・テクノロジー・コンサルティング株式会社TECH BLOG

【コンテナ入門#4】AWS Codeサービスで実現!更新内容を自動でECSへ反映

はじめに

前回の【コンテナ入門#3】では、AWSのApplication Load Balancer(ALB)とECS(Fargate)を連携させて、Webアプリケーションを外部公開する流れを一通り行いました。

これまでは、ECRへのイメージ登録後に 手動でECSサービスを更新していましたが、今回はそれをさらに効率化するため、「リポジトリに push するだけで、自動的にビルド・デプロイが完了する」 Codeシリーズを利用したパイプラインの構築について解説していきます。

※前回までのALB・ECS構成をベースに自動化の仕組みを追加する形になるため、ALBやECSの設定については【コンテナ入門#3】以降を参照してください。

今回の記事で使用するサービスは以下の通りです。

サービス名

役割

CodeCommit ソースコードの管理。Gitリポジトリとしてコードを保存・共有。
CodeBuild DockerイメージのビルドとECRへのプッシュを自動化。
CodeDeploy ECSサービスへの新しいイメージの自動デプロイを管理。
CodePipeline ソース→ビルド→デプロイの一連の流れ(パイプライン)を自動化。

注意

本記事で使用している「AWS CodeCommit」は、2024年7月25日をもって新規利用の受付停止しています。

そのため、2024年7月25日以前からCodeCommitを利用していたアカウントでない場合は、本記事の手順をそのまま再現することはできません

新規でのご利用を検討されている方は、記事の内容は参考程度としてご覧いただき、今後の運用には代替のGitホスティングサービス(GitHubやBitbucketなど)の利用をご検討ください。

参考:AWS公式ドキュメント|How to migrate your AWS CodeCommit repository to another Git provider

作業を通して学べるポイント

  • CodeCommit リポジトリの作成と HTTPS 認証連携
  • CodeBuild による Docker イメージの自動ビルドと ECR への登録
  • CodeDeploy による ECS サービスの更新自動化
  • CodePipeline によるパイプライン全体の構築
  • 実際にコードを修正 → push → 自動でデプロイされる流れの体験

作業の流れ

これから行う作業は、大きく分けて以下のような流れで進めていきます。

  1. Code Commit
  2. CodeBuild
  3. CodeDeploy
  4. CodePipeline
  5. CodePipeline実行確認
  6. コードを更新してCodePipelineの自動実行

それでは、Code Commitの作成からはじめていきましょう。

手順

手順1:Code Commitの設定

1.1 Code Commit作成

AWS マネジメントコンソールから「CodeCommit」サービスにアクセスし、任意の名前でリポジトリを作成します。

4,code_1.png

4,code_2.png

1.2 ホストOS上でTera Term等を利用してCode Commit連携設定を行います

今回はIAMユーザーを利用したSSH接続ではなく、AWS IAM Identity Centerのアクセスポータルで得られる認証情報(アクセスキー等)を使用したHTTPS接続を行います。

【準備】

使用するアクセスキー情報は、AWS IAM Identity Center のアクセスポータル画面右上にある「鍵マーク」から確認できます。

この鍵のマークを押下し、「AWS_ACCESS_KEY_ID」と「AWS_SECRET_ACCESS_KEY」の続く文字列部分をメモして控えておきます。

4,code_3.png

1.3 Tera Term などのターミナルソフトを使って、Git をインストールし、バージョンを確認します。

[root@ip-10-0-1-70 ~]# yum install -y git
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core | 3.6 kB 00:00

Installed:
git.x86_64 0:2.47.1-1.amzn2.0.3

Dependency Installed:
git-core.x86_64 0:2.47.1-1.amzn2.0.3
git-core-doc.noarch 0:2.47.1-1.amzn2.0.3
perl-Error.noarch 1:0.17020-2.amzn2
perl-Git.noarch 0:2.47.1-1.amzn2.0.3
perl-TermReadKey.x86_64 0:2.30-20.amzn2.0.2

Complete!
[root@ip-10-0-1-70 ~]# git --version
git version 2.47.1

1.4 GitにCode Commitの認証ヘルパーを設定します。

[root@ip-10-0-1-70]# git config --global credential.helper '!aws codecommit credential-helper $@'
[root@ip-10-0-1-70]# git config --global credential.UseHttpPath true

1.5 CodeCommitリポジトリをクローンします。

[root@ip-10-0-1-70 training2025-user-codecommit]# https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/training2025-user-codecommit

1.6 Web アプリケーションのファイルを作成します。

Dockerfile を作成します。

[root@ip-10-0-1-70 training2025-user-codecommit]# vi Dockerfile

FROM amazonlinux:2

RUN yum install -y httpd

COPY ./index.html /var/www/html/index.html

EXPOSE 80

CMD ["/usr/sbin/httpd","-D","FOREGROUND"]

index.html を作成します。

[root@ip-10-0-1-70 training2025-user-codecommit]# vi index.html

username dockerfile codocommit

1.7 buildspec.yml を作成します。(CodeBuild のビルド定義)

[root@ip-10-0-1-70 training2025-user-codecommit]# vi buildspec.yml

version: 0.1

phases:

pre_build:

commands:

- echo Logging in to Amazon ECR...

- aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin https://$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com

build:

commands:

- echo Build started on `date`

- echo Building the Docker image...

- docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .

- docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG

post_build:

commands:

- echo Build completed on `date`

- echo Pushing the Docker image...

- docker push $IMAGE_REPO_NAME

artifacts:

files: imagedefinitions.json

1.8 appspec.yml を作成します。(CodeDeploy のデプロイ定義)

[root@ip-10-0-1-70 training2025-user-codecommit]# vi appspec.yml

version: 0.0

Resources:

- TargetService:

Type: AWS::ECS::Service

Properties:

TaskDefinition: "ECS タスク定義内の「JSON」の"taskDefinitionArn"文(下記画像を参照(画像1))"

LoadBalancerInfo:

ContainerName: "training2025-user-ecr"

ContainerPort: 80

PlatformVersion: "LATEST"

NetworkConfiguration:

AwsvpcConfiguration:

Subnets: ["事前に作成したサブネットID(2つ)"]

SecurityGroups: ["事前に作成したセキュリティグループID"]

AssignPublicIp: "ENABLED"

4,code_4.png

1.9 imagedefinitions.json を作成します。

[root@ip-10-0-1-70 training2021-username-codecommit]# vi imagedefinitions.json

[

{

"name": "training2025-user-ecr",

"imageUri": "ECR リポジトリのURI(下記画像を参照)"

}

]

4,code_5.png

1.10 Git にファイルをコミットしてプッシュします。

[root@ip-10-0-1-70 training2025-user-codecommit]# git config --global user.name "training2025-user"
[root@ip-10-0-1-70 training2025-user-codecommit]# git config --global user.email "training2025-user@example.com"

[root@ip-10-0-1-70 training2025-user-codecommit]# git add .
[root@ip-10-0-1-70 training2025-user-codecommit]# git commit -m "init commit"

[master a3baf5f] init commit
1 file changed, 5 insertions(+)
create mode 100644 imagedefinitions.json

[root@ip-10-0-1-70 training2025-user-codecommit]# git push origin master
Enumerating objects: 11, done.
Counting objects:Counting objects: 100% (11/11), done.
Compressing objects: 100% (9/9), done.
Writing objects:100% (11/11), 1.61 KiB | 1.61 MiB/s, done.
Total 11 (delta 3), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Validating objects: 0%remote: Validating objects: 100%
To https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/training2025-user-codecommit
* [new branch] master -> master

1.11 Code Commitにプッシュできたかを確認します。

AWS マネジメントコンソールから CodeCommitの作成したリポジトリを開きます。

4,code_6.png

画像のように作成したファイルが表示されていればプッシュ完了です。

手順2:CodeBuild作成

2.1 AWS マネジメントコンソールで「CodeBuild」にアクセスします。

2.2 左ペインから「ビルドプロジェクト」を選択し、「プロジェクトを作成する」をクリックします。

4,code_7.png

2.3 プロジェクトの作成

  • プロジェクト名:任意の名前を設定します。
  • ソースプロバイダ:AWS CodeCommit
  • リポジトリ:事前に CodeCommit で作成したリポジトリを選択します。

4,code_8.png

2.4 環境の設定

Docker イメージをビルドするために、以下のような環境設定を行いました。

  • オペレーティングシステム:Ubuntu
  • ランタイム:Standard
  • ビルドイメージ:aws/codebuild/standard:5.0
  • イメージのバージョン:aws/codebuild/standard:5.0-21.04.23
  • 特権付与:有効
    → Docker の中で Docker を動かす必要があるため、この設定を有効にします。
  • サービスロール:新しいサービスロール
    →後ほど権限を追加します。

4,code_9.png4,code_10.png

2.5 環境変数の設定

ビルド中に使う値は、以下のような環境変数として定義します。

  • AWS_DEFAULT_REGION:ap-northeast-1
  • AWS_ACCOUNT_ID:AWSアカウント番号
  • IMAGE_REPO_NAME:作成したECRリポジトリのURI
  • IMAGE_TAG:latest

4,code_11.png

2.6 ログの設定

  • ログの保存先:CloudWatch Logs を有効
  • グループ名:CodeBuildのプロジェクト名と同じ名前
  • ストリーム名:グループ名と同様に、CodeBuildのプロジェクト名と同じ名前

4,code_12.png

ここまで設定を行ったら、「ビルドプロジェクトを作成」するをクリックし、ビルドプロジェクトの完成です。

2.7 作成されたCodeBuildのロールに権限付与

2.7.1 AWS マネジメントコンソールで「IAM」にアクセスします。

2.7.2 左ペインの「ロール」から先ほど作成されたCodeBuildのロールを検索します。
4,code_13.png

2.7.3 「ロール名」をクリックし、「許可」から「許可ポリシー」内の「許可を追加」の「ポリシーをアタッチ」をクリックします。

4,code_14.png

2.7.4 「その他の許可ポリシー」内の「AdministratorAccess」を選択し、「許可を追加」をクリックします。

4,code_15.png4,code_16.png4,code_17.png

許可ポリシー内に「AdministratorAccess」が追加されていれば権限付与完了です。

2.8 ビルド実行

2.8.1 再度、AWS マネジメントコンソールで「CodeBuild」にアクセスし、先ほど作成したビルドプロジェクト名をクリックします。

2.8.2 画面上部の「ビルドを開始」をクリックすると、ビルドが実行されます。

4,code_18.png

2.8.3 「ビルドステータス」の「ステータス」が成功と表示されれば完了です。
※ビルドには2、3分ほど時間がかかる可能性があります。

4,code_19.png

2.8.4 AWS マネジメントコンソールで「ECR」にアクセスし、リポジトリ内の「イメージ」を確認します。新しくイメージがアップロードされていれば完了です。

4,code_20.png

手順3:CodeDeploy作成

今回は、ECS用のデプロイ先として使うために、AWSCodeDeployのアプリケーションを作成します。

3.1 AWS マネジメントコンソールで「CodeDeploy」にアクセスします。

3.2 左ペインの「アプリケーション」から「アプリケーションの作成」を選択します。

4,code_21.png

3.3 「アプリケーション名」を入力し、「コンピューティングプラットフォーム」は「Amazon ECS」を選択します。

全て入力できたら「アプリケーションの作成」をクリックして完了です。

4,code_22.png

手順4:CodePipeline作成

ここからは、ソースコードの更新から Docker イメージのビルド・ECR への登録・ECS への自動デプロイまでを自動化するために、AWS CodePipeline(コードパイプライン) を作成します。

4.1 AWS マネジメントコンソールで「CodePipeline」にアクセスします。

4.2 左ペインの「パイプライン」から「パイプラインを作成する」をクリックします。

4,code_23.png

4.3 「Step1 作成オプションを選択する」の「カスタムパイプラインを構築する」を選択し、「次に」をクリックします。

4,code_24.png

4.4 「Step2 パイプラインの設定を選択する」では以下の内容を設定します。

  • パイプライン名:任意の名前を設定します。
  • サービスロール:新しいサービスロールを選択し、ロール名は自動入力されたものを使います。
    →後ほど、このロールに権限付与を行います。

4,code_25.png

4.5 「Step3 ソースステージを追加する」では、以下の内容を設定します。

  • ソースプロバイダー:AWS CodeCommit
  • リポジトリ名:CodeCommitで作成したプロジェクト名を選択します。
  • ブランチ名:master

4,code_26.png

4.6 「Step4 ビルドステージを追加する」では、以下の内容を設定します。

  • プロバイダーを構築する:その他のビルドプロバイダー→AWS CodeBuild
  • プロジェクト名:CodeBuildで作成したプロジェクト名を選択します。

4,code_27.png

4.7 「Step5 テストステージを追加」は、今回利用しないため「テストステージをスキップ」をクリックします。

4.8 「Step6 デプロイステージを追加する」では、以下の内容を設定します。

  • デプロイプロバイダー:Amazon ECS
  • クラスター名:ECSで作成したプロジェクト名を選択します。
  • サービス名:ECSで作成したサービス名を選択します。

4,code_28.png

4.9 「Step7 レビュー」で設定確認を行い、間違いがないことを確認したら「パイプラインを作成する」をクリックし、設定完了です。

4,code_29.png4,code_30.png

4.10 権限の付与

「Step2 パイプラインの設定を選択する」で新しく作成したロールに権限を追加します。

AWS マネジメントコンソールで「IAM」にアクセスし、左ペインの「ロール」から先ほど作成されたCodePipelineのロールを検索します。

4,code_31.png

4.11 「ロール名」をクリックし、「許可」から「許可ポリシー」内の「許可を追加」の「ポリシーをアタッチ」をクリックします。

4,code_39(本当は32).png

4.12 「その他の許可ポリシー」内の「AdministratorAccess」を選択し、「許可を追加」をクリックします。

4,code_15.png4,code_16.png4,code_17.png

手順5:CodePipeline 実行確認

CodePipelineの設定・権限追加を行うと、最初の実行が自動で開始されます。
ここでは、CodePipelineの3つのステージに分かれて処理を行っていきます。

5.1 Source

CodeCommit 上のリポジトリからソースコードを取得します。
画像のような緑色のチェックマークが表示され、「すべてのアクションが成功しました」と記載されていれば成功です。

5.2 Build

事前に作成した CodeBuild プロジェクトが実行され、Docker イメージをビルドします。

成功すれば、イメージが ECR に push(アップロード) されます。ここでも、画像のような緑色のチェックマークが表示され、「すべてのアクションが成功しました」と記載されていれば成功です。

5.3 Deploy

CodeDeploy が起動し、ECS に新しい Docker イメージをデプロイします。
ここでも、画像のような緑色のチェックマークが表示され、「すべてのアクションが成功しました」と記載されていれば成功です。

4,code_35.png

この3つのステップのどれかが上手くいかない場合は、Buildなら CodeBuild のログに、DeployならCodeDeploy や ECS のログにエラーとして記載されています。

5.4 確認

上記のすべてのステージが正常に完了したら、ECSのサービス内の「デプロイ」を開き、「サービスデプロイ」のデプロイ履歴に新しく実行されたデプロイが表示されていることを確認します。

4,code_36.png

手順6:コードを更新してCodePipelineの自動実行

ホストOSにてコードを更新し、CodeCommitにコードをアップロードすることで
自動でcodepipelineが実行されコンテナが起動するような設定にします。

6.1 Tera Termなどのターミナルソフトを使って、HTMLファイル「index.html」を編集します。そして、編集した内容を確認します。

6.2 Gitコマンドを利用して変更したファイルをGitに追加し、変更をCodeCommitにコミット(保存)します。

6.3 CodeCommit にプッシュ(アップロード)します。

[root@ip-10-0-1-70 training2025-user-codecommit]# echo username dockerfile codepipeline > index.html
[root@ip-10-0-1-70 training2025-user-codecommit]# cat index.html
username dockerfile codepipeline

[root@ip-10-0-1-70 training2025-user-codecommit]# git add .
[root@ip-10-0-1-70 training2025-user-codecommit]# git commit -m "codepipeline"
[master 9374500] code pipeline
1 file changed, 1 insertion(+), 2 deletions(-)

[root@ip-10-0-1-70 training2025-user-codecommit]# git push origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5)Counting objects: 100% (5/5), done.
Compressing objects: 00% (2/2)Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3)Writing objects: 100% (3/3), 292 bytes | 292.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Validating objects: 0%remote: Validating objects: 100%
To https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/training2025-user-codecommit
a3baf5f..9374500 master -> master

6.4 自動でcodepipeline(Source・Build・Deploy)が全て実行されるため、画像のような緑色のチェックマークが表示され、「すべてのアクションが成功しました」と記載されていれば成功です。

4,code_37.png

6.5 AWS マネジメントコンソールで「ECS」にアクセスし、作成したECSクラスター名をクリックし、「サービス」内の「Deployments and tasks」にタスクが追加されていることを確認します。

4,code_40.png

6.6 AWS マネジメントコンソールで「EC2」にアクセスし、左ペインの「ロードバランサー」をクリックし、作成済みの ALB を選択して DNS 名をコピーし、自分の PC のブラウザからアクセスできるか確認します。

4,code_38.png

最後に

今回は、CodeCommit への push をきっかけに、Docker イメージのビルドから ECS へのデプロイまでを自動化するパイプラインを構築しました。
これにより、「コードを更新 → push → 自動反映」という効率的な開発フローが実現できます。

この記事で全4回にわたる【コンテナ入門】シリーズは完結です。

Dockerの基本から始まり、ECSへの公開、パイプラインまでコンテナについて一通りの流れを体験できました。
本シリーズを通じて全体の流れを理解することで、今後の業務でもコンテナ技術をスムーズに活用できる基盤が整ったのではないかと思います。

今後の業務において、少しでも参考になれば幸いです。

この記事をシェアする

  • Facebook
  • X
  • Pocket
  • Line
  • Hatena
  • Linkedin

資料請求・お問い合わせはこちら

ページトップへ戻る