如何获取 AWS Route53 托管区域 ID?

How to fetch the AWS Route53 hosted zone id?

我是亚马逊服务及其 API 的新手。

使用 Amazon route53Clinet class,我知道有一种方法 getHostedZone 可以根据 ID 获取托管区域信息。但是我有一个案例,我有域名,我需要获取托管区域 ID 可能是基于提供的域名?我怎样才能做到这一点?

您可以使用 listHostedZoneslistHostedZonesByName 查询有关您的托管区域的服务。

但是...您确实需要知道托管区域 ID -- 存储或缓存它 -- 因为可以在 Route 53 中为完全相同的域创建多个托管区域...并且如果您的代码盲目地按域名搜索托管区域,您最终可能会修改错误的区域......特别是如果您陷入假设只有一个匹配项的反模式陷阱,因此您总是 select 第一个匹配。

简单部署每个域名只有一个托管区域,但您可能拥有多个托管区域的原因包括私有托管区域(只能从您的 VPC 内部访问)或重复的 public 托管区域,其中您正在进行 DNS 重建或硬切换。 Route 53 允许您使用 4 个不同的名称服务器创建第二个(或第三个等)托管区域。

此外,当然,在本地获取此信息以避免发出不必要的 API 请求是有意义的,这会耗费时间和金钱。正如您可能注意到的那样,托管区域 ID 在控制台中也可见。

我知道这可能是旧的,但我在最初创建 DNS 区域时通过执行以下操作能够使用 Powershell 获取 ID:

$route53Script = aws route53 create-hosted-zone --delegation-set-id /delegationset/DELIGATIONID --name domain.com --caller-reference blablabla | ConvertFrom-Json
$Route53ID = $route53Script.HostedZone.Id.replace("/hostedzone/","")

这为我提供了区域 ID,然后我可以将其用作变量来执行此操作:

aws route53 change-resource-record-sets --hosted-zone-id $Route53ID --change-batch file://C:\default.json

我不知道这是否是最好的方法,但它确实有效!我相信您在 PHP 中几乎可以做同样的事情。不过,我已经有一段时间没有在 PHP 中编写一些更大的脚本了。

我使用 AWS CLI 并将 JSON 结果通过管道传输到 jq 工具:

aws route53 list-hosted-zones-by-name | 
jq --arg name "example.com." \
-r '.HostedZones | .[] | select(.Name=="\($name)") | .Id'

jq 表达式选择包含名称 "example.com" 的每个托管区域 JSON 项目。请注意,这可能 return 不止一条记录。

输出是匹配的托管区域 ID 字符串,例如:

/hostedzone/ABCDEF12345678

然后您可以列出托管区域 ID 的资源记录集:

aws route53 list-resource-record-sets \
--hosted-zone-id "/hostedzone/ABCDEF12345678"

这将为您提供包含托管区域 ID 的列表。

aws route53 list-hosted-zones | jq -r '.HostedZones| .[] | .Id'