配置 AWS ECS 服务发现,让服务之间可以相互调用,需要以下几个步骤。🚀
首先,确保你有一个 ECS 集群。如果没有,需要在 AWS 控制台中创建一个。选择合适的 EC2 实例类型和数量,以及 VPC 和子网。
Cloud Map 负责服务注册和发现。创建一个私有或公有命名空间。私有命名空间仅在 VPC 内部可见,公有命名空间则可以在 Internet 上解析(不常用)。
aws cloudmap create-namespace --name my-namespace --type DNS_PRIVATE --vpc VPC_ID
注意替换 `VPC_ID` 为你的 VPC ID。
定义你的任务。在 Task Definition 中,指定容器镜像、资源需求(CPU、内存)、端口映射以及服务发现配置。
在 Task Definition 的 `containerDefinitions` 部分,添加 `portMappings` 和 `healthCheck`(可选,但推荐)。
{
"containerDefinitions": [
{
"name": "my-service",
"image": "your-docker-image",
"portMappings": [
{
"containerPort": 8080,
"protocol": "tcp"
}
],
"healthCheck": {
"command": [
"CMD-SHELL",
"curl -f http://localhost:8080/health || exit 1"
],
"interval": 30,
"timeout": 5,
"retries": 3,
"startPeriod": 60
},
"memory": 512,
"cpu": 256
}
],
"family": "my-task-definition",
"networkMode": "awsvpc",
"requiresCompatibilities": [
"FARGATE"
],
"cpu": "256",
"memory": "512",
"executionRoleArn": "arn:aws:iam::YOUR_ACCOUNT_ID:role/ecsTaskExecutionRole",
"taskRoleArn": "arn:aws:iam::YOUR_ACCOUNT_ID:role/ecsTaskRole",
"requiresAttributes": [
{
"name": "com.amazonaws.ecs.capability.ecr-auth"
},
{
"name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
},
{
"name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
},
{
"name": "ecs.capability.task-eni"
}
],
"ipcMode": "none",
"pidMode": "task",
"runtimePlatform": {
"cpuArchitecture": "X86_64",
"operatingSystemFamily": "LINUX"
}
}
记得替换 `your-docker-image`, `YOUR_ACCOUNT_ID` 和其他占位符。
创建 ECS Service 时,启用服务发现。指定 Cloud Map 命名空间和服务名称。ECS 会自动将你的服务实例注册到 Cloud Map。
在 ECS Service 的配置中,找到 "Service discovery" 部分,选择之前创建的 Cloud Map 命名空间,并指定一个服务名称。
{
"serviceName": "my-service",
"taskDefinition": "my-task-definition:1",
"desiredCount": 2,
"launchType": "FARGATE",
"networkConfiguration": {
"awsvpcConfiguration": {
"subnets": [
"subnet-xxxxxxxxxxxxxxxxx",
"subnet-yyyyyyyyyyyyyyyyy"
],
"securityGroups": [
"sg-zzzzzzzzzzzzzzzzz"
],
"assignPublicIp": "DISABLED"
}
},
"serviceRegistries": [
{
"registryArn": "arn:aws:servicediscovery:REGION:ACCOUNT_ID:service/SERVICE_ID",
"port": 8080,
"containerName": "my-service",
"containerPort": 8080
}
]
}
确保替换 `subnet-xxxxxxxxxxxxxxxxx`、`subnet-yyyyyyyyyyyyyyyyy`、`sg-zzzzzzzzzzzzzzzzz`、`REGION`、`ACCOUNT_ID` 和 `SERVICE_ID`。
确保 ECS Task Execution Role 具有访问 Cloud Map 的权限。需要添加类似以下的 IAM 策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"servicediscovery:RegisterInstance",
"servicediscovery:DeregisterInstance",
"servicediscovery:GetInstances",
"servicediscovery:DiscoverInstances"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"ec2:DescribeNetworkInterfaces"
],
"Resource": "*"
}
]
}
现在,你的服务可以通过 DNS 名称相互调用。DNS 名称的格式为 `service-name.namespace-name`。例如,如果你的服务名称是 `my-service`,命名空间是 `my-namespace`,那么 DNS 名称就是 `my-service.my-namespace`。
在你的应用程序代码中,使用这个 DNS 名称来解析服务地址并进行调用。🎉
例如,使用 `curl` 命令:
curl http://my-service.my-namespace:8080
如果使用 Fargate 启动类型,需要确保你的 VPC 配置了 DNS 解析。启用 VPC 的 DNS 主机名和 DNS 解析。
确保你的安全组允许服务之间的流量。允许服务之间的端口上的 TCP 流量。🛡️
总结: 通过以上步骤,你可以成功配置 AWS ECS 服务发现,实现服务之间的相互调用。记得检查 IAM 权限、网络配置和安全组设置。 🤓
提示: 可以使用 AWS CLI 或 AWS SDK 来自动化这些步骤。
```