如何在AWS CDK中让Route53的ARecord指向跨栈部署的EC2实例?
AWS CDK跨栈创建Route53 ARecord指向动态IP的EC2实例
解决方案步骤:
1. 在EC2栈中导出实例的公网IP
修改ec2-stack.ts,创建EC2实例后添加栈输出,暴露实例的公网IP:
import * as ec2 from 'aws-cdk-lib/aws-ec2'; import * as cdk from 'aws-cdk-lib'; export class Ec2Stack extends cdk.Stack { // 定义公共属性,用于暴露EC2公网IP public readonly ec2PublicIp: cdk.CfnOutput; constructor(scope: cdk.App, id: string, props?: cdk.StackProps) { super(scope, id, props); // 从共享栈导入VPC(替换为你的共享VPC名称) const vpc = ec2.Vpc.fromLookup(this, 'SharedVpc', { vpcName: 'shared-stack/MyVpc' }); // 创建EC2实例,确保分配公网IP const ec2Instance = new ec2.Instance(this, 'AppInstance', { vpc: vpc, instanceType: ec2.InstanceType.of(ec2.InstanceClass.T2, ec2.InstanceSize.MICRO), machineImage: ec2.MachineImage.latestAmazonLinux2(), vpcSubnets: { subnetType: ec2.SubnetType.PUBLIC // 必须部署在公有子网 }, assignPublicIp: true // 显式开启公网IP分配 }); // 导出EC2公网IP,供其他栈引用 this.ec2PublicIp = new cdk.CfnOutput(this, 'Ec2PublicIp', { value: ec2Instance.instancePublicIp, exportName: 'Ec2PublicIp' }); } }
2. 在路由栈中导入EC2公网IP并创建ARecord
修改routing-stack.ts,导入EC2栈的输出值,作为ARecord的目标:
import * as route53 from 'aws-cdk-lib/aws-route53'; import * as cdk from 'aws-cdk-lib'; export class RoutingStack extends cdk.Stack { constructor(scope: cdk.App, id: string, props?: cdk.StackProps) { super(scope, id, props); // 创建Route53公网托管区 const vegafolioZone = new route53.PublicHostedZone(this, "MyZone", { zoneName: "mywebsite.com", }); // 导入EC2栈导出的公网IP const ec2PublicIp = cdk.Fn.importValue('Ec2PublicIp'); // 创建ARecord指向动态获取的EC2公网IP new route53.ARecord(this, "ARecord", { zone: vegafolioZone, recordName: "app.mywebsite.com", target: route53.RecordTarget.fromIpAddresses(ec2PublicIp) }); } }
3. 确保栈的部署顺序
在CDK应用入口文件(如bin/app.ts)中,按依赖顺序部署栈:
import * as cdk from 'aws-cdk-lib'; import { SharedStack } from '../lib/shared-stack'; import { Ec2Stack } from '../lib/ec2-stack'; import { RoutingStack } from '../lib/routing-stack'; const app = new cdk.App(); const sharedStack = new SharedStack(app, 'SharedStack'); const ec2Stack = new Ec2Stack(app, 'Ec2Stack', { vpc: sharedStack.vpc // 传递共享VPC给EC2栈 }); ec2Stack.addDependency(sharedStack); const routingStack = new RoutingStack(app, 'RoutingStack'); routingStack.addDependency(ec2Stack);
关键说明:
- 每次EC2实例重新部署(如配置修改、实例替换),CDK会自动更新栈输出的公网IP,同步更新Route53的ARecord记录
- 必须确保EC2实例部署在公有子网且开启
assignPublicIp,否则无法获取公网IP - 生产环境更推荐用Application Load Balancer(ALB)转发流量到EC2,Route53用Alias指向ALB的固定DNS,彻底避免IP变化的影响
内容的提问来源于stack exchange,提问作者Seungho Lee
相关产品推荐
相关产品推荐

