😎
CDKでほかのスタックのリソースを参照したいとき
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 コンストラクトを作成するファイルにて、SubStack に MainStack のリソースを渡します。
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 最高〜🚀
おわり
Discussion