如何配置AWS Cloud Map为S3静态网站创建DNS别名及Terraform实现
解决方案
你无法手动修改Cloud Map托管的Route53私有托管区记录,可通过注册Cloud Map CNAME类型服务实例的方式实现需求,具体逻辑为:在你的private-namespace私有命名空间下创建对应服务,注册CNAME类型实例指向S3静态网站端点,由Cloud Map自动生成托管区的DNS记录,不需要手动操作Route53。
核心配置说明
- Cloud Map服务配置DNS记录类型为
CNAME - 服务实例指定
AWS_INSTANCE_CNAME属性为S3静态网站域名mybucket.s3-website-eu-west-1.amazonaws.com - 生成的DNS记录自动匹配
mys3website.private-namespace指向目标S3端点
Terraform 实现代码
首先如果已经存在现有的Cloud Map私有命名空间,可通过数据源引用,若需新建也可直接定义资源:
# 可选:引用已有的私有DNS命名空间,新建的话替换为aws_service_discovery_private_dns_namespace资源 data "aws_service_discovery_private_dns_namespace" "existing" { name = "private-namespace" # 替换为你命名空间关联的VPC ID vpc = "vpc-xxxxxx" } # 创建Cloud Map服务,指定DNS配置为CNAME类型 resource "aws_service_discovery_service" "s3_website" { name = "mys3website" namespace_id = data.aws_service_discovery_private_dns_namespace.existing.id dns_config { dns_records { ttl = 300 type = "CNAME" } # 私有命名空间默认路由策略为加权,此处可省略 routing_policy = "WEIGHTED" } } # 注册服务实例,指向S3静态网站端点 resource "aws_service_discovery_instance" "s3_website" { instance_id = "s3-website-instance" service_id = aws_service_discovery_service.s3_website.id attributes = { AWS_INSTANCE_CNAME = "mybucket.s3-website-eu-west-1.amazonaws.com" AWS_INSTANCE_PORT = "80" # S3静态网站默认HTTP端口为80,HTTPS需搭配CloudFront/ALB使用 } }
注意事项
- 关联该私有命名空间的VPC需开启DNS解析和DNS主机名选项,否则无法正常解析记录
- 需提前确认S3存储桶已开启静态网站托管,且桶策略允许对应VPC内的IP段访问资源
- S3静态网站原生仅支持HTTP访问,如需HTTPS可在前端部署ALB或CloudFront,再将Cloud Map CNAME指向ALB/CloudFront域名
- 配置生效后可在VPC内ECS/EC2实例上直接解析
mys3website.private-namespace验证指向是否正确
内容的提问来源于stack exchange,提问作者hertzsprung
相关产品推荐
相关产品推荐

