【OCI Compute】cloud-init利用した自動スケーリングで、複数Apache Webサーバを初期セットアップする

# はじめに
以前の記事で、OCI Compute インスタンスを作成する時にcloud-init スクリプトを利用して、初期セットアップを試してみた。

[【OCI Compute】cloud-initでApache Webサーバを構成する](https://qiita.com/ramtan0522/items/7344fda94150d92fb2cb)


今回は、cloud-init スクリプトを利用したインスタンス構成を作成し、インスタンス・プールおよび自動スケーリング構成を設定して、自動的に増加したcompute インスタンスに初期セットアップができるのか試みる。

# ゴール

- 自動スケーリングにより増加したcompute インスタンスに接続し、cloud-init スクリプトが実行されているかを確認する
- 今回簡易的に確認したいため、自動スケーリングはスケジュールベースの自動スケーリングで試す


# 事前準備
以下の内容を事前準備しておくこと
- VCNウィザードの「インターネット接続性を持つVCNの作成」を利用して、VCNおよびパブリックサブネット、セキュリティリストなどを作成

# 実施事項
## 1-1. インスタンス構成
「ナビゲーション・メニュー」→「コンピュート」→「インスタンス構成」をクリックし、
「インスタンス構成の作成」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588872/b23895ba-921b-131c-d43f-1953a4303dbd.png)


インスタンス構成の作成の画面に遷移したのち、以下の項目で構成していく。
- 名前：任意
- コンパートメント：ご自身の利用しているコンパートメント
- イメージ：任意（Oracle Linux 8）
- シェイプ：任意（VM.Standard.E5.Flex　1 core OCPU, 12 GB memory, 1 Gbps network bandwidth）
- プライマリVNIC情報
    - プライマリ・ネットワーク：事前準備しておいたVCN
    - サブネット：事前準備しておいたパブリックサブネット
- SSHキーの追加：SSHキー・ペアを自動生成するか既にある公開キーをアップロードする




以下の内容は基本的にデフォルトのままとした。
- 配置（AD）
- セキュリティ
- プライマリVNIC IPアドレス
- ブート・ボリューム
- ブロック・ボリューム
- ライブ移行

一番下に「拡張オプションの表示」があり、それをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588872/de82ee4a-48a9-e21f-3185-a3451a981022.png)

「管理」タブ内にて、cloud-initスクリプト・ファイルをアップロードする方法とcloud-initスクリプトのコンソール内に貼付ける方法が選択可能。

今回はcloud-initスクリプトの貼付けを選択した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588872/4ee3f449-ec87-3297-7a8a-b32c1edc74d4.png)


cloud-initスクリプトの枠内に以下コマンドを記述する。

:::note info
各コマンドの意味については以下記事で似たコマンドを記載しているので参考にしてほしい
参照先：[ApacheインストールおよびOS上のファイアウォール設定](https://qiita.com/ramtan0522/items/a094093a2dcdf8b3bfa9#apache%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
:::



~~~bash:cloud-initスクリプト
#!/bin/sh
sudo dnf install httpd --assumeyes --quiet
sudo systemctl enable httpd
sudo systemctl start httpd
sudo firewall-offline-cmd --add-service=http
systemctl restart firewalld
~~~

可用性構成タブおよびOracle Cloudエージェントタブについてはデフォルトのまま変更せず、「作成」をクリック。インスタンス構成の作成が開始される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588872/09e18bfc-e55f-ea7a-49fb-70a7c433135a.png)

以下のような画面に遷移され、「インスタンス・プールの作成」をクリックし、次項に進む。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588872/2d726478-dc35-28a0-41a4-20e77f21031e.png)




## 1-2. インスタンス・プールの作成
以下からでも遷移できるため紹介しておく。
「ナビゲーション・メニュー」→「コンピュート」→「インスタンス・プール」
をクリックし、「インスタンス・プールの作成」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588872/09c9f636-a6b2-6fd5-1984-4645bac850c9.png)

インスタンス・プールの作成の画面に遷移したのち、以下の項目で構成していく。
- 基本的な詳細の追加
    - 名前：任意
    - コンパートメント：ご自身の利用しているコンパートメント
    - インスタンス構成：先ほど作成したインスタンス構成
    - インスタンス数：1
- プール配置の構成
    - 可用性ドメイン：デフォルト
    - VCN：事前準備しておいたVCN
    - サブネット：事前準備しておいたパブリックサブネット
    - ロード・バランサのアタッチ：チェックしない
- 確認
「作成」をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588872/909294dc-3da2-92a8-637d-a0848da30bc6.png)

以下のような画面に遷移し、作業リクエストにて進捗率が確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588872/05823388-b143-9635-db7d-05b1fdc068be.png)


ステータスがプロビジョニング中から実行中になれば完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588872/98d8b71e-890c-1c68-005a-3c76bd600b08.png)

