😎

CDKでほかのスタックのリソースを参照したいとき

2022/01/15に公開

CDK でほかのスタックにあるリソースを参照したい

そんなときがよくあります。手順をおさらいしてみましょう。

この記事では共有したいリソースがあるスタックを MainStack 、共有されたリソースを参照するスタックを SubStack とします。

共有したいリソースをエクスポートする

まずは共有したいリソースがあるスタックにて、リソースをエクスポートします。

main-stack.ts
import { Stack, StackProps } from "aws-cdk-lib";
import { Vpc, SubnetType } from "aws-cdk-lib/aws-ec2";
import { Construct } from "constructs";

export class MainStack extends Stack {
  public readonly vpc: Vpc; // ✅ 別スタックで読み込めるようにする

  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const vpc = new Vpc(this, "vpc", {
      cidr: "10.0.0.0/16",
      maxAzs: 2,
      subnetConfiguration: [
        {
          name: "Public",
          cidrMask: 24,
          subnetType: SubnetType.PUBLIC,
        },
      ],
    });

    this.vpc = vpc; // ✅ リソースを出力する
  }
}

上記のコメント部分がある箇所で、リソースを共有しています。

まずは出力、そのあとに共有するための設定を行うことで、別スタックから MainStack のリソースを参照できるようにします。

App コンストラクトで値を渡す

次に bin 配下にある App コンストラクトを作成するファイルにて、SubStackMainStack のリソースを渡します。

sample.ts
import * as cdk from "aws-cdk-lib";
import { MainStack } from "../lib/main-stack";
import { SubStack } from "../lib/sub-stack";

const app = new cdk.App();

const mainStack = new MainStack(app, "MainStack", {});

new SubStack(app, "SubStack", {
  vpc: mainStack.vpc,// ここでリソースを渡す
});

先ほどと同様にコメント部分を追加します。

必ず共有したいリソースのあるスタックを変数化して、上記のような記述でパラメータを設定してください。

別スタックのリソースを参照する

最後に別スタックのリソースを参照します。

sub-stack.ts
import { Stack, StackProps } from "aws-cdk-lib";
import { SecurityGroup, Vpc } from "aws-cdk-lib/aws-ec2";
import { Construct } from "constructs";

// ✅ 別スタックからのリソースを扱えるように interface を作成
interface SubStackProps extends StackProps {
  vpc: Vpc;
}

export class SubStack extends Stack {
  // ✅ Props は事前に定義した SubStackProps を使う
  constructor(scope: Construct, id: string, props: SubStackProps) {
    super(scope, id, props);

    new SecurityGroup(this, "test-sg", {
      vpc: props.vpc, // ✅ MainStack のリソースを使用
    });
  }
}

interface を作成して、このスタック用の Props を用意します。

MainStack にて共有されたリソースを使用する場合は、props.vpc のような記述で使用することが可能です。

まとめ

おさらい程度の記事です。参考になれば幸いです。

CDK 最高〜🚀

おわり

GitHubで編集を提案

Discussion