Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CDK クロススタック参照問題と起こった時の解決法

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for ShuntaToda ShuntaToda
November 12, 2025
440

CDK クロススタック参照問題と起こった時の解決法

Avatar for ShuntaToda

ShuntaToda

November 12, 2025
Tweet

More Decks by ShuntaToda

Transcript

  1. スタックのコンストラクタのpropsを通じてリソースを渡す // Stack1でリソースを作成 export class Stack1 extends Stack { public

    readonly topic: sns.Topic; constructor(scope: Construct, id: string, props: StackProps) { super(scope, id, props); this.topic = new sns.Topic(this, 'MyTopic'); } } // Stack2でpropsで受け取る const stack1 = new Stack1(app, 'Stack1'); const stack2 = new Stack2(app, 'Stack2', { topic: stack1.topic, // ← propsで渡す }); 特徴 CDKが自動的に依存関係を管理(Export/Importを自動生成) TypeScriptの型チェックが効く パターン1:propsによる参照 9
  2. CfnOutputでExportし、Fn.importValueでImportする // Stack1でCfnOutputを使ってExport export class Stack1 extends Stack { constructor(scope:

    Construct, id: string, props: StackProps) { super(scope, id, props); const topic = new sns.Topic(this, 'MyTopic'); new CfnOutput(this, 'TopicArn', { value: topic.topicArn, exportName: 'Stack1:TopicArn', // ← Export名 }); } } // Stack2でImportValueを使って参照 const topicArn = Fn.importValue('Stack1:TopicArn'); 特徴 CloudFormationのExport/Importを明示的に使用 パターン2:CfnOutputによる参照 10
  3. ある作業をしていた時、以下のようなエラーが発生しました エラー内容 export Stack1:ExportsOutputTopic as it is in use by

    Stack2 後からわかったエラーの理由 Stack1でSNS Topicを作成し、propsでStack2に渡す Stack2で別のリソースを作成し、CfnOutputでStack1に渡す 後からStack1でTopicを削除・変更しようとする → 意図せず循環参照が発生していた! 作成したリソースを編集するときに参照エラー 12
  4. 依存関係の図 循環参照の仕組み Stack1 → Stack2(CfnOutputで明示的にExport) Stack2 → Stack1(propsで渡す = CDKが自動でExport生成)

    お互いのリソースを参照してデッドロックが発生 結果: 変更・削除がブロックされる 循環参照 13
  5. 擬似的にStack2にCfnOutputを作成して、エラーにならないようにする // Stack1でダミーのExportを作成 new CfnOutput(this, 'DummyTopicArn', { value: 'arn:aws:sns:ap-northeast-1:123456789012:dummy-topic', //

    ←ここを文字列に置き換え exportName: 'Stack1:ExportsOutputTopic', // 同じExport名 }); CDK は「参照できる」と認識し、エラーなくデプロイできる ↓この記事が参考になりました。 https://qiita.com/ufoo68/items/9d98e70fbb8f021b57f4 擬似的な値をCfnOutputで用意 17
  6. 最初のアプローチ(うまくいかなかった) 1. エラーメッセージを読む 2. CDKのコードを見る 3. どこで参照が起きているか推測 4. コードを修正 5.

    デプロイ → また失敗 問題点 CDKコードが複雑で追いきれない ラッパークラスで隠蔽されている 自動生成されるリソースが見えない 推測だけで修正しても当たらない 教訓2:エラー解析のアプローチミス 23
  7. 1. エラーメッセージを読む → どのリソース間で循環参照が起きているか確認 2. CloudFormationテンプレートを直接読む 3. テンプレートからImport/Exportを確認 4. 実際にどのリソースが何を参照しているか特定

    5. 根本原因を理解してから修正 CloudFormationテンプレートは シンプルで正しい情報です CDKコードで特定しづらいときにはおすすめです マネジメントコンソールでの場所 CloudFormation→スタック→Stack名→テンプレート 試すといいアプローチ 24