AWS Cloud Mapを調べる機会があったので、ついでにecs-cliで実際に構成してみた際のメモ。
やりたいこと
- AWS Cloud Mapを理解する
- ECS Fargateクラスターで実際にCloud Mapを使ってみる
AWS Cloud Mapって何
コンテナでサービスディスカバリーをするためのサービス、ぐらいのフワッとした概念しかなかったので、公式で調べてみる。
結果、わかったこと。
- バージョン変化等に伴うマイクロサービスのエンドポイント変化に追従しつつ、サービスの「場所」を返すことができるサービス。
- DNSっぽいなと思ったら、Route 53 Auto Namingの上位互換だった。
- DNSクエリーに対してIPを返す、またはHTTP APIコールに対してURLやARNを返す。
- Route 53のように、ヘルスチェックを行って異常系を検出結果から除外できる。
- ECSとインテグレーションされている。
- ecs-cliとecs-params.ymlで簡単に有効化できそう。
ということで、以前試した方法を拡張して、ecs-cliでハンズオンしてみることにする。
Step by Step
1. ecs-params.ymlの修正
これやこれを見ると、コマンドラインでも比較的簡単に設定出来そうだが、面倒なのでecsparams.ymlに記載できないか試してみる。
前回作成したecsparams.yamlはこちら。
version: 1
task_definition:
task_execution_role: ecsTaskExecutionRole
ecs_network_mode: awsvpc
task_size:
mem_limit: 0.5GB
cpu_limit: 256
run_params:
network_configuration:
awsvpc_configuration:
subnets:
- "subnet-XXXXXXXX"
- "subnet-YYYYYYYY"
security_groups:
- "sg-ZZZZZZZZ"
assign_public_ip: ENABLED
そして、パラメータ一覧を眺めつつ、service_discovery
セクションを追加したecsparams.ymlがこちら。
version: 1
task_definition:
task_execution_role: ecsTaskExecutionRole
ecs_network_mode: awsvpc
task_size:
mem_limit: 0.5GB
cpu_limit: 256
run_params:
network_configuration:
awsvpc_configuration:
subnets:
- "subnet-XXXXXXXX"
- "subnet-YYYYYYYY"
security_groups:
- "sg-ZZZZZZZZ"
assign_public_ip: ENABLED
service_discovery:
private_dns_namespace:
vpc: "vpc-AAAABBBB"
name: "myDiscovery"
VPC IDとCloud Mapの名前空間名だけ追加すればよい模様。
2. ECSクラスターの生存確認
ecs-cli compose
でサービスを追加する際に有効化するようなので、大元となるFargateクラスターをまずは生存確認。
無事生きてた。
3. Cloud Map(サービスディスカバリー)を有効化したFargateサービスの作成
先程作成したecsparams.ymlを使って、Fargateサービスを作成する。
この際に、service_discovery
セクションの記載を用いてCloud Mapを有効化することになる。
% ecs-cli compose --project-name SvcDiscoveryTest service up --enable-service-discovery
INFO[0000] Using ECS task definition TaskDefinition="SvcDiscoveryTest:1"
INFO[0006] Waiting for the private DNS namespace to be created...
INFO[0006] Cloudformation stack status stackStatus=CREATE_IN_PROGRESS
WARN[0066] Defaulting DNS Type to A because network mode was awsvpc
INFO[0071] Waiting for the Service Discovery Service to be created...
INFO[0072] Cloudformation stack status stackStatus=CREATE_IN_PROGRESS
INFO[0102] Auto-enabling ECS Managed Tags
INFO[0108] (service SvcDiscoveryTest) has started 1 tasks: (task 9bac8a5967b24ca0891fc94eac0424b1). timestamp="2020-06-18 15:21:52 +0000 UTC"
INFO[0153] Service status desiredCount=1 runningCount=1 serviceName=SvcDiscoveryTest
INFO[0153] ECS Service has reached a stable state desiredCount=1 runningCount=1 serviceName=SvcDiscoveryTest
INFO[0153] Created an ECS service service=SvcDiscoveryTest taskDefinition="SvcDiscoveryTest:1"
同じものをFargate側から見ると、以下のようになっている。
4. 名前解決テスト
今回は特定のVPCからのみアクセスできるプライベート名前空間として作成したので、同じサブネット上のEC2からSvcDiscoveryTest.myDiscovery
を解決してみる。
まずDNS。
$ nslookup SvcDiscoveryTest.myDiscovery
Server: 10.100.0.2
Address: 10.100.0.2#53
Non-authoritative answer:
Name: SvcDiscoveryTest.myDiscovery
Address: 10.100.10.33
プライベートIPが返ってきた。
次いでAPI。
% aws servicediscovery discover-instances --namespace-name myDiscovery --service-name SvcDiscoveryTest
{
"Instances": [
{
"InstanceId": "9ba(中略)4b1",
"NamespaceName": "myDiscovery",
"ServiceName": "SvcDiscoveryTest",
"HealthStatus": "HEALTHY",
"Attributes": {
"AVAILABILITY_ZONE": "ap-northeast-1a",
"AWS_INIT_HEALTH_STATUS": "HEALTHY",
"AWS_INSTANCE_IPV4": "10.100.10.33",
"ECS_CLUSTER_NAME": "myFargate",
"ECS_SERVICE_NAME": "SvcDiscoveryTest",
"ECS_TASK_DEFINITION_FAMILY": "SvcDiscoveryTest",
"REGION": "ap-northeast-1"
}
}
]
}
最後にcurlも試してみる。
$ curl SvcDiscoveryTest.myDiscovery
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Simple PHP App</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="assets/css/bootstrap.min.css" rel="stylesheet">
<style>body {margin-top: 40px; background-color: #333;}</style>
<link href="assets/css/bootstrap-responsive.min.css" rel="stylesheet">
<!--[if lt IE 9]><script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
</head>
<body>
<div class="container">
<div class="hero-unit">
<h1>Simple PHP App</h1>
<h2>Congratulations</h2>
<p>Your PHP application is now running on a container in Amazon ECS.</p>
<p>The container is running PHP version 5.4.16.</p>
以上、ecs-cliから試してみたCloud Mapでした。