この時点で、
「ナビゲーション・メニュー」→「コンピュート」→「インスタンス」
の画面上において、今回の操作でCompute インスタンスが1つ作成されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588872/6e162a46-aa35-71bd-bcfa-bfd5a88924d2.png)



## 1-3. 自動スケーリング構成の作成
「ナビゲーション・メニュー」→「コンピュート」→「自動スケーリング構成」をクリックし、「自動スケーリング構成の作成」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588872/5e1643cd-d4c7-7922-885f-33665d11ceaf.png)


自動スケーリング構成の作成の画面に遷移したのち、以下の項目で構成していく。
- 基本的な詳細の追加
    - 名前：任意
    - コンパートメント：ご自身の利用しているコンパートメント
    - インスタンス・プール：先ほど作成したインスタンス・プール
- 自動スケーリング・ポリシーの構成
    - スケジュールベースの自動スケーリングを選択
    - 自動スケーリング・ポリシー1
        - 自動スケーリング・ポリシー名：任意
        - 実行するアクション：プール・サイズのスケーリング
        - ターゲット・プール・サイズ：2
    - 実行スケジュール
        - クイック・スタート：5分ごと
- 確認
「作成」をクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588872/a8cbd6f0-b81f-7c94-d0de-16ee69bec937.png)

画面遷移し、ステータスは有効となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588872/9e3b8188-9ca6-0491-bc23-a56399c782d0.png)

## 1-4. 確認＜自動スケーリング動作＞
スケジュール実行タイミングになると、
「ナビゲーション・メニュー」→「コンピュート」→「インスタンス・プール」
で遷移できるインスタンス・プール側の画面は、以下のようにスケーリング中というステータスになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588872/281a95de-9f8c-773a-ea32-2420e00f84ba.png)

また作業リクエストでプロビジョニングの変更を確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588872/b5634e35-1974-2b3d-f5d2-71b86d4adcb8.png)

再び、
「ナビゲーション・メニュー」→「コンピュート」→「インスタンス」
の画面上において、Compute インスタンスが1つ追加となり、合計２つ作成されている状態になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588872/03961daf-494a-89e4-82f6-28a80d241e72.png)

ターゲット・プール・サイズ：2としているため、さらに5分経過しても3つ目のCompute インスタンスは作成されない動作となる。

## 1-5. 確認＜cloud-initの実行状況＞
ssh で2つのCompute インスタンスにそれぞれログインする（今回はCloud Shellでログインした）
~~~ruby:sshログイン
ssh -i [ssh秘密鍵] opc@[public IP]
~~~

