Open6
Amazon ECS Service Connectのメモ
blogとドキュメント
- https://aws.amazon.com/jp/blogs/aws/new-amazon-ecs-service-connect-enabling-easy-communication-between-microservices/
- https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html
必要な設定
- cluster
- serviceConnectDefaults (デフォルト設定なので、各サービスに設定するならなくてもよい)
- namespace → CloudMapのnamespace
- serviceConnectDefaults (デフォルト設定なので、各サービスに設定するならなくてもよい)
- service
- serviceConnectConfiguration
serviceConnectConfiguration: {
namespace: 'ecspresso-test', // CloudMap名前空間
enabled: true,
logConfiguration: { // ServiceConnectで自動で生えるEnvoyのログはここにでる
logDriver: 'awslogs',
options: {
'awslogs-group': 'ecspresso-test',
'awslogs-region': 'ap-northeast-1',
'awslogs-stream-prefix': 'sc',
},
},
services: [
{
clientAliases: [
{
dnsName: 'nginx.local', // クライアントからはこの名前でアクセス可能になる
port: 80,
},
],
portName: 'nginx', // taskdef portMappingsで定義した名前(宛先コンテナ)
discoveryName: 'nginx-server', // CloudMapのサービス名になる
},
],
},
- taskdef
- containerDefinitons[].portMappings
portMappings: [
{
name: 'nginx', // ServiceConnectで使うために名前が必要
containerPort: 80,
protocol: 'tcp',
appProtocol: 'http', // ServiceConnectのproxy種別(tcp, http, grpc) envoyがこれでproxyする
},
]
clientAliases.dnsName で定義した名前 (例: nginx.local
) は、ServiceConnectを有効にしたサービスのタスク(サーバー、クライアントとも)の /etc/hosts
に自動で以下のように書かれる。
127.255.0.1 nginx.local
2600:f0f0:0:0:0:0:0:1 nginx.local
アプリケーションからこの名前で通信すると、自動で生えるEnvoyが通信を中継してくれるらしい
Service Connectを有効にしたタスクには、taskdefに定義していないコンテナが自動で追加される。
describe-tasks すると attachments に type=ServiceConnect な情報がある
{
"attachments": [
{
"details": [
{
"name": "ContainerName",
"value": "ecs-service-connect-CeywymY"
}
],
"id": "32483dc2-355f-4145-b52d-3283781a3b7d",
"status": "ATTACHED",
"type": "ServiceConnect"
},
containerDefinitionsにもenvoyコンテナの情報がある
{
"containerArn": "arn:aws:ecs:ap-northeast-1:012345678901:container/ecspresso-test/0c9faae1a3df41c9b1ea31ed8dfcb557/9c00d028-d2d6-4709-9180-951fc448c07a",
"cpu": null,
"exitCode": null,
"gpuIds": null,
"healthStatus": "HEALTHY",
"image": null,
"imageDigest": null,
"lastStatus": "RUNNING",
"managedAgents": [
{
"lastStartedAt": "2022-12-01T02:10:12.46Z",
"lastStatus": "RUNNING",
"name": "ExecuteCommandAgent",
"reason": null
}
],
"memory": null,
"memoryReservation": null,
"name": "ecs-service-connect-CeywymY",
"networkBindings": [],
"networkInterfaces": [
{
"attachmentId": "3dd845a8-600d-4ce0-8109-b974f5b4ee25",
"ipv6Address": null,
"privateIpv4Address": "10.3.4.151"
}
],
"reason": null,
"runtimeId": "0c9faae1a3df41c9b1ea31ed8dfcb557-2403977103",
"taskArn": "arn:aws:ecs:ap-northeast-1:012345678901:task/ecspresso-test/0c9faae1a3df41c9b1ea31ed8dfcb557"
}
このコンテナにECS Execで入ることもできる。かなりminimalで普通のコマンドがないので探検するにはbusyboxを入れるとよい。 curl (という名前だがGo実装の何か)とchmodはあるので以下のようにする。
sh-4.2# curl https://busybox.net/downloads/binaries/1.35.0-x86_64-linux-musl/busybox > busybox
sh-4.2# chmod +x busybox
sh-4.2# ./busybox --install /usr/bin
envoyが動いているコンテナ探検
/ # ps
PID USER TIME COMMAND
1 20000 0:01 /usr/bin/agent
17 20000 0:03 /usr/bin/envoy -c /tmp/envoy-config-2615875819.yaml -l info --concurrency 2
37 0 0:00 /managed-agents/execute-command/amazon-ssm-agent
49 0 0:00 /managed-agents/execute-command/ssm-agent-worker
643 0 0:00 [cat]
760 0 0:00 /managed-agents/execute-command/ssm-session-worker ecs-execute-command-03de
768 0 0:00 sh
775 0 0:00 ash
929 0 0:00 ps
# envoy --version
envoy version: 2d5c47932c2fabaf13422e3b5fa9420d9865dee9/1.24.0-appmesh.0/Modified/RELEASE/BoringSSL
/ # ls /etc
hostname hosts mtab pki resolv.conf
# cat /proc/`pidof envoy`/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 10485760 10485760 bytes
Max core file size unlimited unlimited bytes
Max resident set unlimited unlimited bytes
Max processes unlimited unlimited processes
Max open files 4096 4096 files
Max locked memory unlimited unlimited bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 30446 30446 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
ecspressoでのServiceConnectサポート(動いてる)
RunTaskで起動した単体タスクをService Connectのクライアントにする方法が見当たらない (SDK的にはRunTaskInputにServiceConnectConfiguraionがない)
単体タスクでbatch jobを起動したりする場合、サービスを解決する方法がないような?