🗂

CDKでNatGatewayのIPアドレスをOutputsに出力する

2025/03/11に公開

概要

CDKで作成した別スタックで定義されたNatGatewayのIPアドレスを取得したくなった。
別スタックから取得できるように
ALBのリスナーでNatGatewayを通る通信だけ許可したかったため。

# やり方

// NatGatwayのPublicIpを取得する関数
const getNatgwIp = (vpc: IVpc): string[] => {
    // vpcにあるnat gatwayを全て取得する
    const natgws = vpc.node.findAll().filter(
        (child) => child instanceof aws_ec2.CfnNatGateway
    ) as aws_ec2.CfnNatGateway[];

    // natgatewayに付与されるallocationIdを取得
    const allocIds = natgws.map(gw => gw.allocationId);

    // ElasticIpを全て取得
    const eips = vpc.node.findAll().filter(
        (child) => child instanceof aws_ec2.CfnEIP
    ) as aws_ec2.CfnEIP[];

    // eipの中でnatgatwayに付与されているもののipアドレスを返す
    const ips = eips
        .filter(eip => allocIds.includes(eip.attrAllocationId))
        .map(eip => eip.attrPublicIp);

    return ips;
};

// NatGatewayのIPを取得してOutputsに登録する
natIps = getNatgwIp(vpc)
natIps.forEach((ip, i) => {
    new CfnOutput(this, `natGwIp${i}`, {
        value: ip,
        exportName: `natGwIp${i}`, // Fn.importValue で取得して使う
    }).node.addDependency(vpc);
});

結構めんどくさかったんですけどもっといい方法があるんですかね?

Discussion