

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

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

# 例: AWS CDK を使用して AWS Fargate サービスを作成する
<a name="ecs-example"></a>

この例では、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 サービスの作成を順を追って説明する、以下のようなチュートリアルやドキュメントのトピックがいくつか用意されています。
+  [Docker コンテナをデプロイする方法 - AWS](https://aws.amazon.com/getting-started/tutorials/deploy-docker-containers) 
+  [Amazon ECS のセットアップ](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/get-set-up-for-amazon-ecs.html) 
+  [Fargate を使用した Amazon ECS の使用開始](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_GetStarted.html) 

この例では、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 プロジェクトを作成する
<a name="ecs-example-initialize"></a>

まず、CDK プロジェクトを作成します。これは、CDK アプリを含む AWS CDK コードを保存するディレクトリです。

**Example**  

```
mkdir MyEcsConstruct
cd MyEcsConstruct
cdk init --language typescript
```

```
mkdir MyEcsConstruct
cd MyEcsConstruct
cdk init --language javascript
```

```
mkdir MyEcsConstruct
cd MyEcsConstruct
cdk init --language python
source .venv/bin/activate # On Windows, run '.\venv\Scripts\activate' instead
pip install -r requirements.txt
```

```
mkdir MyEcsConstruct
cd MyEcsConstruct
cdk init --language java
```
Maven プロジェクトを IDE にインポートできるようになりました。

```
mkdir MyEcsConstruct
cd MyEcsConstruct
cdk init --language csharp
```
Visual Studio で `src/MyEcsConstruct.sln` を開くことができるようになりました。

次に、アプリケーションを実行し、空のスタックが作成されていることを確認します。

```
cdk synth
```

## Fargate サービスを作成する
<a name="ecs-example-create-fargate-service"></a>

Amazon ECS でコンテナタスクを実行するには、以下の 2 つの方法があります。
+ `Fargate` の起動タイプを使用する。この場合、コンテナが実行される物理マシンを Amazon ECS が管理します。
+ `EC2` の起動タイプを使用する。この場合、自動スケーリングの指定などの管理は自分で行います。

この例では、インターネット向け Application Load Balancer をフロントとする Amazon ECS クラスターで実行されている Fargate サービスを作成します。

*スタックファイル *には、以下の AWS コンストラクトライブラリモジュールのインポートを追加します。

**Example**  
ファイル: `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";
```
ファイル: `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");
```
ファイル: `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)
```
ファイル: `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.*;
```
ファイル: `src/MyEcsConstruct/MyEcsConstructStack.cs`   

```
using Amazon.CDK.AWS.EC2;
using Amazon.CDK.AWS.ECS;
using Amazon.CDK.AWS.ECS.Patterns;
```

スタック内に、以下のコードを追加します。

**Example**  

```
    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
    });
```

```
    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
    });
```

```
        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
```

```
        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();
```

```
            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 イメージを実行できるようになります。

## クリーンアップ
<a name="ecs-example-destroy"></a>

一般的なメンテナンスのベストプラクティスとして、また不要なコストを最小限に抑えるために、完了したスタックは削除します。

```
cdk destroy
```