cloud-initが終了したことを知る方法として以下で紹介している`/var/log/cloud-init.log`を利用する
[1-2. cloud-initの実行状況を確認する](https://qiita.com/ramtan0522/items/7344fda94150d92fb2cb#1-2環境を確認する)

### インスタンス・プール作成時にプロビジョニングされたインスタンス
上記Compute インスタンスについて、sshでログインし、`/var/log/cloud-init.log`を確認する。
`finish: modules-final: SUCCESS`が出ているため、すべてのcloud-init処理が正常に終了している。
~~~bash:cloud-init.log
[opc@inst-ukqpi-instance-pool-20240916-2230 ~]$ sudo tail /var/log/cloud-init.log
2024-09-16 13:45:26,242 - util.py[DEBUG]: Restoring selinux mode for /var/lib/cloud/instances/ocid1.instance.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxxxxx/boot-finished (recursive=False)
2024-09-16 13:45:26,242 - handlers.py[DEBUG]: finish: modules-final/config-final-message: SUCCESS: config-final-message ran successfully
2024-09-16 13:45:26,242 - main.py[DEBUG]: Ran 8 modules with 0 failures
2024-09-16 13:45:26,243 - atomic_helper.py[DEBUG]: Atomically writing to file /var/lib/cloud/data/status.json (via temporary file /var/lib/cloud/data/tmpjyiff0kq) - w: [644] 608 bytes/chars
2024-09-16 13:45:26,243 - atomic_helper.py[DEBUG]: Atomically writing to file /var/lib/cloud/data/result.json (via temporary file /var/lib/cloud/data/tmpsp_rweg2) - w: [644] 67 bytes/chars
2024-09-16 13:45:26,243 - util.py[DEBUG]: Creating symbolic link from '/run/cloud-init/result.json' => '../../var/lib/cloud/data/result.json'
2024-09-16 13:45:26,243 - util.py[DEBUG]: Reading from /proc/uptime (quiet=False)
2024-09-16 13:45:26,243 - util.py[DEBUG]: Read 13 bytes from /proc/uptime
2024-09-16 13:45:26,243 - util.py[DEBUG]: cloud-init mode 'modules' took 79.449 seconds (79.45)
2024-09-16 13:45:26,244 - handlers.py[DEBUG]: finish: modules-final: SUCCESS: running modules for final
[opc@inst-ukqpi-instance-pool-20240916-2230 ~]$ 
~~~
`config-scripts-user`のstart/finishのログも確認し問題なしであることがわかる。
~~~bash:start
[opc@inst-ukqpi-instance-pool-20240916-2230 ~]$ sudo grep "start: modules-final/config-scripts-user" /var/log/cloud-init.log
2024-09-16 13:44:07,188 - handlers.py[DEBUG]: start: modules-final/config-scripts-user: running config-scripts-user with frequency once-per-instance
[opc@inst-ukqpi-instance-pool-20240916-2230 ~]$ 
~~~
~~~bash:finish
[opc@inst-ukqpi-instance-pool-20240916-2230 ~]$ sudo grep "finish: modules-final/config-scripts-user" /var/log/cloud-init.log
2024-09-16 13:45:26,135 - handlers.py[DEBUG]: finish: modules-final/config-scripts-user: SUCCESS: config-scripts-user ran successfully
[opc@inst-ukqpi-instance-pool-20240916-2230 ~]$ 
~~~

### 自動スケーリングによってプロビジョニングされたインスタンス
上記Compute インスタンスについて、念のため、同様に確認する。
`finish: modules-final: SUCCESS`が出ているため、すべてのcloud-init処理が正常に終了している。
~~~bash:cloud-init.log
[opc@inst-mz1yx-instance-pool-20240916-2230 ~]$ sudo tail /var/log/cloud-init.log
2024-09-16 14:12:36,036 - util.py[DEBUG]: Restoring selinux mode for /var/lib/cloud/instances/ocid1.instance.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxxxxx/boot-finished (recursive=False)
2024-09-16 14:12:36,036 - handlers.py[DEBUG]: finish: modules-final/config-final-message: SUCCESS: config-final-message ran successfully
2024-09-16 14:12:36,037 - main.py[DEBUG]: Ran 8 modules with 0 failures
2024-09-16 14:12:36,037 - atomic_helper.py[DEBUG]: Atomically writing to file /var/lib/cloud/data/status.json (via temporary file /var/lib/cloud/data/tmp_cjj9sxd) - w: [644] 608 bytes/chars
2024-09-16 14:12:36,037 - atomic_helper.py[DEBUG]: Atomically writing to file /var/lib/cloud/data/result.json (via temporary file /var/lib/cloud/data/tmpgg8hx08n) - w: [644] 67 bytes/chars
2024-09-16 14:12:36,038 - util.py[DEBUG]: Creating symbolic link from '/run/cloud-init/result.json' => '../../var/lib/cloud/data/result.json'
2024-09-16 14:12:36,038 - util.py[DEBUG]: Reading from /proc/uptime (quiet=False)
2024-09-16 14:12:36,038 - util.py[DEBUG]: Read 13 bytes from /proc/uptime
2024-09-16 14:12:36,038 - util.py[DEBUG]: cloud-init mode 'modules' took 79.784 seconds (79.79)
2024-09-16 14:12:36,038 - handlers.py[DEBUG]: finish: modules-final: SUCCESS: running modules for final
[opc@inst-mz1yx-instance-pool-20240916-2230 ~]$ 
~~~
`config-scripts-user`のstart/finishのログも確認し問題なしであることがわかる。
~~~bash:start
[opc@inst-mz1yx-instance-pool-20240916-2230 ~]$ sudo grep "start: modules-final/config-scripts-user" /var/log/cloud-init.log
2024-09-16 14:11:16,511 - handlers.py[DEBUG]: start: modules-final/config-scripts-user: running config-scripts-user with frequency once-per-instance
[opc@inst-mz1yx-instance-pool-20240916-2230 ~]$ 
~~~
~~~bash:finish
[opc@inst-mz1yx-instance-pool-20240916-2230 ~]$ sudo grep "finish: modules-final/config-scripts-user" /var/log/cloud-init.log
2024-09-16 14:12:35,954 - handlers.py[DEBUG]: finish: modules-final/config-scripts-user: SUCCESS: config-scripts-user ran successfully
[opc@inst-mz1yx-instance-pool-20240916-2230 ~]$ 
~~~

# まとめ
- スケジュールベースの自動スケーリング構成を作成し、Compute インスタンスのスケーリングを行った
- またそれにより増加したcompute インスタンスに接続し、cloud-init スクリプトが実行されているかを確認した

# リソースの削除
以下リソースの削除をお忘れなく。
- 自動スケーリング構成
- インスタンス・プール
- インスタンス構成
- ウィザード利用して作成したVCNやサブネットなど

削除するとインスタンス画面でもステータスが終了へ遷移されるので一応確認しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588872/68c90901-b695-0063-c560-a6cf6a54ba86.png)


# 参考URL
Oracle公式ドキュメントに詳細記述されている。
[インスタンス構成およびインスタンス・プールの使用](https://docs.oracle.com/ja-jp/iaas/Content/Compute/Concepts/instancemanagement.htm)