🗂
CDKでNatGatewayのIPアドレスをOutputsに出力する
概要
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