CloudFormation で Amazon ECS サービス検出を使用するにはどうすればよいですか?

最終更新日: 2021 年 9 月 23 日

AWS CloudFormation で、Amazon Elastic Container Service (Amazon ECS) サービス検出を利用する方法を教えてください。

簡単な説明

Amazon ECS コンソールを使用すると、サービスの作成中にサービス検出リソースを作成できます。ただし、CloudFormation の AWS::ECS::Service リソースタイプでは、サービス作成時にサービス検出リソースは作成されません。

注意: Amazon ECS コンソールでは、統合 API の CreatePrivateDnsNamespaceCreateService (AWS Cloud Map)、および CreateService (Amazon ECS) を使います。CloudFormation では統合を実装するために、単一の CloudFormation テンプレート内で AWS::ServiceDiscovery::PrivateDnsNamespaceAWS::ServiceDiscovery::Service、および AWS::ECS::Service のリソースタイプを使用します。

解決方法

1.    CloudFormation テンプレートの [リソース] セクションで、example.com などのプライベートサービス検出名前空間を作成します。既存の Amazon Virtual Private Cloud (Amazon VPC) に名前空間を作成します。以下の JSON と YAML の例を参照してください。

JSON:

{
  "PrivateNamespace": {
    "Type": "AWS::ServiceDiscovery::PrivateDnsNamespace",
    "Properties": {
      "Name": "example.com",
      "Vpc": "vpc-xxxxxxx"
    }
  }
}

YAML:

PrivateNamespace:
    Type: AWS::ServiceDiscovery::PrivateDnsNamespace
    Properties:
        Name: example.com
        Vpc: vpc-xxxxxxx

注意: example.com を名前空間の名前に置き換えてください。vpc-xxxxxxx をアカウントの VPC の ID に置き換えてください。

2.    ステップ 1 で作成した名前空間の ID を使い、サービス検出のサービスを作成します。

CloudFormation テンプレートの組み込み関数である Ref を使用すると、名前空間の ID 値を取得できます。以下の JSON と YAML の例を参照してください。

JSON:

{
  "DiscoveryService": {
    "Type": "AWS::ServiceDiscovery::Service",
    "Properties": {
      "Description": "Discovery Service for the Demo Application",
      "DnsConfig": {
        "RoutingPolicy": "MULTIVALUE",
        "DnsRecords": [
          {
            "TTL": 60,
            "Type": "A"
          },
          {
            "TTL": 60,
            "Type": "SRV"
          }
        ]
      },
      "HealthCheckCustomConfig": {
        "FailureThreshold": 1
      },
      "Name": "example-service-name",
      "NamespaceId": {
        "Ref": "PrivateNamespace"
      }
    }
  }
}

YAML:

DiscoveryService:
  Type: AWS::ServiceDiscovery::Service
  Properties: 
    Description: Discovery Service for the Demo Application
    DnsConfig:
      RoutingPolicy: MULTIVALUE
      DnsRecords:
        - TTL: 60
          Type: A
        - TTL: 60
          Type: SRV
    HealthCheckCustomConfig: 
      FailureThreshold: 1
    Name: example-service-name
    NamespaceId: !Ref PrivateNamespace

注意: example-service-name をサービスの名前に置き換えます。

DnsConfig プロパティは、Amazon Route 53 で自動的に作成される DNS レコードを指定します。これらの DNS レコードは、Amazon ECS タスクがサービス検出サービスに登録されたときに作成されます。タイプ A の DNS レコードや SRV がサポートされています。

ヒント: ベストプラクティスは、HealthCheckCustomConfig プロパティを使い、Amazon ECS からサービス検出に対してタスクヘルスをレポートさせることです。Amazon ECS では、AWS Cloud Map によるサービス検出のヘルス情報更新のために、コンテナチェック、ヘルスチェック、タスク状態から得られた情報を使用します。

3.    前のステップで作成したサービス検出名前空間およびサービスと統合する Amazon ECS サービスを作成します。AWS:ECS::Service リソースの ServiceRegistries プロパティを使用して、統合を指定します。以下の JSON と YAML の例を参照してください。

