Terraform创建配置DNS SRV记录的ECS服务报错问题咨询
需要为AWS ECS中每个运行的容器/任务创建DNS条目,经评估SRV记录可满足该需求。使用Terraform 1.2.4版本搭配hashicorp/aws v4.22.0提供商操作时出现如下报错:
│ Error: failed creating ECS service (ecs-service-xxx): InvalidParameterException: When specifying a value for serviceRegistries that is configured to use a type 'SRV' DNS record, you must also enter a value for either 'port' or the 'containerName' and 'containerPort' combination, but not both. Registry: arn:aws:servicediscovery:us-west-1:nnnnnnnnn:service/srv-xxxxxxxxxxx
当前使用的服务发现资源配置如下:
resource "aws_service_discovery_service" "service-discovery-service" { name = "service-discovery-service-${var.environmentName}" dns_config { namespace_id = aws_service_discovery_private_dns_namespace.service-discovery-private-dns-namespace.id dns_records { ttl = 10 type = "SRV" } routing_policy = "MULTIVALUE" } health_check_custom_config { failure_threshold = 1 } }
尝试在dns_records块中添加containerName和containerPort字段时,发现该位置不支持这两个参数,无法完成配置。
报错核心原因是参数配置位置错误:SRV记录要求的端口相关参数不属于aws_service_discovery_service资源的配置项,需要配置在关联该服务发现实例的aws_ecs_service资源的service_registries块中。
配置时需要遵守以下规则:
- 参数二选一:要么仅配置
port字段,要么同时配置container_name和container_port字段,两类参数不能同时填写,否则会触发参数校验错误。 - 如果ECS任务定义中仅包含单容器、且容器只映射了一个端口,直接使用
port指定端口值即可,配置更简便。 - 如果任务包含多个容器、或单个容器映射了多个端口,需要通过
container_name和container_port明确指定要注册到SRV记录的容器与对应端口。
正确的ECS服务配置示例如下:
resource "aws_ecs_service" "ecs-service-xxx" { name = "ecs-service-xxx" cluster = aws_ecs_cluster.main.id task_definition = aws_ecs_task_definition.app.arn desired_count = 2 service_registries { registry_arn = aws_service_discovery_service.service-discovery-service.arn # 配置方式1:直接指定端口,适用于单容器单端口场景 port = 8080 # 配置方式2:指定容器名+容器端口,适用于多容器/多端口场景,和上面的port二选一即可,不要同时配置 # container_name = "your-app-container" # container_port = 8080 } # 其余ECS服务配置(如网络配置、部署策略、容量提供者等)根据实际业务场景补充 }
原有aws_service_discovery_service资源的配置没有问题,不需要修改,在ECS服务资源中补充上述参数后即可解决报错。
内容的提问来源于stack exchange,提问作者user19512567

