この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
コンサル部のtobachi(@toda_kk)です。
サービスディスカバリー(サービス検出)を使うECSリソースをCloudFormationで作成する機会があり、意外とまとまった記事が見つからなかったのでテンプレートの例を記載してみました。
結論
必要なリソース
AWS::ServiceDiscovery::PrivateDnsNamespace
リソースを作成する。AWS::ServiceDiscovery::Service
のリソースを作成する。DnsConfig.NamespaceId
に1. で作成したリソースのIDを指定する。- サービスディスカバリーで名前解決したい
AWS::ECS::Service
リソースを作成する。ServiceRegistries.RegistryArn
に2. で作成したリソースのARNを指定する。
サンプルテンプレート
サービスディスカバリーを動かすのに最低限必要なリソースのみを記述したサンプルテンプレートです。
ベタ書きしている箇所がいくつかあるので、適宜修正した上でご利用ください。
AWSTemplateFormatVersion: "2010-09-09"
Resources:
PrivateDnsNamespace:
Type: AWS::ServiceDiscovery::PrivateDnsNamespace
Properties:
Vpc: "sample-vpc"
Name: "sample.local"
ServiceDiscovery:
Type: AWS::ServiceDiscovery::Service
Properties:
HealthCheckCustomConfig:
FailureThreshold: 1
DnsConfig:
DnsRecords:
- Type: A
TTL: 60
NamespaceId: !GetAtt PrivateDnsNamespace.Id
Name: "service"
ECSService:
Type: "AWS::ECS::Service"
Properties:
ServiceName: "sample-ecs-service"
Cluster: "sample-ecs-cluster"
ServiceRegistries:
- RegistryArn: !GetAtt ServiceDiscovery.Arn
DesiredCount: 2
LaunchType: "FARGATE"
PlatformVersion: "1.4.0"
TaskDefinition: "arn:aws:ecs:ap-northeast-1:123456789012:task-definition/sample-ecs-task:1"
DeploymentConfiguration:
MaximumPercent: 200
MinimumHealthyPercent: 100
NetworkConfiguration:
AwsvpcConfiguration:
AssignPublicIp: "DISABLED"
SecurityGroups:
- sg-xxxxxxxxxx
Subnets:
- subnet-xxxxxxxxxx
- subnet-xxxxxxxxxx
SchedulingStrategy: "REPLICA"
何が必要なのか?
上記の通り、ECSサービスディスカバリーを構築するために必要なリソースは下記2つです。
- AWS::ServiceDiscovery::PrivateDnsNamespace
- AWS::ServiceDiscovery::Service
サービスディスカバリーの仕組み
サービスディスカバリーの仕組みとして、裏側ではAWS Cloud Mapが動いています。これはVPC内にプライベートな名前空間を作成し管理できるサービスです。
Cloud Mapの詳細については下記の記事をご参照ください。
ECSサービスの設定で「サービス検出」を利用すると、タスクが起動した際に自動的にRoute 53に登録されているAレコードを更新し、タスクが起動するEC2/FargateのプライベートIPを登録してくれます。
VPC内では起動したタスクを名前解決してルーティングできるようになるため、コンテナ間の通信が容易になるというわけです。
AWSマネジメントコンソールとCloudFormationの違い
サービスディスカバリーを設定したい場合、AWSマネジメントコンソールからだとECSサービスを作成する画面で「サービス検出」として設定項目が表示されます。そのため、ECSサービスに付随するリソースなのだと誤解してしまいました。
CloudFormationの場合は、ServiceDiscovery
リソースでCloud MapのNamespaceおよびServiceを作成し、それらをECSサービスに関連づけるような形で設定します。
CloudFormationでリソースを作成すると仕組みが見えてくる
ECSに限らずAWSリソースを作成する際、AWSマネジメントコンソールとCloudFormationでは少し意識を変える必要があります。
CloudFormationで作成する場合は、あるAWSサービスの裏側で他のAWSサービスがどのように関連しているのかを理解する必要があります。今回の場合も、その一例と言えるでしょう。
参考: Fargateを利用してECSをCloudFormationで作成する
本記事では詳しく記載しませんでしたが、Fargateを利用したECSリソースをCloudFormationで作成する場合には、下記の記事が参考になります。
実際にECSサービスディスカバリーを構築する際には、本記事と併せてご参照いただけると良いかなと思います。
以上、コンサル部のtobachi(@toda_kk)でした。