【AWS】IaCジェネレーターでマネコン運用からCDK運用へ移行する【IaC】

# はじめに
AWSマネジメントコンソール(マネコン)を利用してAWSサービスを利用したシステムを構築する場合、マネコンのGUI操作により直感的にリソース定義を行うことが可能です。
マネコンでの変更は即座に直接的にそのリソースの定義を変更できるので、何か新機能を試したい場合や動作の検証で一時的に設定値を変えたい場合に便利です。
ただし、定義したリソースが複数に渡り、より大きなシステムになった際にIaC管理して俯瞰して定義内容を把握したり設定値の差分を確認しやすくなることがあります。
今回の記事ではIaCジェネレータを利用して、マネコンを利用して作成したAWSのシステムをIaC管理に移行する手順を解説しています。

# 同様の内容でJAWSイベントにてLTを行いました
↓LT時の資料
IaCジェネレーターはマネコンとCDKの架け橋になれるのか

https://speakerdeck.com/naonana777/iaczieneretahamanekontocdknojia-keqiao-ninarerunoka


↓この記事内容のイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/1dec3d4d-a8be-4bed-9a81-534fb51885b6.png)

# マネコン管理からIaC管理に変更するメリット
・システムの構成やリソースの定義内容をコードで管理するため、差分管理がしやすい
・複数のリソースの画面を1つずつ確認する必要がなくなり、システムの定義内容を一覧で俯瞰して確認できる
・AWS環境に変更内容を適用する前にローカル環境でテストできるので不具合の混入やセキュリティリスクを回避できる

# 既存のAWS環境のシステムを０からCDKアプリケーションをつくる場合の懸念点
・設計書等のドキュメントを参照してCDKのコードを作成することも可能ですが、その場合、設計書がメンテナンスされておらず、設計書の記載と実際の環境の設定があっていない場合があり、設計書を元にコードを書くことで実際の環境との差異があるコードになる懸念があります。
・実際のAWS環境の画面で設定を確認してCDKコードを書くことも可能ですが、リソースが多い場合にリソース設定画面の確認とCDKコード記載の往復を何度も行う必要があり、多大な時間と手間がかかる懸念があります。

# 手順
既存のAWS環境にあるシステムをIaCジェネレータを使用してCDKアプリケーションに変換する手順を解説します

## １．IaCジェネレーターのコンソール画面を表示

- CloudFormationのコンソール画面の左メニューから「IaCジェネレーター」を選択します
![IaCジェネレータスキャン中.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/11dea99f-38af-4dad-8e3e-edd225773f60.png)

## ２．スキャンモードを選択する

- 「新しいスキャンを開始」ボタンを選択するとスキャンモードの選択肢が表示されます
- 「すべてのリソースをスキャン」を選択するとサインインしているAWSアカウントの全リソースがスキャンされます。
- 「特定のリソースをスキャン」を選択するとLambdaやStepFunctionsなどのリソースの種類を選択し、選択したリソース（複数可能）のみスキャンするモードになります
- スキャンの時間は1,000リソースで約10分かかります
- スキャンは無料で行えるので、初回は「すべてのリソースをスキャン」してすべてをスキャンし、変更が加えられたリソースがあれば、「特定のリソースをスキャン」でそのリソースを選択するとよいと思います


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/49b2d353-8ec2-45c6-b6c2-d237a88da2f1.png)

## ３．スキャン結果の確認
- スキャン結果は円グラフとリソースの種類ごとの分類で表示されます
- 円グラフはスキャンしたリソースの種類の構成比率が一目でわかり、一覧表示はスキャンできたリソース名が確認できます

![IaCジェネレータスキャン完了.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/44cc758b-63a8-4cab-86df-01a475bc73dc.png)

## ４．CloudFormationテンプレートの作成
- スキャンされたリソースからCloudFormationテンプレートを作成します


↓「テンプレートを作成」ボタンを選択してテンプレート作成画面に遷移する
![IaCジェネレータテンプレート作成1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/f05d6bde-a103-46c8-9cad-cfd2c4102d21.png)

- 最初のステップではテンプレートの名前と削除ポリシー、置換ポリシーを設定します
  - 削除ポリシー「保持」：スタックの削除やロールバック時にリソースを削除せずに保持する 
  - 置換ポリシー「保持」：スタックの置換(リソースを再作成して新しい物理IDを生成する)が発生した時にリソースを削除せずに保持する 
- 前回作成したテンプレートに対して新しくスキャンしたリソース定義で更新を行う場合は「既存のスタックのテンプレートを更新」を選択します

↓テンプレート作成画面
![IaCジェネレータテンプレート作成2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/1c944950-542d-4850-ab76-5bb6557d0e80.png)

- ステップ2ではスキャンしたリソースからテンプレートに含めたいリソースを選択します。

![IaCジェネレータテンプレート作成3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/38b7fcd8-f5fe-4243-9935-911a1f4e8704.png)

↓スキャンしたリソースを追加
![IaCジェネレータテンプレート作成4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/5c684975-f290-47bb-85cb-c4d4bc656722.png)

- 「関連リソースを追加」では「スキャンしたリソースを追加」で選択したリソースのロールなどの関連リソースが選択肢として提案されます。

↓関連リソースを追加
![IaCジェネレータテンプレート作成5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/8f112158-c709-445e-bd91-d3494956f978.png)

## ５．テンプレートをダウンロード

- テンプレートが作成できたらCloudFormationテンプレートをダウンロードします
- テンプレートの形式はJSONかYAMLのどちらかを選択できます

↓CloudFormationダウンロード画面
![IaCジェネレータテンプレート作成6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/c4a8941e-d146-488b-b998-8d8d376e5280.png)

- この画面ではCloudFormationテンプレート画面をAWS CDKに変換する手順も提案されています
- この画面にあるCDK変換コマンドをコピーしておき、変換ステップで使用します

↓AWS CDK変換手順提案画面
![IaCジェネレータテンプレート作成7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/ed4f2dbe-b3f5-4b9d-a8a0-0cf1694087a2.png)


## ６．CloudFormationテンプレートをAWS CDKアプリケーションに変換

- ローカル環境でCDK変換コマンドを実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/f361f92d-ff18-48d1-81a2-29837d45a1c5.png)

- コマンド実行の結果、CDKアプリケーションが作成されます

↓作成されたCDKアプリケーションのフォルダ
![2_フォルダ作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/f2f9a38b-512c-4f46-9b48-b1c7cb36acd5.png)

- 変換結果のCDKアプリケーションの中には変換されたコード(今回はTypeScript)以外のCDKアプリケーションに必要なファイルやフォルダも作成されます。
 
↓フォルダ構成
![3_フォルダ構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/d430ab9f-ce6d-4927-b796-a65cf055f9c4.png)

- 変換後のTypeScriptのコードはほとんどCloudFormationと同じL1コンストラクトになっています
- L1コンストラクトのままで運用を行うことも可能ですが、抽象化などのCDKのメリットをより活かすにはここから手動でL2コンストラクトに変換する作業が必要になります


↓変換前CloudFormationテンプレート
![cDKコード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/7f466dae-0a7a-4ab2-a929-427dc5ec8972.png)

↓変換後CDKコード
![Cfnコード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/7249907f-2748-4d46-ab12-14bfd9e1b881.png)




# さいごに
CDKに慣れた方であればIaCジェネレーターを利用することなく、0からCDKアプリケーションを作った方が早い人もいらっしゃると思いますがIaCジェネレータを使うことでCDKに慣れていない人でも簡単にCDKアプリケーションを作れるため、チームのCDKの熟練度等と合わせて利用を検討してみてください。