例: AWS CDK を使用して AWS Fargate サービスを作成する - AWS Cloud Development Kit (AWS CDK) v2

これは 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 つの方法があります。

  • Fargate の起動タイプを使用する。この場合、コンテナが実行される物理マシンを Amazon ECS が管理します。

  • EC2 の起動タイプを使用する。この場合、自動スケーリングの指定などの管理は自分で行います。

この例では、インターネット向け 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