[アドカレ2025] CodePipelineを使ってGitHubからECSにDockerfileをデプロイしよう!

はじめに

メリークリスマス16日前からこんにちはディーネットのタナミです。

最近「CI/CD」と言う言葉をよく聞くようになりました。
「継続的インテグレーション/継続的デリバリー」の略らしいのですが具体的なイメージが掴みづらい...

ので、習うより慣れよの精神でAWSサービスのCI/CDの柱であるCodePipelineを使ってGitHubからECSにDockerfileをデプロイしてみます。

構成について

今回作成するCodePipelineの中身です。

具体的にはGitHub上のDockerfileをCodeBuildでビルド、ECRリポジトリにビルドデータを保管しECSでデプロイする流れになります。

IAMロールを作成しよう

まずは、それぞれのリソースが他のAWSサービスにアクセス出来るようにIAMロールの作成を行います。

GitHubアクセス用のIAMポリシー

最初にGitHubアクセス用のポリシーを作成します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "codestar-connections:*"
            ],
            "Resource": "*"
        }
    ]
}

CodeBuild用のIAMロール

では、CodeBuild用のIAMロールを作成しましょう。
下記のようなポリシーをアタッチします。

AmazonEC2ContainerRegistryPowerUser
AmazonS3FullAccess
AWSCodeBuildDeveloperAccess
CloudWatchLogsFullAccess
先ほど作成したGitHub用のポリシー

CodePipeline用のIAMロール

次に、CodePipeline用のIAMロールを作成しましょう。
下記のようなポリシーをアタッチします。

AmazonECS_FullAccess
AmazonS3FullAccess
AWSCodeBuildDeveloperAccess
先ほど作成したGitHub用のポリシー

ECSタスク用のロール

最後にECSタスク用のIAMロールを作成します。
下記のようなポリシーをアタッチします。

AmazonSSMFullAccess

GitHubとAWSを連携しよう

次に、GitHubとAWSの連携を行います。
ディベロッパーツールの「接続」から「接続を作成」を選択します。

プロバイダーで「GitHub」を選択し「GitHubに接続する」をクリックし、自身のGitHubアカウントにログインしましょう。

「新しいアプリをインストールする」をクリックし対象となるGitHubリポジトリを選択します。

ECRリポジトリを作成しよう

無事GitHubとAWSの連携ができたので次に、ECRリポジトリの作成を行います。

ECRの「Repositories」から「リポジトリの作成」を選択し、下記のような設定でECRリポジトリを作成します。

CodeBuildを作成しよう

ではGitHub上のDockerfileのビルドを行うCodeBuildを作成しましょう。
CodeBuildの「ビルドプロジェクト」から「プロジェクトを作成する」を選択し、下記のように設定します。

プロジェクトタイプ:ランナープロジェクト
ランナープロバイダー:GitHub
認証情報の「アカウントを認証情報管理します」から、先ほど作成した接続情報を選択
ランナーの場所:リポジトリ
リポジトリ:自身のGitHubリポジトリURL

※ウェブフックやイベントタイプはCodePipelineで設定するので無視

プロビジョニングモデル:オンデマンド
環境イメージ:マネジード型イメージ
コンピューティング:EC2
実行モード:コンテナ
オペレーティングシステム:Ubuntu
ランタイム:Standard
イメージ:aws/codebuild/standard:7.0
イメージのバージョン:最新のバージョン
サービスロール:先ほど作成したCodeBuild用のロールを選択

追加設定 ※変更分のみ
特権付与
Docker イメージを構築するか...:オン

環境変数 ※全てプレーンテキスト
AWS_ACCOUNT_ID、自身のAWSアカウントID
IMAGE_REPO_NAME、自身のECRリポジトリ名
CONTAINER_NAME、自身のコンテナ名
AWS_DEFAULT_REGION、ap-northeast-1

Buildspec
INSTALL、PRE_BUILD、POST_BUILD フェーズで buildspec コマンドを実行:オン
buildspecファイルを使用する
Buildspec 名:buildspec.yml

それ以降はオプションなので設定変更せず

CodeBuildの実行をテストしよう

これでCodeBuildの設定は完了したので、試しに実行して見ましょう
作成したCodeBuildから「ビルドを開始」を選択することでビルドが開始されます。

