问题描述
在AWS中有多个账户(根账户、开发、演练、生产),这些账户通过Terraform Cloud作为独立的工作空间进行管理。在开发、演练和生产环境中,用户有一个负载均衡器用于路由请求到ECS和其他资源。用户想要使用同一个域名来指向每个环境,并根据以下路径进行路由:
– dev.mydomain.com
=> 开发环境负载均衡器
– stage.mydomain.com
=> 演练环境负载均衡器
– mydomain.com
=> 生产环境负载均衡器
如果所有环境都在一个AWS账户/工作空间中,那么通过获取静态IP的输出,并将其添加到每个子域名的Route 53 A记录中,这将很容易实现。但是,在跨多个AWS账户的情况下,是否能实现这一点?或者有没有更好的模式可以遵循来实现这一目标?
解决方案
请注意以下操作可能涉及AWS服务和Terraform的版本差异,务必进行测试和备份。
使用Route 53子域名委派
一个简单的方法是将每个账户的子域名委派给该账户的Route 53服务。通过这样做,允许Terraform使用的凭据不仅可以在开发环境中创建负载均衡、服务器和其他资源,还可以创建/更新/删除相应子域名下的DNS记录。每个账户的DNS记录都被保持独立,就像其他资源一样。
操作步骤如下:
1. 在开发、演练和生产账户的Route 53中,分别创建一个公共域名,比如dev.mydomain.com
、stage.mydomain.com
和mydomain.com
。
2. 记下在每个子域名(例如dev.mydomain.com
)的Route 53中报告的DNS服务器列表。
3. 在根账户的Route 53中,为每个子域名(dev.mydomain.com
、stage.mydomain.com
、mydomain.com
)添加NS记录,指向相应子域名的Route 53 DNS服务器列表。
这样做之后,每个账户的Terraform工作空间都可以使用相应的凭据来管理与环境相关的资源和DNS记录,实现统一的域名路由。
解决SSL证书问题
用户提到在请求SSL证书时遇到问题,因为aws_acm_certificate
需要一个“完全合格的域名”(FQDN)。一个解决办法是在对应账户的ACM(AWS证书管理)中请求证书,而不是在根账户的ACM中请求证书。
例如,对于dev.mydomain.com
子域名,应该从开发环境的ACM中请求证书,而不是从根账户的ACM中请求。这将确保证书与正确的环境关联,以解决“完全合格的域名”问题。
总结
通过使用Route 53子域名委派,您可以跨多个AWS账户实现域名路由,并且每个账户都可以管理自己的DNS记录。同时,根据环境,您可以在相应账户的ACM中请求SSL证书,以确保证书与正确的环境关联。这种模式将为您的多环境部署提供一种灵活且可维护的方法。
请注意,在实际操作中,根据您的具体情况可能需要进行适当的调整和测试。