【re:Invent2022】Terraform providers using AWS CloudFormation custom resources

# はじめに
アイレット エンタープライズクラウド事業部の黒野です。
本セッションはラスベガスで開催されるre:InventのDay2で開催されたセッションの感想になります。
普段からTerraformやCloudFormationを使う機会が多いので、何か学べるものがないかと思い参加してきまいした。

## セッション概要
本セッションの主な内容はCloudFormationのカスタムリソースをCloudFormation、AWS CDK、Terraformそれぞれでどのように使用するのか。これについてはデモの実施もありました。
そして、Terraformのモジュール機能についてのメリットの解説となります。
![IMG_8878.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/f6f6f46a-5074-f0df-f807-90a25c7443d4.jpeg)


### セッションレベル
- 300 - Advanced

### トラック
- Customer Enablement (CEN), Architecture (ARC), CEN: BuildOn.AWS

### スピーカー
- Martijn van Dongen, Cloud Evangelist, Schuberg Philis
- Sohan Maheshwar, Senior Developer Advocate, Amazon Web Services

### 参加者
- 合計で100人くらいだと思う。キャパにだいぶ余裕はある感じがした。
- セッション冒頭でアンケートを取っていておおよそこれくらい。
    - Terraformユーザー：7～8割
    - CloudFormationユーザー：6～7割
    - CDKユーザー：2～3割
  
Terraformユーザーは大体CloudFormationユーザーな印象。

### 概要
>Terraform, AWS CloudFormation, and AWS CDK support a broad set of AWS services. Often, users want to automate more and even create resources that are not supported out of the box. In this session, explore how to build CloudFormation custom resources using your chosen programming language or Docker container. This method has been successfully used with CloudFormation and CDK, and it also works well with Terraform. Using Terraform modules, you only have to add a few lines of code to your projects to use a custom provider. Explore how this solution is designed to be secure, simple, future-proof, and reliable.
>
>Terraform、AWS CloudFormation、および AWS CDK は、幅広い AWS のサービスをサポートしています。 多くの場合、ユーザーはより多くの自動化を希望し、すぐにはサポートされていないリソースを作成したいと考えています。 このセッションでは、選択したプログラミング言語または Docker コンテナーを使用して CloudFormation カスタム リソースを構築する方法を探ります。 この方法は、CloudFormation と CDK でうまく使用されており、Terraform でもうまく機能します。 Terraform モジュールを使用すると、プロジェクトに数行のコードを追加するだけで、カスタム プロバイダーを使用できます。 このソリューションが安全、シンプル、将来性、信頼性を確保するためにどのように設計されているかをご覧ください。

## セッション内容
![IMG_8880.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/c9efac0a-dfb5-e83c-f521-94bdcb33f9f8.jpeg)

今回デモなどで、使用するシステムはレガシーシステムであり、ユニコーンを管理？しているシステムになります。
![IMG_8889.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/f7080825-a45a-3a92-c10e-a3299f13fc39.jpeg)

### CloudFormationについて
CloudFormationの一般的な使い方が解説されていました。
![IMG_8891.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/f771d730-52ed-0cac-673f-5d59f41804f7.jpeg)

### CloudFormationカスタムリソースについて
CloudFormationカスタムテンプレートの使い方と概要になります。
- CloudFormationテンプレートにカスタムプロビジョニングロジックを記述する。
- CloudFarmationリソースとして利用できないリソースを含めることができます。
![IMG_8894.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/bec155b5-f351-d86d-1e55-5937759cde05.jpeg)

カスタムリソースの仕組みとして、CloudFormation内にカスタムリソースを記述することで、Lambdaから**CloudFormationとしてサポートされていないリソース**を作成することが可能できます。
![IMG_8896.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/00a97b86-8031-dfbb-6040-41ab85175a01.jpeg)

