【IBM Cloud】IBM Cloud Schematicsを利用してアプリ環境を構築してみた

## はじめに
今回はIBM Cloudが提供するInfrastructure as Code（IaC）サービスである、IBM Cloud Schemaitcsを利用してアプリ環境を構築するデモを行なってみました。その全体的な流れをご紹介したいと思います。
今回の内容にはIBM Cloudの[アカウント](https://cloud.ibm.com/docs/account?topic=account-accounts)（無料利用可能）が前提となっています。
また、今回操作するにあたり、スクリプトは事前に用意しています。もし新しく作成する場合には、
[Terraform Docs](https://registry.terraform.io/providers/IBM-Cloud/ibm/latest/docs)を参照して作成してください。（スクリプトの形式はTerraformの形式となっています）

## Infrasturcture as Codeとは？
Infrastructure as Codeはインフラストラクチャーの構築や管理をコードとして表現する手法です。
あらかじめコードをスクリプトとして作成し、そのスクリプトをレポジトリーに登録して、必要な時に実行させることによって環境構築サポートする技術となります。
IBM CloudではIaCサービスとして、IBM Cloud Schematicsを提供しています。

## IBM Cloud Schematicsのご紹介
IBM Cloud Schematicsは、IBM Cloud 環境の構築や、クラウド・リソース操作の自動化、ソフトウェアのインストール、クラウド・リソース上での複数階層アプリケーションの実行などを行うことができます。
IBM Cloud Schematicsの利用シーンは以下の通りです。
| 　　　　ユースケース　　　　　| 　　　　　　　　　　説明　　　　　　　　　　 |
| :------------ | :-----------: |
|クラウド・インフラのデプロイ|Terraform 構成を使用して、クラウド環境を素早くスピンアップします。 必要なクラウド・リソースを指定し、[Schematics ワークスペース](https://cloud.ibm.com/docs/schematics?topic=schematics-how-it-works#how-to-workspaces)を使用して、 IBM Cloud リソースをプロビジョン、更新、スケーリング、および削除します。|
| 構成管理| Ansible プレイブックを使用した[Schematics アクション](https://cloud.ibm.com/docs/schematics?topic=schematics-how-it-works#how-to-actions)でアプリケーション・ランタイム環境をビルド、更新、およびスケーリングします。 Ansible を使用して、 day-2 操作を自動化することもできます。|
|ソフトウェア・デプロイメント|ソフトウェア・カタログのテンプレートを使用して、 IBM Cloud Kubernetes Service または Red Hat OpenShift on IBM Cloud クラスター、あるいは他の IBM Cloud リソースに IBM およびサード・パーティー・ソフトウェアをインストールします。|
|大規模環境のデプロイ|[Schematics Blueprints](https://cloud.ibm.com/docs/schematics?topic=schematics-get-started-blueprints&interface=ui)を使用して、大規模な環境をデプロイおよび管理します。 再使用可能な Terraform ベースの自動化モジュールから作成された、大規模で複雑なアプリケーション・インフラストラクチャーのライフサイクルを管理します。 バージョン・テンプレートおよびモジュールを再利用します。|

## 今回のデモの構成図
今回のデモはアプリケーション担当者がSchematicsを利用する前提で、インフラ担当者は設定済みのリソーススクリプトをGithubに登録したとの前提となります。そこでIBM Cloud上にシドニーリージョンにVPCを立てて、仮想サーバー一台を構築し、PHPやMySQLとともに監視ツールとしてLog AnalysisとCloud Monitoringを構築することを想定しています。
![スクリーンショット 2023-07-12 14.47.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/f00fd3bf-51c2-9027-c589-22a1ac0b00c5.png)

## IBM Cloud　コンソールでSchematicsを操作する流れ
### ワークスペースの作成
それではSchematicsを触ってみたいと思います。
IBM Cloudコンソールに入って`ナビゲーション・メニュー`をクリックします。
![スクリーンショット 2023-07-12 13.40.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/ac344030-49bd-dd9e-7a9e-729e4174bd3e.png)
カテゴリーからSchematicsをクリックし、`ワークスペース`をクリックします。
![スクリーンショット 2023-07-12 13.40.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/a34e9c42-d3e1-e64f-08e6-b7f916073bf2.png)
右側の`ワークスペースの作成`をクリックします。
![スクリーンショット 2023-07-12 13.40.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/44573be9-45b7-e421-b8fa-8ad4c2d295f5.png)
こちらでテンプレートの設定を行うことができますが、今回はあらかじめ作成したスクリプトをGithubに格納し、それを引っ張ってきました。対象レポジトリーのURLをコピーしてペーストします。
最後にTerraformのバージョンを選択して末端の`次へ`ボタンをクリックします。
Githubからコピーするときの注意点としては、ブラウザのURLではなく、Github画面の緑色の`Code`をクリックしてプルダウンし、`コピーロゴ`をクリックする必要があります。
![スクリーンショット 2023-07-12 13.41.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/f9e3845d-73be-1dc1-2238-73793466c9c0.png)
![スクリーンショット 2023-07-12 14.37.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/c60bd034-cda3-3b92-ced6-82ae8c823e14.png)
その次はワークスペースの詳細を決めますが、ワークスペース名とIBM Cloudのリソースグループ、ロケーションなどを設定します。
今回はリソースグループは`demo`、ロケーションは`北アメリカ`に設定しています。
設定が完了したら末端の`次へ`ボタンをクリックします。
![スクリーンショット 2023-07-12 13.42.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/240fab0d-b38d-94e6-b200-9d0dedd10c43.png)
最後に作成サマリーを確認し、問題なければ右側の`作成`ボタンをクリックします。
![スクリーンショット 2023-07-12 13.42.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/d0b447c6-b535-dfa4-09f0-54dda6245659.png)
時間が経つと、ワークスペースが作成され、`設定`カテゴリーから詳細情報を確認することができます。また下の変数欄にもスクリプトで設定した値が表示されています。
![スクリーンショット 2023-07-12 17.02.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/33cbd743-1c97-2b4a-7ef0-f665fc45d417.png)

![スクリーンショット 2023-07-12 15.01.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/9b8fec4c-36c1-1e35-150a-482701cc8e1c.png)
その他に`ジョブ`カテゴリーには現在の操作内容についてのログを確認することができます。
![スクリーンショット 2023-07-12 15.02.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/9af24d8f-91c1-5d91-8419-625e4b56e1a3.png)
最後に`README`カテゴリーをクリックすると、Github側のReadmeがそのまま表示されるようになります。
![スクリーンショット 2023-07-12 15.01.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/24717c58-d6fe-4f27-4bf7-5e54193b38f9.png)

次の段階に進む前に、変数画面で設定を変更したいと思います。
スクリプトにはリージョンとリソースグループがそれぞれ「大阪」と「Default」に設定していましたが、今回デモの前提としては上記の通り、「シドニー」リージョンに「Demo」リソースグループを構築する前提となっていました。そのため、変数画面でそれを修正します。
変数画面の右側に点３つのボタンがありますが、そこをクリックしてデフォルト項目にチェックを外し、設定したい内容を入力します。
今回は上記の通り「シドニー」リージョンと、「Demo」リソースグループに変更しました。
![スクリーンショット 2023-07-12 15.44.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/4b2de704-ac4e-169e-cfb5-151968c5650c.png)
![スクリーンショット 2023-07-12 15.45.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/4776a0f0-bade-4f75-3be9-e2dcda37876e.png)
![スクリーンショット 2023-07-12 15.45.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/835c7f5b-e35e-08c8-8bf0-7e277d358b1a.png)
それぞれ設定を変えて保存ボタンをクリックすると、デフォルト値からオーバーライド値として変更されていることがわかります。
![スクリーンショット 2023-07-12 15.45.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/72834049-97df-741e-1459-ded00d657c99.png)

### プランの生成
Schematicsには、レポジトリーのURLを入力してワークスペースを作った後に、そのスクリプトが正常に作動するのか、もしくはスクリプトが正しい形で作成されたのかを確認する機能がありますが、それが「プランの生成」機能です。
コンソール上端にある`プランの生成`ボタンをクリックします。
![スクリーンショット 2023-07-12 15.46.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/42c7777c-3f8c-493e-4cce-8469892cf32e.png)
少し時間が経つと、プランの生成が成功したと表示されます。これは実際プランの適用（環境の構築）も可能であることの意味合いとなります。
![スクリーンショット 2023-07-12 16.37.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/71fe9bec-2c20-658d-5308-1ff301828531.png)
また、ログを展開して確認すると、末端部分に16個のインスタンスが設置可能な旨も表示されています。
```
 2023/07/12 06:53:27 Terraform plan | Plan: 16 to add, 0 to change, 0 to destroy.
```

### プランの適用
プランの生成で問題ないことを確認して問題なければ早速プランの適用を行います。プランの適用は実際環境を構築しはじめるボタンとなります。
本来であれば必要となるリソースインスタンスを一つずつカタログから検索して立てる必要がありますが、Schematicsを使用するとスクリプト通りの全てのインスタンスが一気にオーダーされるため、手軽な環境構築を実現できます。
![スクリーンショット 2023-07-12 16.36.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/241c57b5-e4a7-7cfc-3fa1-01325e748d73.png)
プランの適用が終わりましたら、同様に「ジョブ」カテゴリーにログが記録され、環境構築が完了したことがわかります。ワークスペースのStatusもアクティブに変更されていることがわかります。
![スクリーンショット 2023-07-12 17.08.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/926c4841-f265-3592-d26e-c68df6b839e9.png)
また、IBM Cloudリソースリストのリソースグループを`demo`に変更して画面をリフレッシすると、オーダーされたインスタンスが全て表示されるようになります。
![スクリーンショット 2023-07-12 17.09.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/783ce689-f672-b6d9-e086-8378f059a08d.png)

### インスタンスへのアクセス
今回使用したスクリプトの内容にIPアドレスの設定も行なっています。プランの適用後のログを確認すると、末端に設定したIPアドレスが表示されているので、そこにアクセスしてみます。(IP Adress : `159.23.96.56`)
```
 2023/07/12 08:06:22 Terraform refresh | vsi_fip = "159.23.96.56"
 2023/07/12 08:06:22 Command finished successfully.
```
以下の画面が表示され、問題なくアクセスできることがわかります。
![スクリーンショット 2023-07-12 17.13.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/d45a529c-7a2a-f3d8-eacc-04321edb4647.png)
またPHPも確認してみるため、`159.23.96.56/info.php`にもアクセスすると、PHPが立っていることがわかります。
![スクリーンショット 2023-07-12 17.14.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/38d8144f-590b-5457-24c0-11e14adabcc9.png)
最後に関しようとしてオーダーしたMonitoringインスタンスも確認してみると、オーダーされた時点からの監視内容が表示されています。
![スクリーンショット 2023-07-12 17.16.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/59e3fd0a-99b7-c65c-002d-903ed833a33d.png)

### リソースの破棄
もしオーダーしたインスタンスが不要になった場合、本来であれば一つずつ削除を行う必要がありますが、Schematicsワークスペースで作成した場合には削除も一気に行うことができます。右上の`アクション`ボタンをプルダウンし、`リソースの破棄`をクリックし、インスタンスの削除が行います。

一つ注意点としては、こちらの画面で`リソースの破棄`ではなく`ワークスペースの削除`をクリックしてもリソースは削除されません。あくまでもSchematicsのワークスペースはリソースをオーダーして削除する命令を行う道具であるため、ワークスペースを削除してしまうと一気に削除するように命令する道具がなくなることになります。そのため、もしリソース削除の前にワークスペースを削除した場合、手作業で一つずつリソースインスタンスを削除する必要があります。
![スクリーンショット 2023-07-12 17.21.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/5e8bf8c5-bc73-404e-82ed-5d4c60f7d309.png)
![スクリーンショット 2023-07-12 17.23.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/633777bc-f240-5a4c-64e1-ffd7341eedfe.png)
リソースを破棄が完了したとのジョブメッセージが表示されると、リソースリストを確認してみます。ワークスペースインスタンス以外、全てのリソースが削除されたことがわかります。
![スクリーンショット 2023-07-12 17.27.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/8d28f3cf-e5df-cf03-589a-a83597db97c8.png)
![スクリーンショット 2023-07-12 17.28.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/0842a883-c9a1-aebb-1f58-edafe47fcacf.png)
念の為先ほどのIPアドレスでサーバーを確認してもアクセスできなくなっています。
![スクリーンショット 2023-07-12 17.36.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/df35caad-f660-ab97-26c1-68e4135558f7.png)
その後最終的に`アクション`→`ワークスペースの削除`をクリックして、Schematicsのワークスペースを削除します。
![スクリーンショット 2023-07-12 17.30.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/0481a1c5-e6a5-f485-5b56-78c8947b7082.png)

## 最後に
本日はIBM Cloudで提供するInfrastructure as Codeサービスである、IBM Cloud Schematicsを触り、その流れを整理してみました。

Schematicsを触りながら感じたメリットとしては、本来環境構築をする時に発生する煩雑なプロセスやヒューマンエラーなどを防ぐことができ、スピーディーな構築も実現できるところだと感じました。そのため、一定の決まっている環境を繰り返し作成する場合や、万が一の際に急にDRサイト環境を構築する必要があるときなどには非常に有効に活用できる技術でした。また、一度作成したスクリプトでも、細かい変数の変更はIBM Cloudコンソール上でも一時的に変更することができるので非常に便利な仕組みになっていました。

しかし、Schematicsを使うためにはあらかじめスクリプトをTerraform形式で作成しておく必要があるため、毎回違う環境の構築にはあまり向いていません。Schematicsを有効活用するシーンは環境の規模や場面によって限られているため、ユーザーからはその判断が必要かと思います。