我的设置如下: 我有一个由 3 个子网组成的 VPC:公共子网、带 NAT 的私有子网和隔离子网。我有一个在带 Nat 的私有子网中运行的 elastic beanstalk(单实例)环境,它可以正常工作。
我想要实现的目标: 有一个私人托管区域,其中有指向我的私人 EB 环境的记录。
我正在努力解决的问题: 我的 EB 环境的环境 DNS 指向其民众IP(由于位于私有子网中,因此无法访问,这很好)。但要创建指向我的私有 EB 环境的 DNS 记录,我需要私人的我的环境的端点,对吗?如何获取与我的环境的公共 URL(例如 myapp.eu-central-1.elasticbeanstalk.com)类似的 URL,但解析为我的私有 IP,而不是公共 IP?
答案1
我们遇到了同样的问题,最终选择了你在评论中提到的方法——在route53 记录。
然而,我们能够使该过程自动化,主要是:
将 EB ENV 添加到目标 Route 53 记录
找出托管区域 ID您将要更新的域。将列在托管区域53 号公路的一部分,看起来像Z1GP4MFDYUK339
选择一个记录名称您需要在该区域内更新。将类似于subdomain.example.com
在您的 Elastic Beanstalk 中环境属性添加以下内容:
HOSTED_ZONE
--> 托管区域 IDAPP_DOMAIN
--> 记录名称
创造.ebextensions 命令部署时更新记录
在您的应用程序的项目(根)目录中创建以下文件
.ebextensions/99_dns.config
内容99_dns.config
:
commands:
01_update_r53:
command: |
IP=$(curl --silent http://169.254.169.254/latest/meta-data/local-ipv4)
APP_DOMAIN=$(/opt/elasticbeanstalk/bin/get-config environment -k APP_DOMAIN)
HOSTED_ZONE=$(/opt/elasticbeanstalk/bin/get-config environment -k HOSTED_ZONE)
echo "{\"Comment\":\"Update IP\",\"Changes\":[{\"Action\": \"UPSERT\",\"ResourceRecordSet\":{\"Name\":\""$APP_DOMAIN".\",\"Type\":\"A\",\"TTL\":60,\"ResourceRecords\":[{\"Value\":\""$IP"\"}]}}]}" > awsr53.json
aws route53 change-resource-record-sets \
--hosted-zone-id "$HOSTED_ZONE" \
--change-batch file://awsr53.json
当你的应用程序部署后它将:
- 查询其本地(私有)IP 地址
- 从 ENV 中获取你设置的
APP_DOMAIN
和值HOSTED_ZONE
- 使用
aws
cli 创建/更新记录,使其HOSTED_ZONE@RECORD
成为A
具有私有地址值的记录
答案2
Matt 的答案对我很有用,很有效。但我不得不做一些改变:
commands:
01_update_r53:
command: |
IMDSTOKEN=$(curl --silent -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
IP=$(curl --silent -H "X-aws-ec2-metadata-token: $IMDSTOKEN" http://169.254.169.254/latest/meta-data/local-ipv4)
AWS_R53_APP_DOMAIN=$(/opt/elasticbeanstalk/bin/get-config environment -k AWS_R53_APP_DOMAIN)
AWS_R53_HOSTED_ZONE=$(/opt/elasticbeanstalk/bin/get-config environment -k AWS_R53_HOSTED_ZONE)
echo "{\"Comment\":\"Update IP\",\"Changes\":[{\"Action\": \"UPSERT\",\"ResourceRecordSet\":{\"Name\":\""$AWS_R53_APP_DOMAIN".\",\"Type\":\"A\",\"TTL\":60,\"ResourceRecords\":[{\"Value\":\""$IP"\"}]}}]}" > awsr53.json
aws route53 change-resource-record-sets --hosted-zone-id "$AWS_R53_HOSTED_ZONE" --change-batch file://awsr53.json
这需要分配给实例使用的服务角色权限,以便在 Route53 上执行 upsert。我建议先通过 SSH 执行前面提到的脚本进行调试