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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 23:20:45