IBM Cloud上IaCをゼロからスタートするには

### はじめに
IaCの利用がもう当たり前のようになってきて、これから始めようとしている方が多いと思います。ただどこからスタートして、何をみながら勉強すればいいかがわからないとの悩みがありましたでしょうか。私はそのような悩みがあり、模索してみましてたTipsを共有します。
私はIBM Cloud上にSchematicsを利用してスタートしましたので、Schematics（本記事ではTerraformを利用）を用いてゼロからスタートする勉強方法を共有します。

###### 想定の前提：
・ Cloud環境を利用したことがある
・ VPCとか概念的なものについて理解している

### まずSchematicsとは
IBM Cloudが提供しているIaCを実現するサービスです。TerraformとAnsibleを利用してIBM Cloud上に自動的にリソースのプロビジョン、更新、削除及びソフトウェアのインストールができます。私はTerraformしか利用していませんでしたので、本投稿にてTerraform中心に話ます。

Schematics関連で、より詳細は[公式ドキュメント](https://cloud.ibm.com/docs/schematics?topic=schematics-about-schematics)をみてください。

### 全体の流れ

##### ①ハンズオンの実施
##### 　　　↓
##### ②Terraformのドキュメントを参照し、拡張
##### 　　　↓
##### ③Githubを参照し、拡張
##### 　　　↓
##### ④Best Practiceを調査し、修正

#### ①最初はハンズオンから

※本ハンズオンで作成されるリソースは課金されますので、要注意です。

最初に利用イメージが最もわかりやすいのはやはりハンズオンでした。IBM Cloudの場合チュートリアルを提供していて、そのどおりに実施すればなんとなくイメージがつきました。

[VPC上にIBM Cloud Kubernetes Serviceの作成手順](https://cloud.ibm.com/docs/schematics?topic=schematics-provisioning-terraform-template)

本ハンズオンではIBM CloudのVPC環境にKubernetes Service(マネージド・サービスです)を作成する手順を紹介しています。
ハンズオンにて以下のTerraform Template fileが入手できると思います。
https://github.com/IBM-Cloud/terraform-provider-ibm/tree/master/examples/ibm-cluster/vpc-gen2-cluster

規模が小さいので、Moduleも分けてないし、環境単位で分けていません。
TerraformのBest Practiceからは遠いですが、最初に作って見るにはいいかと考えております。

#### ②Terraformのドキュメントを参照し、拡張

Terraformのドキュメントとは以下のものを指しています。
https://registry.terraform.io/providers/IBM-Cloud/ibm/latest/docs

上記のリンクにて確認ができる通り、IBM Cloudのほぼすべてのサービスの作成ができます。
各サービスを作成する際にどんな設定ができるかが確認できます。
特にVPCのリソースは設定までできますので、参考になると思います。

※注意：ドキュメントが若干充実されていない感があります。例えば[ibm_iam_authorization_policy]というリソースを作成する際に、ソースサービス名とターゲットサービス名を記入する場合があります。その際にサービス名が何を記入すべきかの案内がありません。私はGithubを参照し、記入すべき値を確認しました。


#### ③Githubを参照し、拡張

以下がterraform ibm moduleのGitHubのリンクです。
https://github.com/terraform-ibm-modules

例としてSecureなOpenShiftクラスターを作成する例を紹介します。
以下からアクセスできます。
https://github.com/terraform-ibm-modules/terraform-ibm-cluster/tree/v1.4.0/examples/secure-roks-cluster

リンク先のTerraformファイルを理解するために、モジュールという概念の理解が必要ですが、参考として以下のChatGPTの回答を参照してください。
```
TerraformのModuleは、インフラストラクチャのコードを再利用可能で分離された単位にまとめたものです。モジュールを使用することで、複数のTerraformのコードをまとめて管理し、コードの再利用性を高めることができます。

モジュールは、通常、共通の目的や機能を持つインフラストラクチャを作成するために使用されます。例えば、複数のAWSリソースを含むVPCを作成するモジュールを作成することができます。このモジュールを使用することで、複数のTerraformのコードで同じVPCを再利用することができます。

モジュールは、入力変数、出力変数、リソースブロックなどの構成要素を含みます。モジュール内のリソースブロックは、Terraformの通常のコードと同じように定義され、入力変数は、モジュールが期待する値を指定するために使用されます。出力変数は、モジュールが作成するリソースの属性をエクスポートするために使用されます。

モジュールを使用することで、再利用可能なコードを作成し、コードの保守性を向上させることができます。また、モジュールを作成して公開することで、他のユーザーが同じインフラストラクチャの作成に役立てることができます。
```

各Moduleの中身は以下のリンクから確認ができ、非常に参考になります。
https://github.com/terraform-ibm-modules/terraform-ibm-cluster/tree/v1.4.0/modules

この段階でModuleを分ける、環境を分けるとかを考えるより、まずはリソースの作成や設定に集中してください。

リソースが問題なく想定どおりに作成できたら、次はベストプラクティスを参照してください。

#### ④Best Practiceを調査し、修正

以下のリンクが参考になります。

https://www.terraform-best-practices.com/

https://spacelift.io/blog/terraform-best-practices

https://medium.com/codex/terraform-best-practices-how-to-structure-your-terraform-projects-b5b050eab554

※注意：絶対に正しい構成はないので、実際の運用、利用ツールに合わせて修正してください。

Schematicsの特徴に合わせたTerraformの利用方法もありますので、別途紹介します。


### まとめ

IaCを利用してIBM Cloud上にリソースを構築するための流れを紹介いたしました。実際案件にてIaCを利用する際に、変更管理、リソースの削除対応などたくさんの課題が存在しますので、TerraformなどのIaCツールの他の機能も注目してみてください。