Amazon Elastic Container Service (Amazon ECS) でホストされているサービスのブルー/グリーンデプロイを実行したいと考えています。
簡単な説明
ブルー/グリーンデプロイメントを実行する手順を実行する前に、次のものが揃っていることを確認してください。
解決策
IAM サービスロールを作成する
Amazon ECS で AWS CodeDeploy のブルー/グリーンタイプをデプロイするには、ユーザーに代わって ECS サービスを更新するアクセス許可を CodeDeploy サービスが持っている必要があります。これらのアクセス許可を付与するには、次の手順を実行します。
- AWS Identity and Access Management (IAM) コンソールを開きます。
- ナビゲーションペインで [ロール] をクリックします。
- [ロールを作成] を選択します。
- [信頼されたエンティティの種類を選択] セクションで、[AWS サービス] を選択し、[CodeDeploy] を選択します。
- [ユースケースを選択] セクションで、[CodeDeploy - ECS] を選択し、[次へ] をクリックします。
注: デフォルトの AWSCodeDeployRoleForECS ポリシーをそのまま使用してください。このポリシーには、CodeDeploy が Amazon ECS やその他のサービスと正しく連携するために必要なアクセス許可が含まれています。
- [次へ] をクリックします。
- [ロール名] に ecsCodeDeployRole と入力します。
- (オプション) タグを追加します。
- [ロールを作成] を選択します。
Application Load Balancer を作成する
Application Load Balancer を作成するには、次の手順を実行します。
- Amazon EC2 コンソールを開きます。
- ナビゲーションペインの [負荷分散] セクションで、[ロードバランサー] を選択します。
- [ロードバランサーを作成] を選択します。
- [ロードバランサーの種類の選択] セクションの [Application Load Balancer] で、[作成] をクリックします。
- [名前] にロードバランサーの名前を入力します。
- [ネットワークマッピング] セクションで、Amazon ECS クラスターが作成された VPC を選択します。次に、インターネットにアクセスできる任意のサブネットを 2 つ選択します。
- [セキュリティグループ] セクションで、[新しいセキュリティグループの作成] ハイパーリンクをクリックします。
- [セキュリティグループ名] に、Sample Security-group と入力します。
- [ルールを追加] をクリックします。
- [ポート範囲] に 8080 と入力します[ソース] に 0.0.0.0/0 と入力します。
- [セキュリティグループの作成] をクリックします。
- [ロードバランサー] ページビューでセキュリティグループを更新し、新しく作成したセキュリティグループを選択します。
- [リスナーとルーティング] セクションで、[ターゲットグループの作成] ハイパーリンクをクリックします。
- [ターゲットタイプ] で [IP アドレス] を選択します。
- [ターゲットグループ] で、ターゲットグループの名前を入力します。
- [次へ] をクリックし、ターゲットグループを登録して IP を設定します。
- [ターゲットグループの作成] を選択します。
タスク定義を作成する
次の手順を実行します。
- Amazon ECS コンソールを開きます。
- ナビゲーションペインで、[タスク定義] をクリックします。
- [新しいタスク定義の作成] を選択します。
- [Fargate] を選択し、[次のステップ] をクリックします。
- タスク定義を設定し、[作成] をクリックします。
以下のタスク定義例では、AWS Fargate 起動タイプと Docker Hub から取得した NGINX イメージを使用しています。
注: この例と次の例では、account_ID の値を実際のアカウント番号に置き換えてください。
{
"executionRoleArn": "arn:aws:iam::account_ID:role/ecsTaskExecutionRole",
"containerDefinitions": [
{
"name": "sample-website",
"image": "nginx:latest",
"essential": true,
"portMappings": [
{
"hostPort": 80,
"protocol": "tcp",
"containerPort": 80
}
]
}
],
"requiresCompatibilities": [
"FARGATE"
],
"networkMode": "awsvpc",
"cpu": "256",
"memory": "512",
"family": "sample-website"
}
Amazon ECS サービスを作成する
次の手順を実行します。
- Amazon ECS コンソールを開きます。
- ナビゲーションペインの [Amazon ECS] セクションで、[クラスター] をクリックし、該当のクラスターを選択します。
- [サービス] タブで [作成] をクリックしてサービスを作成します。
- [環境] セクションで、[起動タイプ] を選択し、[FARGATE] を選択します。
- [タスク定義] で、前のセクションで作成したタスク定義を選択します。
- [サービス名] に、サービスの名前を入力します。例: Sample-Website
- [タスクの数] に、サービスが実行するタスクの数を入力します。
- [デプロイオプション] セクションで、[ブルー/グリーンデプロイ (AWS CodeDeploy を利用)] を選択します。
- [CodeDeploy のサービスロール] で、前の手順で作成した ecsCodeDeployRole サービスロールを選択します。
- [ネットワーキング] セクションで、クラスター VPC とサブネット、および前の手順で作成したセキュリティグループを選択します。
- [ロードバランシング] セクションの [ロードバランサーのタイプ] で、[Application Load Balancer] を選択します。
- [ロードバランサー名] で、前の手順で作成したロードバランサーを選択します。
- [リスナー] セクションの [プロダクションリスナーポート] で、[80:HTTP] を選択します。
- [テストリスナーを追加] チェックボックスをオンにします。
- [テストリスナーポート] で [新規作成] を選択し、リスナーポートとして 8080 と入力します。
- [ターゲットグループ] セクションの [ターゲットグループ 1 の名前] で、ロードバランサーを作成したときに作成したターゲットグループを選択します。
- [ターゲットグループ 2 の名前] で、Amazon ECS コンソールで sample-website-tg-2 という名前の新しいターゲットグループを作成します。
- [作成] をクリックします。
これで、作成した新しいサービスで 1 つのタスクが実行されていることを確認できます。
Amazon ECS ブルー/グリーンデプロイが正しく動作することを確認する
ブルー/グリーンの Amazon ECS サービスを作成したら、変更を加えた新しいタスク定義リビジョンを作成し、Amazon ECS サービスを更新します。このアクションにより、CodeDeploy コンソールにデプロイが作成されます。
次の手順を実行して、デプロイが正常に動作することを確認します。
-
Amazon ECS コンソールを開きます。
-
ナビゲーションペインから [タスク定義] を選択します。
-
タスク定義を選択し、[新しいリビジョンの作成] を選択し、[作成] をクリックします。
注: 次の例では、image プロパティが httpd:2.4 を使用するように更新されています。
{
"executionRoleArn": "arn:aws:iam::account_ID:role/ecsTaskExecutionRole",
"containerDefinitions": [
{
"name": "sample-website",
"image": "httpd:2.4",
"essential": true,
"portMappings": [
{
"hostPort": 80,
"protocol": "tcp",
"containerPort": 80
}
]
}
],
"requiresCompatibilities": [
"FARGATE"
],
"networkMode": "awsvpc",
"cpu": "256",
"memory": "512",
"family": "sample-website"
}
-
ナビゲーションペインから [クラスター] を選択し、Amazon ECS サービスをデプロイしたクラスターを選択します。
-
[サービス] タブで Amazon ECS サービスを選択し、[更新] をクリックします。
-
[デプロイ設定] セクションの [タスク定義] で、ステップ 3 で作成した最新リビジョンを選択します。
-
[更新] をクリックします。
-
[デプロイ] タブの [デプロイ ID] 列で、デプロイ ID を選択して CodeDeploy デプロイを表示します。