作成後はステータスが成功になっていることと、ECRリポジトリにビルドしたイメージが保存されていることを確認しましょう

ECSクラスターを作成しよう

次に、作成したビルドデータをデプロイするECSクラスターを作成します。
ECSの「クラスター」から「クラスターの作成」を選択し、下記のように設定します。

インフラストラクチャ:Fargate のみ
Container Insights :オフ
ECS Exec のログ記録:デフォルト

タスク定義を作成しよう

ECSクラスターが作成出来ても終わりではありません

ECSにはコンテナアプリの設計図となるタスク定義が必要となります。
「タスク定義」から「新しいタスク定義を作成」を選択し、下記のように設定します。

起動タイプ:AWS Fargate
オペレーティングシステム:Linux/X86_64
CPU:1vCPU
メモリ:3GB
タスクロール:作成したタスクロールを選択 ※コンテナ内に入るためには必須
タスク実行ロール:ecsTaskExcutionRole

コンテナ - 1 
コンテナの名前:自身で設定
イメージURI:先ほど作成したECRリポジトリを選択し、イメージタグからlatestを選択
コンテナポート:80、TCP、HTTP

それ以降はオプションなので設定変更せず

ECSサービスを作成しよう

タスク定義を作成出来たので、そのタスク定義をどの様に実行するかを決めるECSサービスを作成します。
先ほど作成したECSクラスターの「サービス」タブから下記のような設定で作成します。

タスク定義ファミリー:先ほど作成したECSタスクを選択

環境
起動タイプ:FARGATE
プラットフォームバージョン:LATEST
ECS Exec をオンにする:オン ※コンテナ内に入るためには必須

デプロイ設定
スケジューリング戦略:レプリカ
必要なタスク:1

ネットワーキング
VPC:任意のVPCを選択
サブネット:任意のサブネットを選択
セキュリティグループ:80番ポートにアクセスできるもの

それ以降はオプションなので設定変更せず

CodePipelineを作成しよう

CodeBuildとECSは作成出来たので、CI/CDの要であるCodePipelineを作成していきましょう。
CodePipelineから「パイプラインを作成する」を選択し、下記のように設定します。

作成オプションを選択する:カスタムパイプラインを構築する

パイプラインの設定
実行モード:キュー
サービスロール:先ほど作成したCodePipeline用のロールを選択

ソース
ソースプロバイダー:GitHubアプリ経由
接続:先ほど作成したGitHub用の接続情報を選択
リポジトリ名:自身のリポジトリ名
デフォルトブランチ:自身のブランチ名
出力アーティファクト形式:完全クローン
ウェブフック:オフ

構築する
その他のビルドプロバイダー:CodeBuild
プロジェクト名:先ほど作成したCodeBuildを選択
ビルドタイプ:単一ビルド
リージョン:東京
入力アーティファクト:SourceArtifact

テスト ※この項目はスキップでOK

デプロイ
デプロイプロバイダー:AmazonECS
入力アーティファクト:BuildArtifact
クラスター名:先ほど作成したECSクラスター
サービス名:先ほど作成したECSサービス

GitHubからpushしよう

Code Pipelineが作成出来たので早速GitHubからテストしてみましょう!
下記のようにGitHubで適当なファイルを追加しpushしてみると...

# 適当なテストファイルを作成
echo "aaa" > test.txt
# すべてのファイルをステージング
git add .
# コミット
git commit -m "Add test file for pipeline trigger"
# プッシュ
git push origin main

無事CodePipelineが実行されました。
下図のように実行が成功されるとECSにDockerfileがデプロイされます!

作成されたコンテナにはECSクラスターの「タスク」タブにある「ネットワークバインド」のIPから接続出来ます。

おまけ

作成されたコンテナにはCloudShellで下記のコマンドを入力するとコンテナ内に入れるようになります。

aws ecs execute-command \
    --cluster ECSクラスタ名 \
    --task ECSタスクのARN名 \
    --container コンテナ名 \
    --interactive \
    --command "/bin/bash"

まとめ

いかがでしょうか。
今回でCI/CDやCodePipelineがどのようなものであるか体感出来たら幸いです。
変更したものを直ぐに実行、テスト出来るのは非常に便利だと感じました!

それでは、自分はピザのデリバリーでも取ってクリスマスを迎えるとします!

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA