を使用した AWS Fargate サービスの作成 AWS CDK - AWS Cloud Development Kit (AWS CDK) v2

これは AWS CDK v2 デベロッパーガイドです。古い CDK v1 は 2022 年 6 月 1 日にメンテナンスを開始し、2023 年 6 月 1 日にサポートを終了しました。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

を使用した AWS Fargate サービスの作成 AWS CDK

この例では、Amazon ECR 上のイメージからインターネット向け Application Load Balancer が前面にある Amazon Elastic Container Service (Amazon ECS) クラスターで実行されている AWS Fargate サービスを作成する方法について説明します。

Amazon ECS は、クラスターで Docker コンテナを簡単に実行、停止、管理できる非常にスケーラブルで高速なコンテナ管理サービスです。Fargate 起動タイプを使用してサービスまたはタスクを起動することで、Amazon ECS によって管理されるサーバーレスインフラストラクチャでクラスターをホストできます。より詳細な制御のために、Amazon EC2 起動タイプを使用して管理する Amazon Elastic Compute Cloud (Amazon EC2) インスタンスのクラスターでタスクをホストできます。

このチュートリアルでは、Fargate 起動タイプを使用して一部のサービスを起動する方法を示します。を使用して Fargate サービス AWS Management Console を作成した場合は、そのタスクを実行するための多くのステップがあることがわかります。 AWS には、Fargate サービスの作成を順を追って説明するチュートリアルとドキュメントのトピックがいくつかあります。

この例では、同様の Fargate サービスを AWS CDK コードで作成します。

このチュートリアルで使用される Amazon ECS コンストラクトは、以下の利点を提供することで AWS のサービスを使用するのに役立ちます。

  • ロードバランサーを自動的に設定します。

  • ロードバランサーのセキュリティグループを自動的に開きます。これにより、セキュリティグループを明示的に作成しなくても、ロードバランサーはインスタンスと通信できます。

  • ターゲットグループにアタッチされているサービスとロードバランサー間の依存関係を自動的に順序付けします。この場合、 は、インスタンスが作成される前にリスナーを作成する正しい順序 AWS CDK を適用します。

  • グループを自動的にスケーリングするユーザーデータを自動的に設定します。これにより、クラスターを AMIs に関連付けるための正しい設定が作成されます。

  • パラメータの組み合わせを早期に検証します。これにより、以前に AWS CloudFormation 問題が明らかになり、デプロイ時間を節約できます。例えば、タスクによっては、メモリ設定を誤って設定するのは簡単です。以前は、アプリケーションをデプロイするまでエラーは発生しません。ただし、 AWS CDK はアプリを合成するときに設定ミスを検出し、エラーを出力できるようになりました。

  • Amazon ECR のイメージを使用する場合、Amazon Elastic Container Registry (Amazon ECR) のアクセス許可を自動的に追加します。

  • 自動的にスケーリングします。 AWS CDK には、Amazon EC2 クラスターを使用するときにインスタンスを自動スケーリングするための メソッドが用意されています。これは、Fargate クラスターでインスタンスを使用する場合に自動的に発生します。

    さらに、 は、自動スケーリングがインスタンスを強制終了しようとしても、タスクが実行されているか、そのインスタンスでスケジュールされている場合に、インスタンスが削除され AWS CDK ないようにします。

    以前は、この機能を使用するには Lambda 関数を作成する必要がありました。

  • アセットサポートを提供するため、1 つのステップでマシンから Amazon ECS にソースをデプロイできます。以前は、アプリケーションソースを使用するには、Amazon ECR へのアップロードや Docker イメージの作成など、いくつかの手動ステップを実行する必要がありました。

詳細については、「ECS」を参照してください。

重要

使用するApplicationLoadBalancedFargateServiceコンストラクトには多数の AWS コンポーネントが含まれており、その中には、使用していない場合でも、 AWS アカウントにプロビジョニングされたままにしておくと煩雑なコストがかからないコンポーネントもあります。この例を完了したら、必ず (cdk destroy) をクリーンアップしてください。

ディレクトリの作成と の初期化 AWS CDK

まず、 AWS 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 つの異なる方法があります。

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

  • 自動スケーリングの指定など、管理を行うEC2起動タイプを使用します。

この例では、インターネット向け Application Load Balancer をフロントとする 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 イメージを実行するのが非常に簡単です。

クリーンアップ

予期しない AWS 料金が発生しないようにするには、この演習を完了した後に AWS CDK スタックを破棄してください。

cdk destroy