如何通过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
相关产品推荐
相关产品推荐

