これは AWS CDK v2 開発者ガイドです。旧版の CDK v1 は 2022 年 6 月 1 日にメンテナンスを開始し、2023 年 6 月 1 日にサポートを終了しました。
例: AWS CDK を使用して AWS Fargate サービスを作成する
この例では、Amazon ECR 上のイメージからインターネット向け Application Load Balancer をフロントに配置した Amazon Elastic Container Service (Amazon ECS) クラスター上で実行する AWS Fargate サービスの作成方法を示します。
Amazon ECS は、クラスターで Docker コンテナを簡単に実行、停止、管理できる非常にスケーラブルで高速なコンテナ管理サービスです。Amazon ECS が管理するサーバーレスインフラストラクチャにクラスターをホストするには、Fargate 起動タイプを使用してサービスまたはタスクを起動します。また、Amazon EC2 起動タイプを使用して、現在管理している Amazon Elastic Compute Cloud (Amazon EC2) インスタンスのクラスターにタスクをホストすることで、さらに強力な統制力を得ることができます。
この例では、Fargate 起動タイプを使用していくつかのサービスを起動します。AWS マネジメントコンソールを使用して Fargate サービスを作成したことがある場合、その作業を終えるまでには多くの手順があることはご存じでしょう。AWS には、Fargate サービスの作成を順を追って説明する、以下のようなチュートリアルやドキュメントのトピックがいくつか用意されています。
この例では、AWS CDK を使用して同様の Fargate サービスを作成します。
この例で使用されている Amazon ECS コンストラクトは、以下の利点を提供することで AWS サービスの利用を支援します。
-
ロードバランサーを自動的に設定します。
-
ロードバランサー用のセキュリティグループを自動的に開きます。これにより、ロードバランサーは、セキュリティグループを明示的に作成しなくてもインスタンスと通信できるようになります。
-
ターゲットグループにアタッチされているサービスとロードバランサー間の依存関係を自動的に順序付けます。この場合、AWS CDK は、インスタンスの作成より先にリスナーを作成するという正しい順序を強制します。
-
自動的にスケールするグループのユーザーデータを自動的に設定します。これにより、クラスターを AMI に関連付けるための正しい設定が作成されます。
-
パラメータの組み合わせを早期に検証します。これにより AWS CloudFormation の問題が早期に発見され、デプロイ時間を短縮できます。例えば、作業によっては、メモリ設定の不適切な設定は容易に起こりえます。以前は、アプリをデプロイするまでエラーを発見できませんでした。しかし今では、アプリの合成時に AWS CDK が設定ミスを検出してエラーを出力できるようになりました。
-
Amazon ECR からのイメージを使用する場合、Amazon Elastic Container Registry (Amazon ECR) のアクセス許可を自動的に追加します。
-
自動的にスケールします。AWS CDK には、Amazon EC2 クラスターを使用する際にインスタンスを自動スケーリングするための メソッドが用意されています。Fargate クラスターでインスタンスを使用する場合、これは自動的に行われます。
さらに、AWS CDK は、自動スケーリングがインスタンスを停止しようとしても、そのインスタンスでタスクが実行中または予定されている場合、インスタンスが削除されないようにします。
以前は、この機能を実現するためには Lambda 関数を作成する必要がありました。
-
アセットサポートを提供します。これにより、マシンから Amazon ECS にソースをワンステップでデプロイできるようになります。以前は、アプリケーションソースを使用するには、Amazon ECR へのアップロードや Docker イメージの作成など、複数の手順を手動で実行する必要がありました。
使用する ApplicationLoadBalancedFargateService コンストラクトには多数の AWS コンポーネントが含まれており、その中には、たとえ使用していなくても、AWS アカウントでプロビジョニングされたままにしておくとそれなりのコストが発生するものもあります。この例に従って作業する場合は、必ずクリーンアップ (cdk destroy) を実行してください。
CDK プロジェクトを作成する
まず、CDK プロジェクトを作成します。これは、CDK アプリを含む AWS CDK コードを保存するディレクトリです。
- TypeScript
-
mkdir MyEcsConstruct
cd MyEcsConstruct
cdk init --language typescript
- JavaScript
-
mkdir MyEcsConstruct
cd MyEcsConstruct
cdk init --language javascript
- Python
-
mkdir MyEcsConstruct
cd MyEcsConstruct
cdk init --language python
source .venv/bin/activate # On Windows, run '.\venv\Scripts\activate' instead
pip install -r requirements.txt
- Java
-
mkdir MyEcsConstruct
cd MyEcsConstruct
cdk init --language java
Maven プロジェクトを IDE にインポートできるようになりました。
- C#
-
mkdir MyEcsConstruct
cd MyEcsConstruct
cdk init --language csharp
Visual Studio で src/MyEcsConstruct.sln を開くことができるようになりました。
次に、アプリケーションを実行し、空のスタックが作成されていることを確認します。
cdk synth
Fargate サービスを作成する
Amazon ECS でコンテナタスクを実行するには、以下の 2 つの方法があります。
この例では、インターネット向け Application Load Balancer をフロントとする Amazon ECS クラスターで実行されている Fargate サービスを作成します。
スタックファイル には、以下の AWS コンストラクトライブラリモジュールのインポートを追加します。
- TypeScript
-
ファイル: lib/my_ecs_construct-stack.ts
import * as ec2 from "aws-cdk-lib/aws-ec2";
import * as ecs from "aws-cdk-lib/aws-ecs";
import * as ecs_patterns from "aws-cdk-lib/aws-ecs-patterns";
- JavaScript
-
ファイル: lib/my_ecs_construct-stack.js
const ec2 = require("aws-cdk-lib/aws-ec2");
const ecs = require("aws-cdk-lib/aws-ecs");
const ecs_patterns = require("aws-cdk-lib/aws-ecs-patterns");
- Python
-
ファイル: my_ecs_construct/my_ecs_construct_stack.py
from aws_cdk import (aws_ec2 as ec2, aws_ecs as ecs,
aws_ecs_patterns as ecs_patterns)
- Java
-
ファイル: src/main/java/com/myorg/MyEcsConstructStack.java
import software.amazon.awscdk.services.ec2.*;
import software.amazon.awscdk.services.ecs.*;
import software.amazon.awscdk.services.ecs.patterns.*;
- C#
-
ファイル: src/MyEcsConstruct/MyEcsConstructStack.cs
using Amazon.CDK.AWS.EC2;
using Amazon.CDK.AWS.ECS;
using Amazon.CDK.AWS.ECS.Patterns;
スタック内に、以下のコードを追加します。
- TypeScript
-
const vpc = new ec2.Vpc(this, "MyVpc", {
maxAzs: 3 // Default is all AZs in region
});
const cluster = new ecs.Cluster(this, "MyCluster", {
vpc: vpc
});
// Create a load-balanced Fargate service and make it public
new ecs_patterns.ApplicationLoadBalancedFargateService(this, "MyFargateService", {
cluster: cluster, // Required
cpu: 512, // Default is 256
desiredCount: 6, // Default is 1
taskImageOptions: { image: ecs.ContainerImage.fromRegistry("amazon/amazon-ecs-sample") },
memoryLimitMiB: 2048, // Default is 512
publicLoadBalancer: true // Default is true
});
- JavaScript
-
const vpc = new ec2.Vpc(this, "MyVpc", {
maxAzs: 3 // Default is all AZs in region
});
const cluster = new ecs.Cluster(this, "MyCluster", {
vpc: vpc
});
// Create a load-balanced Fargate service and make it public
new ecs_patterns.ApplicationLoadBalancedFargateService(this, "MyFargateService", {
cluster: cluster, // Required
cpu: 512, // Default is 256
desiredCount: 6, // Default is 1
taskImageOptions: { image: ecs.ContainerImage.fromRegistry("amazon/amazon-ecs-sample") },
memoryLimitMiB: 2048, // Default is 512
publicLoadBalancer: true // Default is true
});
- Python
-
vpc = ec2.Vpc(self, "MyVpc", max_azs=3) # default is all AZs in region
cluster = ecs.Cluster(self, "MyCluster", vpc=vpc)
ecs_patterns.ApplicationLoadBalancedFargateService(self, "MyFargateService",
cluster=cluster, # Required
cpu=512, # Default is 256
desired_count=6, # Default is 1
task_image_options=ecs_patterns.ApplicationLoadBalancedTaskImageOptions(
image=ecs.ContainerImage.from_registry("amazon/amazon-ecs-sample")),
memory_limit_mib=2048, # Default is 512
public_load_balancer=True) # Default is True
- Java
-
Vpc vpc = Vpc.Builder.create(this, "MyVpc")
.maxAzs(3) // Default is all AZs in region
.build();
Cluster cluster = Cluster.Builder.create(this, "MyCluster")
.vpc(vpc).build();
// Create a load-balanced Fargate service and make it public
ApplicationLoadBalancedFargateService.Builder.create(this, "MyFargateService")
.cluster(cluster) // Required
.cpu(512) // Default is 256
.desiredCount(6) // Default is 1
.taskImageOptions(
ApplicationLoadBalancedTaskImageOptions.builder()
.image(ContainerImage.fromRegistry("amazon/amazon-ecs-sample"))
.build())
.memoryLimitMiB(2048) // Default is 512
.publicLoadBalancer(true) // Default is true
.build();
- C#
-
var vpc = new Vpc(this, "MyVpc", new VpcProps
{
MaxAzs = 3 // Default is all AZs in region
});
var cluster = new Cluster(this, "MyCluster", new ClusterProps
{
Vpc = vpc
});
// Create a load-balanced Fargate service and make it public
new ApplicationLoadBalancedFargateService(this, "MyFargateService",
new ApplicationLoadBalancedFargateServiceProps
{
Cluster = cluster, // Required
DesiredCount = 6, // Default is 1
TaskImageOptions = new ApplicationLoadBalancedTaskImageOptions
{
Image = ContainerImage.FromRegistry("amazon/amazon-ecs-sample")
},
MemoryLimitMiB = 2048, // Default is 256
PublicLoadBalancer = true // Default is true
}
);
次に、以下の操作を実行してコードを検証し、スタックを合成します。
cdk synth
このスタックは数百行あるため、ここには表示しません。スタックには、1 つのデフォルトインスタンス、3 つのアベイラビリティーゾーンのプライベートサブネットとパブリックサブネット、およびセキュリティグループが含まれている必要があります。
以下を実行して、スタックをデプロイします。
cdk deploy
AWS CloudFormation は、アプリをデプロイする際に実行する数十のステップに関する情報を表示します。
デプロイが完了すると、Fargate を使用した Amazon ECS サービスが作成され、Docker イメージを実行できるようになります。
クリーンアップ
一般的なメンテナンスのベストプラクティスとして、また不要なコストを最小限に抑えるために、完了したスタックは削除します。
cdk destroy