#### CloudFormationカスタムリソース デモ
実行するLmabda関数はAPIに対して、ユニコーンのデータをcreateするような関数となっています。
##### 呼び出すLambdaのCloudFormationテンプレート
![IMG_8902.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/b0b43f67-a5f9-a5d0-49ff-17708f8260cb.jpeg)

##### カスタムリソースを実行するCloudFormationテンプレート
"Warner"という名前のユニコーンを追加する。
![IMG_8906.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/725685dd-589d-aa88-2fcc-169b6725be3b.jpeg)

実行後に"Warner"という名前のユニコーンが追加されていることを確認する。
![IMG_8907.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/a204c911-16f6-3f71-b0ff-b74f1c5cdc66.jpeg)

ここまでで、CloudFormationカスタムリソース終了となります。
### Terraformについて
Terraformの概要、仕組みについての解説。
マルチプラットフォームに対応しているのがCloudFormationとの大きな違い。
![IMG_8909.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/8cb33aee-5417-35d9-17d3-793998d1e237.jpeg)
#### Terraform Providerについて
- Terraformはプロバイダーと呼ばれるプラグインに依存して、クラウドプロバイダー、SaaSプロバイダーおよび、その他のAPIと対話します。
- 各ProviderはTerraformが管理できる一連のリソースタイプやデータソースを追加します。
- プロバイダーは依存サービスに対する複雑な操作を調整できます。
![IMG_8910.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/7286622d-76c5-7f42-27c5-2031d1863dfe.jpeg)

#### HCL(HashiCorp Configuration Language)の構文について
スライドのようにCloudFormationとの比較を行うと理解が早そうですね。
![IMG_8913.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/2b1d464b-e9ab-34c0-5990-47787b7475f5.jpeg)

### Terraform moduleについて
Terraform moduleについては主に、再利用性の高さについてお話しされていました。
Terraform moduleはパッケージの様にコードを作成することで様々な環境から教諭通的なリソースの作成ができる仕組みになります。
- 単一ディレクトリ内の一連のTerraform構成ファイル
- 単一のディレクトリからTerraformコマンドを直接実行するとルートモジュールとみなされるため、ある意味全てのTerraform構成はモジュールの一部です。
- モジュールはローカルファイルシステムまたは、リモートソースからロードできます。
- ベストプラクティス
    - **terraform-<プロバイダー名>-<名前>**
    - **モジュールを念頭に置いて設定を書き始める**
![IMG_8915.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/5bf2f9ea-88c2-150a-dbe7-535ebc26a125.jpeg)
#### Terraformでカスタムリソースを使用した場合の構成図
CloudFormationの時と使い方にさほど違いは無く、CloudFormationで実行していた部分がTerraformに置き換わっている形かと思います。
![IMG_8916.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/93575f79-f2d8-c207-130f-30100dd91c00.jpeg)


## おまけ
AWS CDKについても解説がありましたが、分量がかなり多くなってしまうので、
簡易的にまとめておきます。
### AWS CDKについて
得意な言語で記述できるのと、**ループやL2,L3コンストラクタ**を使用して重複したコードの記述をしなくて良くなるのがメリットだと言っていました。
(watchコマンドは　CDK特有のものだけど出てこないんだ思いました。)
![IMG_8929.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/0e870651-a7b5-619c-4554-61a3250ae240.jpeg)

## まとめ＆感想
- セッションレベル`300 - Advanced`だったので少し難しい内容かと思いましたが、Terraform、CloudFormation、AWS CDK初心者の方にも大変役に立つセッションかと思います。
    - 初心者だけでなく、初心者卒業できそうくらいの方が1ステップ上がるために視聴してみると大変良いかと思います。
- TerraformでCloudFormationカスタムリソースを実行したことが無いので、これを機に試してみたいと思いました。
- **デモが3回ありましたが、ユニコーンの名前が毎回変わり、"Warner"→"Andy"→"Jeff"でした。**
- 明日はワークショップにいくつか参加してみようと思いますので、少しテイストの違う内容をお届けできればと思います！