はじめに
この記事はGitHub ActionsからECRにコンテナをデプロイする #3の続きとなります。
前回は以下からどうぞ
概要
前回ECRにDockerイメージをPushできる状態で終了しました。次にそのPushをトリガーにECSにコンテナをデプロイします。

具体的に作成するのは、以下に2、3の処理になります
1.DockerイメージをECRにPush
2.Pushをトリガーに、コードパイプラインを起動
3.コードパイプラインでECSにデプロイ
コードパイプラインとは、正式名称をAWS CodePipelineといいます。AWSのCI/CDを行うためのサービスです。GUIで操作でき簡単にパイプラインを作成できます。詳細は以下。

それでは開始していきます。
ECSを構築する
今回は例として、FargateタイプのECSを構築していきます。まず事前準備として、ECSを構築します。
VPCを作成する
まずはVPCにアクセスします。VPCをクリックします。

VPCなどを選択し、以下のような構成として作成します。VPCの名前は任意の名前を付けてください。
ECSを利用するためだけの簡易的なVPCになります。

セキュリティグループの作成
次にセキュリティグループを作成します。
EC2を開きセキュリティグループ→セキュリティグループを作成をクリックする。

以下のようにセキュリティグループを作成します。
基本的な詳細
項目名 | 内容 |
セキュリティグループ名 | 任意の名前 |
説明 | セキュリティグループの説明 |
VPC | 上記で作成したVPC |
インバウンドルール
項目名 | 内容 |
タイプ | HTTP |
ソース | Anywhere-IPv4 |
0.0.0.0/0 |

入力が完了したらセキュリティグループの作成をクリックし完了です。
ECSの作成
クラスターの作成
次にECSの作成を行っていきます。まずはクラスターの作成を行います。
ECSのページに遷移し「今すぐ始める」をクリックする。

次に「クラスターの作成」をクリックします。

クラスターの作成画面がでてくるので、「クラスター名」と「デフォルトの名前空間」を任意の名前で付けます。

以下のように、クラスターが作成されれば完成です。

タスクの定義
次にタスクの定義を行います。
タスクの定義を選択し、新しいタスクの定義の作成を押下します。

新しいタスクの定義の作成をクリックする。

以下を入力し、作成をクリックする。
新しいタスクの定義の作成画面が出てきます。以下の画像に沿って入力してください。
入力箇所は以下です。
タスク定義の設定
項目名 | 内容 |
タスク定義のファミリー | 任意の名前 |

コンテナ
項目名 | 内容 |
名前 | 任意の名前 |
イメージURI | ECRにアップロードしたイメージのURI |
ポート名 | 任意の名前 |

上記入力が完了したら、作成を押下します。
サービスの作成
次にサービスを追加していきます。ECS→クラスタ→上記で作成したクラスター→サービスを開き「作成」ボタンをクリックします。

以下のように入力していきます。タスク定義ファミリーの名前は任意の名前でOKです。

ネットワーキングは、以下のように入力を行います。
項目名 | 内容 |
VPC | 上記で作成したVPC |
サブネット | 上記で作成したサブネット |
セキュリティグループ | 上記で作成したセキュリティグループ |

上記入力を完了後コンテナを見てみましょう。
ECS→クラスター→作成したクラスター名→サービス→作成したサービス名→タスクで作成したタスクを開き、起動しているコンテナのパブリックipにアクセスします。ビルドしたイメージが表示されればECSの設定は完了です。

CodePipelineを作成する
事前準備
設定ファイル用のS3を作成します。

バケット名を任意のバケット名にします。後はデフォルトのままで大丈夫です。入力完了したら、「バケットを作成」をクリックします。

CodePipelineを作成
次にCodePipelineを作成します。
まずCodepiplineを開きます。「パイプラインを作成」を押下します。

今回はECS Fargateにデプロイするので以下のように選択します。
項目名 | 値 |
Category | Deployment |
Template | ECS Fargateにデプロイ |
選択完了後「次に」をクリックします。

Chose source画面となるので以下のように入力します
項目名 | 値 |
ソースプロバイダー | Amazon ECR |
リポジトリ名 | 前回作成したECRのリポジトリ名 |
画像タグ | latest |
上記を入力したら「次に」をクリック

Configure templateはそのままでOK。何も変更せず「Create pipline from template」をクリックする。

以下のような画面にいきます。ここからパイプラインに手を加えていきます。
まずは「編集」をクリックします。

「Build」の「ステージを編集する」をクリックします。

「削除する」をクリックしてBuildを削除します。

次に「Source」の「ステージを編集する」をクリックします。

「+アクションの追加」をクリックします。

アクションは、以下のように追加してください。以下入力後完了をクリック
項目 | 値 |
アクション名 | 任意の名前 |
アクションプロバイダー | Amazon S3 |
バケット | 上記で作成したバケット |
S3オブジェクトキー | imagedifinitions.json.zip |
検索オプションを変更する | Amazon CloudWatch Events |
出力アーティファクト | S3OutArtifact |

次に「Deploy」を編集します。「ステージを編集する」をクリック。

現在ある項目を削除します。

「アクショングループを追加する」をクリック

アクションションを編集する画面で以下のように入力してください。入力後完了をクリック。
項目名 | 値 |
アクション名 | 任意の名前 |
アクションプロバイダ | Amazon ECS |
リージョン | 自身が作成しているリージョン |
入力アーティファクト | S3OutArtifact |
クラスター名 | 上記で作成したクラスター名 |
サービス名 | 上記で作成したサービス名 |

最後に1番上にある「保存」をクリックしてください。これでパイプラインの設定は完了です。

ECRとECSの設定ファイルを作成する
次に設定ファイルを作成し、S3に格納します。
はじめに、「imagedefinitions.json」という名前でファイルを作成します。内容は以下のように入れてください。
imagedefinitions.json
項目名 | 値 |
name | 上記で作成したECSのコンテナ名 |
imageUri | 前回作成したECRのlatestのURI |
[
{
"name":"コンテナ名",
"imageUri":"ECRのリポジトリ内のImage URI"
}
]
ファイルを作成後上記をzipにします。ファイル名を「imagedefinitions.json.zip」に変更してください。
その後上記で作成した、S3にimagedefinitions.json.zipを格納します。

さらに格納したS3のプロパティに移行し、バージョニングを有効にします。

権限を追加する
次に、CodepiplineからS3やECSにアクセスするために権限を付与します。
まずはCodepiplineを開き、作成したパイプライン→設定を開き、サービスロールARNをクリックしてください

IAMに遷移するので以下のような、権限を付与します。実際に利用する場合は、必要な権限のみ付与してください。

実行する
ここまで実施できたら最後にきちんと動くか確認します。
適当に変更を入れてコミット、プッシュします。

codepiplineを開きパイプラインが成功していることを確認します。

その後ECSを開きデプロイされているコンテナを開きましょう。

変更が加わった画面が出れば成功です。

最後に
最後まで読んでいただきありがとございました。
自分でも初めてCICDのパイプラインを作成したので、拙い部分もあったかと思いますが、少しでもみなさんの力になれれば幸いです!