概要
最近CloudFormationでCloud Mapを構築する機会があったので備忘録。
Cloud Map とは
AWS Cloud Map は、アプリケーションが依存するバックエンドサービスとリソースに論理名をマッピングできるフルマネージドソリューションです。また、AWS SDK、RESTful API コール、DNS クエリのいずれかを使用してアプリケーションがリソースを検出する際にも役立ちます。AWS Cloud Map は、Amazon DynamoDB (DynamoDB) テーブル、Amazon Simple Queue Service (Amazon SQS) キュー、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスまたは Amazon Elastic Container Service (Amazon ECS) タスクを使用して構築された高レベルアプリケーションサービスなど、正常なリソースのみを提供します。
とりあえず以下のBlack Beltを見ておけばOK。
AWS Cloud Map 入門【AWS Black Belt】
また、以下の記事でも分かりやすく解説されている。
【AWS】マイクロサービスを支える2つのサービス(AWS Cloud Map編)
CFnテンプレート
cloudmap.ymlでは、AWS::ServiceDiscovery::PrivateDnsNamespaceとAWS::ServiceDiscovery::Serviceを作成する。AWS::ServiceDiscovery::PrivateDnsNamespaceはRoute 53のプライベートホストゾーンが作成される。
ecs.yml側ではAWS::ECS::ServiceでServiceRegistriesを設定する。
AWSTemplateFormatVersion: 2010-09-09
Description: Template for Cloud Map
Parameters:
ProjectName:
Type: String
Env:
Type: String
DomainName:
Type: String
Resources:
# Route53 ホストゾーンが作られる
PrivateDnsNamespace:
Type: AWS::ServiceDiscovery::PrivateDnsNamespace
Properties:
Name: !Sub ${DomainName}
Description: !Sub ${ProjectName}-${Env}-servicediscovery-private-namespace
Vpc:
Fn::ImportValue: !Sub ${ProjectName}-${Env}-vpc-id
Tags:
- Key: Name
Value: !Sub ${ProjectName}-${Env}-ecs-service-db
- Key: ProjectName
Value: !Sub ${ProjectName}
- Key: Env
Value: !Sub ${Env}
ServiceDB:
Type: AWS::ServiceDiscovery::Service
Properties:
Name: db # 本プロパティ+ドメイン名でレコード登録される
DnsConfig:
DnsRecords:
- Type: A
TTL: 60
NamespaceId: !Sub ${PrivateDnsNamespace.Id}
Outputs:
ServiceDBArn:
Value: !Sub ${ServiceDB.Arn}
Export:
Name: !Sub ${ProjectName}-${Env}-servicediscovery-service-db-arn
# ECS Service
ECSService:
Type: AWS::ECS::Service
Properties:
ServiceName: !Sub ${ProjectName}-${Env}-ecs-service-db
Cluster:
Fn::ImportValue: !Sub ${ProjectName}-${Env}-ecs-cluster-name
TaskDefinition: !Sub ${ECSTaskDefinition}
DesiredCount: !Sub ${ECSTaskDesiredCount}
DeploymentController:
Type: ECS
LaunchType: FARGATE
NetworkConfiguration:
AwsvpcConfiguration:
AssignPublicIp: DISABLED
SecurityGroups:
- Fn::ImportValue: !Sub ${ProjectName}-${Env}-sg-ecs-db-id
Subnets:
- Fn::ImportValue: !Sub ${ProjectName}-${Env}-subnet-private-a1-id
ServiceRegistries: # ここにAWS::ServiceDiscovery::ServiceのARNを指定する
- RegistryArn:
Fn::ImportValue: !Sub ${ProjectName}-${Env}-servicediscovery-service-db-arn
EnableExecuteCommand: !Sub ${IsEnableExecuteCommand}
PropagateTags: TASK_DEFINITION
Tags:
- Key: Name
Value: !Sub ${ProjectName}-${Env}-ecs-service-db
- Key: ProjectName
Value: !Sub ${ProjectName}
- Key: Env
Value: !Sub ${Env}