CloudFormation で Amazon ECS サービス検出を使用するにはどうすればよいですか。
AWS CloudFormation で、Amazon Elastic Container Service (Amazon ECS) サービス検出を利用する方法を教えてください。
簡単な説明
Amazon ECS コンソールを使用すると、サービスの作成中にサービス検出リソースを作成できます。ただし、CloudFormation の AWS::ECS::Service リソースタイプでは、サービス作成時にサービス検出リソースは作成されません。
注意: Amazon ECS コンソールでは、統合 API の CreatePrivateDnsNamespace、CreateService (AWS Cloud Map)、および CreateService (Amazon ECS) を使います。CloudFormation では統合を実装するために、単一の CloudFormation テンプレート内で AWS::ServiceDiscovery::PrivateDnsNamespace、AWS::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 か、ContainerPort と ContainerName の組み合わせのどちらかを設定します。host または bridge モードを使用する場合、この値には (タスク定義の指定に従い) ContainerPort か ContainerName のどちらかを設定します。
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
関連するコンテンツ
- 質問済み 1年前lg...
- 質問済み 4年前lg...
- AWS公式更新しました 3年前
- AWS公式更新しました 2年前