CDKでクロススタック参照するリソースを作成したとき
CDKで複数スタックを定義して、スタック間でリソースを共有したいケースはよくあると思います。
スタックAで定義したLambda関数をスタックBでも使いたい、とかそういう感じのやつです。
基本的にCDKは頭がいいので、渡したいリソースを適当に変数にでも入れて別のスタックに引き渡してやれば、明示的にアウトプットを定義してやらなくても勝手に依存関係を理解していい感じにしてくれますよね。
しかし、いざクロススタック参照していたリソースを削除しようとすると、CloudForamtionがこんな感じにエラーを出してきます。
Export StackA:ExportsOutputFnGetAttLambdaFnstacka07BAF5DArn93F62DF0 cannot be deleted as it is in use by StackB
どうしてですか?
CDKは賢いので、StackAで作成したLambdaがStackBで使われなくなった事に気付いてアウトプットを削除します。
そしてcdk deploy
を走らせると、StackBはStackAに依存しているため、先にStackAのデプロイが走ります。
そう!!StackBより先に!!StackAを更新しようとするのである!!!
そうすると、LambdaがStackBで使われているためアウトプットの削除が出来ないのです。
解決方法
先にStackBだけ単体で更新する
まあ、当然といえば当然なのですが、StackBを先に単体で更新してからStackAを更新するとうまくいきます。
cdk deploy -e StackB
デプロイ時にオプション-e
をつけると、指定したスタックのみ更新してくれます。
これでStackBからStackAのLambdaを参照しなくなり、依存関係がなくなったため、以降は前述のエラーなくStackA、StackB共にデプロイできるようになるはずです。
めでたし!!!!!!!!!!
知らなかったの私だけかもしれないですけどね!!
なかなか-e
オプションにたどり着けなかったので……。
ちゃんとドキュメントを読みましょうというお話でした。
ドキュメントを読もう:AWS CDK Toolkit (cdk command)