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

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

Avatar for ShuntaToda ShuntaToda
November 12, 2025
190

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

Avatar for ShuntaToda

ShuntaToda

November 12, 2025
Tweet

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