4
4

More than 3 years have passed since last update.

CDK で自動生成されるたくさんのリソースを個別に参照する

Posted at

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.instanceIdCfnEIP に渡せばよい

探し方

findChild() で探す名前は CDK 中で構築される階層構造から探す。探す方法としては、一度 cdk synth して CloudFormation テンプレートを出力し、メタデータから探す方法しか今の所把握していない (いい感じの方法あったら教えてほしいです)。

例えば前述の例で出力される CloudFormation テンプレートの NAT インスタンス部分を抜粋すると以下のようになっている

  myvpcPublicSubnet1NatInstanceXXXXXXXX:
    Type: AWS::EC2::Instance
    Properties:
    ...
    Metadata:
      aws:cdk:path: MyStack/myvpc/PublicSubnet1/NatInstance/Resource

Metadata のパスを見ることで、生成される Construct のツリー構造がわかるのでココから探せば良い。

他の ConstructNode API についてのドキュメントはこちら

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4