JSON:

{
  "EcsService": {
    "Type": "AWS::ECS::Service",
    "Properties": {
      "Cluster": "awsExampleCluster",
      "DesiredCount": 4,
      "LaunchType": "FARGATE",
      "NetworkConfiguration": {
        "AwsvpcConfiguration": {
          "SecurityGroups": [
            "sg-xxxxxxx"
          ],
          "Subnets": [
            "subnet-xxxxxxx"
          ]
        }
      },
      "ServiceName": "awsExampleService",
      "TaskDefinition": "awsExampleTaskDefinition",
      "ServiceRegistries": [
        {
          "RegistryArn": {
            "Fn::GetAtt": [
              "DiscoveryService",
              "Arn"
            ]
          },
          "Port": 80
        }
      ]
    }
  }
}

YAML:

EcsService:
  Type: AWS::ECS::Service
  Properties:
    Cluster: awsExampleCluster
    DesiredCount: 4
    LaunchType: FARGATE
    NetworkConfiguration:
      AwsvpcConfiguration:
        SecurityGroups:
          - sg-xxxxxxx
        Subnets:
          - subnet-xxxxxxx
    ServiceName: awsExampleService
    TaskDefinition: awsExampleTaskDefinition
    ServiceRegistries:
      - RegistryArn: !GetAtt DiscoveryService.Arn
        Port: 80

注意:awsExampleCluster をクラスターに置き換えます。awsExampleService を自分のサービスに置き換えます。awsExampleTaskDefinition をタスク定義に置き換えます。sg-xxxxxxx をセキュリティグループ ID に置き換えます。subnet-xxxxxxx をサブネット ID に置き換えます。

RegistryArn プロパティ値には、Amazon ECS サービスと統合させたいサービス検出サービスの Amazon リソースネーム (ARN) を設定します。この値の取得には、CloudFormation テンプレートの組み込み関数 Fn::GetAtt を使用します。

awsvpc モードを使用する場合、この値には (タスク定義の指定に従い) Port か、ContainerPortContainerName の組み合わせのどちらかを設定します。host または bridge モードを使用する場合、この値には (タスク定義の指定に従い) ContainerPortContainerName のどちらかを設定します。

4.    CloudFormation コンソールを開き、[スタックを作成] を選択して、更新したテンプレートに基づきリソースをデプロイします。

5.    以下のコマンドを実行し、VPC 内からタスクが解決可能であることを確認します。

$ dig awsExampleService.awsExampleNamespace. +short
$ dig srv awsExampleService.awsExampleNamespace. +short
$ curl awsExampleService.awsExampleNamespace. -I

注意: awsExampleService の値は、AWS::ECS::Service リソースの名前です。awsExampleNamespace の値は、AWS::ServiceDiscovery::PrivateDnsNamespace リソースの名前です。

このコマンドは以下のような出力を返します。

$ dig awsExampleService.awsExampleNamespace. +short の場合:

172.31.182.0
172.31.160.124
172.31.137.81
172.31.149.244

$ dig srv awsExampleService.awsExampleNamespace. +short の場合:

1 1 80 ffe95d27ea8d4f7aba0dfed87297fc5a.awsExampleService.awsExampleNamespace.
1 1 80 44a17fa781974a93bb563bc1826a8697.awsExampleService.awsExampleNamespace.
1 1 80 d640ecb3d283421bb2d1318caf4b0d66.awsExampleService.awsExampleNamespace.
1 1 80 65aff6fff33144b2ad79d283ab52cfe9.awsExampleService.awsExampleNamespace.

$ curl awsExampleService.awsExampleNamespace. -I の場合:

HTTP/1.1 200 OK
Server: nginx/1.15.12
Date: Wed, 15 May 2019 02:25:19 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 16 Apr 2019 13:08:19 GMT
Connection: keep-alive
ETag: "5cb5d3c3-264"
Accept-Ranges: bytes

この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?