API Gateway访问Cloud Map端口5000服务遇500错误排查求助
问题诊断与解决方案
核心问题:集成URI配置错误
你当前的aws_apigatewayv2_integration中使用了Cloud Map服务的ARN作为integration_uri,这不符合HTTP_PROXY集成的要求。API Gateway HTTP_PROXY集成需要的是可解析的服务域名+端口,而非Cloud Map的ARN。Cloud Map的作用是让API Gateway能通过域名解析到ECS任务的IP,但集成URI必须直接指向服务的访问地址。
具体修复步骤
1. 修正集成URI配置
将integration_uri改为Cloud Map服务的域名(格式通常为{service-name}.{namespace}.local,可从Cloud Map控制台获取)加上服务端口。如果你的ECS服务现在用80端口,配置如下:
resource "aws_apigatewayv2_integration" "integration" { api_id = aws_apigatewayv2_api.api.id integration_type = "HTTP_PROXY" # 替换为你的Cloud Map服务域名+端口 integration_uri = "http://ecs-discovery-service.your-namespace.local:80" integration_method = "ANY" connection_type = "VPC_LINK" connection_id = aws_apigatewayv2_vpc_link.vpc_link.id payload_format_version = "1.0" # 启用DNS缓存优化服务发现性能 enable_dns_cache = true }
2. 确保安全组规则正确
- VPC Link安全组:需要允许出站流量到ECS服务所在安全组的目标端口(80或5000)。
- ECS服务安全组:需要允许来自VPC Link安全组的入站流量到服务端口。
示例安全组Terraform配置:
# VPC Link安全组 resource "aws_security_group" "vpc_link_sg" { name = "vpc-link-sg" description = "Allow outbound to ECS service" vpc_id = var.vpc_id egress { from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = [var.ecs_service_subnet_cidrs] # ECS服务所在子网的CIDR } } # ECS服务安全组 resource "aws_security_group" "ecs_service_sg" { name = "ecs-service-sg" description = "Allow inbound from VPC Link" vpc_id = var.vpc_id ingress { from_port = 80 to_port = 80 protocol = "tcp" security_groups = [aws_security_group.vpc_link_sg.id] } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } }
更新VPC Link的安全组引用:
resource "aws_apigatewayv2_vpc_link" "vpc_link" { name = "test" subnet_ids = var.ecs_service_subnet_ids security_group_ids = [aws_security_group.vpc_link_sg.id] }
3. 补充检查点
- 验证Cloud Map DNS解析:在VPC内的EC2实例执行
nslookup ecs-discovery-service.your-namespace.local,确认能解析到ECS任务的IP。 - 启用API Gateway日志:开启访问日志功能,查看具体错误详情(如DNS解析失败、连接拒绝等),进一步定位问题。
内容的提问来源于stack exchange,提问作者Jeppe Christensen
相关产品推荐
相关产品推荐

