CDKの新機能であるcdk importを触ってみた

こんにちは。 エキサイト株式会社で内定者アルバイトをしている平石です。

今回はAWS CDKのv2.20.0(Release v2.20.0 · aws/aws-cdk · GitHub)でプレビューとなっているcdk importを使ってみようと思います。

前の記事

tech.excite.co.jp

AWS CDKとは?

AWS CDKについては以下の記事で解説しているので、興味があればそちらもご確認ください。

tech.excite.co.jp

cdk importとは?

AWS CDKを使っていて、既存のリソースをCDKで管理したいな〜と思ったことはないでしょうか。

どうせCDKを使うなら新しく作成する一部のリソースだけではなく、すでに作成したリソースもCDKで操作したいですよね。

その願いを叶えてくれるのが、cdk importなのです。

実は、この機能が登場する前にもCloudFormationを経由することで、既存のリソースをスタックの配下に置くことは可能だったようです。しかし、この方法はかなり面倒でした。

cdk imortでは、このようなリソースをスタックの配下におくという操作を簡単に行うことができます。

では実際にやってみよう

CDK外でのリソースの作成

今回はデモのため、VPCをimportすることを考えますが、どのようなリソースでも同じような操作でインポートすることができます。ただし、サポートされていないリソースも存在するので注意してください。
cdk importでサポートされているリソースについてはこのページを参照してください(Resources that support import and drift detection operations - AWS CloudFormation)。

まずは、AWSのマネジメントコンソール上でVPCを作成します。今回はサブネットは生成せずVPC本体のみを作成しますので、「作成するリソース」は「VPCのみ」を指定します。

作成したVPCは以下のようになります。ほとんどデフォルト設定のままです。

CDK側の操作

では、このリソースをCDKの管理下におきましょう。まずは、CDKアプリケーションをデプロイして、コードの状態をAWSに反映させておきます。

cdk deploy

cdk diffでコード側に変更がないことを確認しておきましょう。

その後、リソースを追加したいスタックのクラスに以下のようなコードを追加します。

        Vpc vpc = Vpc.Builder.create(this, "ImportedVPC")
                .subnetConfiguration(List.of())
                .build();

サブネットを一つも持たないVPCを定義しています。ちなみにsubnetConfiguration(List.of())がないと、VPCのL2コンストラクVpcはデフォルトで2つのAvailability ZoneにPrivateサブネットとPublicサブネットを勝手に作成してしまいます。

このように、AWS CDKにおけるデフォルト値を把握しておかないと、思わぬリソースを生成してしまう可能性があるため注意してください。

ここでcdk diffを実行して、VPCが反映されていることを確認しましょう。

いよいよ、cdk importしていきましょう。

cdk import

これを実行すると以下のようにVpcIdの入力を促されます。

インポートしようとしているVPCのIDはvpc-0fa86280cc45e13dbですのでこれを入力します。

たったこれだけでCDK外で作成したVPCのインポートが完了します!

ドリフトで差分を検出

しかし、実はこれでは終わりません。この段階ではCDKのコード側のVPCの設定は実際のAWSで稼働しているVPCの設定と一致していません。

これは、 CDKのコード側でcidrvpcNameを設定しておらず、デフォルトの設定が反映されてしまっていることが原因のようです。

この辺りを、よしなにやってくれない部分はcdk importの不便な部分ではあります。

では、この不一致を解決していきましょう。

そのためには、ドリフトの検出という操作を行います。これを行うことでCDK上のリソースとAWS上のリソースの間の差分を検出してくれます。

マネジメントコンソールでスタック一覧を開き、今回リソースを置くスタックの詳細で「スタックアクション」→「ドリフトの検出」をクリックします。

その結果、「ドリフトステータス」が

となっていれば差分はなく、同期している状態なので特に操作は必要ありません。

一方、今回の場合は、

となっており、差分が存在しているため、CDK側で調整が必要です。

この差分を表示するには「スタックアクション」→「ドリフト結果を表示」をクリックします。

下の画像のように差分があるリソースに「MODIFIED」と表示されます。

このリソースを選択して「ドリフトの詳細を表示」をクリックすると全ての差分が表示されます。

この画面では差分の詳細と、対応箇所の設定がJSON形式で表示されます。また、「違い」の各項目を選択すると、「詳細」で対応箇所がハイライトされます。

これをもとに、CDKのコードを修正していきましょう。今回は、CidrBlockをAWSで利用しているCidrBlockに変更し、EnableDnsHostnamesを「false」に、Nameを「import-sample-vpc」に変更します。

        Vpc vpc = Vpc.Builder.create(this, "ImportedVPC")
                .vpcName("import-sample-vpc")
                .subnetConfiguration(List.of())
                .cidr("cidr")
                .enableDnsHostnames(false)
                .build();

これで、

cdk deploy

を実行すれば、CDKでの変更が反映されます。

うまく差分を解消できたことを確認するには?

前節でドリフトの詳細から差分を確認し、コードを変更する手順をご紹介しましたが、デプロイする前に差分が解消され余計な変更が増えていないことを確認するにはどうすれば良いのでしょうか?

実は、このような確認を行う方法は現在のところ公式にはサポートされていないようです。

ですので 、cdk diffで変更箇所を目視で確認するか、変更箇所のテストを書くかになるかと思います。

気がつかないうちに余計な変更が加わったりしないように、注意して差分の解消を行うようにしましょう。

詳しいことは別の記事でまとめようと思います。

終わりに

今回は、マネジメントコンソールなどの、AWS CDKやCloudFormation外で作成されたリソースをCDKの管理下におくための最新機能であるcdk importを紹介しました。

では、また次回。

次の記事

tech.excite.co.jp

参考文献