😎
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