GitHub ActionsからECRにコンテナをデプロイする #4  ECRにDockerイメージがPushされたことをトリガーにECRをデプロイする

Uncategorized

はじめに

この記事は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で操作でき簡単にパイプラインを作成できます。詳細は以下。

AWS CodePipeline(継続的デリバリーを使用したソフトウェアのリリース)| AWS
AWS CodePipeline は、コードチェンジがある度に、リリースプロセスの構築、テスト、デプロイの各フェーズを自動化します。

それでは開始していきます。

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のページに遷移し「今すぐ始める」をクリックする。

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

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

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

タスクの定義

次にタスクの定義を行います。

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

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

以下を入力し、作成をクリックする。

新しいタスクの定義の作成画面が出てきます。以下の画像に沿って入力してください。

入力箇所は以下です。

タスク定義の設定

項目名内容
タスク定義のファミリー任意の名前

コンテナ

項目名内容
名前任意の名前
イメージURIECRにアップロードしたイメージのURI
ポート名任意の名前

上記入力が完了したら、作成を押下します。

サービスの作成

次にサービスを追加していきます。ECS→クラスタ→上記で作成したクラスター→サービスを開き「作成」ボタンをクリックします。

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

ネットワーキングは、以下のように入力を行います。

項目名内容
VPC上記で作成したVPC
サブネット上記で作成したサブネット
セキュリティグループ上記で作成したセキュリティグループ

上記入力を完了後コンテナを見てみましょう。

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

CodePipelineを作成する

事前準備

設定ファイル用のS3を作成します。

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

CodePipelineを作成

次にCodePipelineを作成します。

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

今回はECS Fargateにデプロイするので以下のように選択します。

項目名
CategoryDeployment
TemplateECS 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のパイプラインを作成したので、拙い部分もあったかと思いますが、少しでもみなさんの力になれれば幸いです!

プロフィール

SIer勤めのエンジニア
アプリケーションエンジニアとして、WebやiOSなどのアプリ開発をメインにしてます

tomaをフォローする
Uncategorized