CDK の Higher-level ライブラリと ConstructNode class
CDK の Higher-level Constructs library (高い抽象度で構築できるライブラリ) を使うと単一オブジェクトで複数の CloudFormation リソースが作成できる。たとえば、ec2.Vpc()
,dynamodb.Table()
, s3.Bucket()
のような具合で、これだけでいい感じのリソース群をババっと生成してくれる。
ここで作成される個別の下位リソースをカスタマイズやスタックのアウトプットのために参照したい場合は、ConstructNode
クラスのメソッドにある findChild()
等を使えばよい
具体例
例. VPC を作成し NAT ゲートウェイではなく EC2 NAT インスタンスを作成する。 その EC2 インスタンスに CfnEIP
で EIP を付与するため、NAT インスタンスの instance-id を参照したい。簡単のため、NAT インスタンスは 1つだけ生成されるようにしている
const natInstance = ec2.NatProvider.instance({
instanceType: new ec2.InstanceType('t3.micro')
})
});
const vpc = new ec2.Vpc(this, 'myvpc', {
cidr: '10.128.0.0/16',
natGateways: 1,
natGatewayProvider: natInstance
});
const natIns = vpc.node.findChild('PublicSubnet1').node.findChild('NatInstance') as ec2.Instance;
const natIp = new CfnEIP(this, 'natip', {
instanceId: natIns.instanceId
});
new cdk.CfnOutput(this, 'eip', {
value: natIp.ref
});
NatProvider.instance()
についてはここ参照。
vpc.node.findChild('PublicSubnet1')
で NAT インスタンスが配置されるサブネットを取得し、さらにfindChild('NatInstance')
で下位の NAT インスタンス部分を取得する
あとは natIns.instanceId
を CfnEIP
に渡せばよい
探し方
findChild()
で探す名前は CDK 中で構築される階層構造から探す。探す方法としては、一度 cdk synth
して CloudFormation テンプレートを出力し、メタデータから探す方法しか今の所把握していない (いい感じの方法あったら教えてほしいです)。
例えば前述の例で出力される CloudFormation テンプレートの NAT インスタンス部分を抜粋すると以下のようになっている
myvpcPublicSubnet1NatInstanceXXXXXXXX:
Type: AWS::EC2::Instance
Properties:
...
Metadata:
aws:cdk:path: MyStack/myvpc/PublicSubnet1/NatInstance/Resource
Metadata
のパスを見ることで、生成される Construct のツリー構造がわかるのでココから探せば良い。