You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过AWS CDK获取AWS账户中已配置的Route 53托管区列表?

获取AWS Route53托管区ID列表的AWS CDK实现方案

AWS CDK的设计定位是基础设施即代码工具,核心是定义和部署预配置的云资源,因此没有直接提供类似AWS CLI list-hosted-zones的全局资源查询方法,这也是为什么HostedZone类仅提供from_lookup()(需已知域名或ID)的原因。以下是几种可行的实现方式:

方法1:在CDK中直接调用AWS SDK(boto3)

你可以在CDK代码中通过boto3调用Route53的API来获取所有托管区ID,这种方式在CDK synth阶段本地执行,需要本地环境配置好AWS凭证(具备Route53的读取权限)。

示例代码:

import boto3
from aws_cdk import Stack
from constructs import Construct

class MyStack(Stack):
    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)
        
        # 初始化Route53客户端
        route53_client = boto3.client('route53')
        # 获取所有托管区
        response = route53_client.list_hosted_zones()
        # 提取托管区ID列表(截取ID中最后一段有效标识)
        hosted_zone_ids = [zone['Id'].split('/')[-1] for zone in response['HostedZones']]
        
        # 可在此处使用ID列表执行后续操作,比如打印或传入其他资源配置
        print("托管区ID列表:", hosted_zone_ids)

方法2:使用CDK自定义资源(Custom Resource)

如果需要在部署阶段动态获取托管区ID(比如用于后续资源的动态配置),可以通过自定义资源触发Lambda函数调用Route53 API,这种方式的权限由CDK部署的IAM角色管理,无需本地凭证。

示例代码:

from aws_cdk import (
    Stack,
    CustomResource,
    aws_lambda as _lambda,
    aws_iam as iam,
    custom_resources as cr,
)
from constructs import Construct

class MyStack(Stack):
    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)
        
        # 创建Lambda函数,用于调用Route53 API获取托管区列表
        list_hosted_zones_lambda = _lambda.Function(
            self, "ListHostedZonesLambda",
            runtime=_lambda.Runtime.PYTHON_3_11,
            handler="index.handler",
            code=_lambda.Code.from_inline("""
import boto3
import json

def handler(event, context):
    route53 = boto3.client('route53')
    response = route53.list_hosted_zones()
    hosted_zone_ids = [zone['Id'].split('/')[-1] for zone in response['HostedZones']]
    return {
        'Data': {
            'hosted_zone_ids': hosted_zone_ids
        }
    }
"""),
        )
        
        # 给Lambda添加读取Route53托管区的权限
        list_hosted_zones_lambda.add_to_role_policy(
            iam.PolicyStatement(
                actions=["route53:ListHostedZones"],
                resources=["*"]
            )
        )
        
        # 创建自定义资源,触发Lambda执行
        hosted_zones_resource = CustomResource(
            self, "HostedZonesCustomResource",
            service_token=cr.Provider(self, "HostedZonesProvider", on_event_handler=list_hosted_zones_lambda).service_token
        )
        
        # 获取自定义资源返回的ID列表,可用于后续资源配置
        hosted_zone_ids = hosted_zones_resource.get_att_string_list("hosted_zone_ids")

方法3:通过CDK上下文参数传入预获取的ID

如果不需要动态获取,可以先通过AWS CLI命令提取托管区ID列表:

aws route53 list-hosted-zones --query "HostedZones[].Id" --output text | tr '\t' ','

然后将ID列表作为CDK上下文参数传入部署命令:

cdk synth -c hosted_zone_ids="Z0123456789ABCDEFGHIJ,Z0987654321JKLMNOPQRS"

在CDK代码中读取该参数:

from aws_cdk import Stack
from constructs import Construct

class MyStack(Stack):
    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)
        
        # 从上下文获取托管区ID列表
        hosted_zone_ids = self.node.try_get_context('hosted_zone_ids').split(',')
        print("托管区ID列表:", hosted_zone_ids)

内容的提问来源于stack exchange,提问作者Varun Jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 15:12:55