【OCI Compute】cloud-initでApache Webサーバを構成する

# はじめに
通常、Compute インスタンスを作成後に、ssh 等でサーバにログインし、Apache などインストールするような構築作業を行う。

Compute インスタンスを作成する時にcloud-init スクリプトを追加することで、インスタンス立ち上げ後にcloud-init スクリプト実行されるため、サーバにログインしていくつものコマンド実行するといった手間を省略することができる。

今回、多くの人になじみの深いシェルスクリプトで記述する。

cloud-init の詳細は[公式マニュアル](https://cloudinit.readthedocs.io/en/latest/index.html#)を参照してほしい。

# ゴール
OCI Compute インスタンスを作成する時にcloud-init スクリプトを利用して、初期セットアップを試してみる。


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


# 対応手順
## 1-1. cloud-init スクリプトの追加
「ナビゲーション・メニュー」→「コンピュート」→「インスタンス」をクリックし、
「インスタンス作成」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588872/615d6927-f788-2598-bd11-df3d6f752143.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/ac6c0690-aa68-03d7-8139-9c1f3bec16da.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
~~~

「作成」をクリックし、インスタンス作成が開始される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588872/8061804e-2511-a6ab-bc81-9c65e6f6bfcf.png)



## 1-2. cloud-initの実行状況を確認する
インスタンスの状態が「起動中」になったことを確認する。
ssh でインスタンスにログインする（今回はCloud Shellでログインした）
~~~ruby:sshログイン
ssh -i [ssh秘密鍵] opc@[public IP]
~~~

cloud-initが終了したことを知る方法として以下がある。
- /var/log/cloud-init.log
- プロセス確認（topコマンド、psコマンド）
- ブラウザアクセス（80番ポートの穴あけが必要）



### /var/log/cloud-init.log

~~~bash:cloud-init.log
sudo tail -f /var/log/cloud-init.log
~~~
結論、`finish: modules-final: SUCCESS`が出ていれば、OCIコンソールで記述したスクリプトを含めたすべてのcloud-init処理が終了していることを示している。
~~~bash
[opc@testVM conf]$ sudo tail -f /var/log/cloud-init.log
・・・
2024-09-13 08:48:27,711 - util.py[DEBUG]: Reading from /proc/uptime (quiet=False)
2024-09-13 08:48:27,711 - util.py[DEBUG]: Read 13 bytes from /proc/uptime
2024-09-13 08:48:27,711 - util.py[DEBUG]: cloud-init mode 'modules' took 78.131 seconds (78.13)
2024-09-13 08:48:27,711 - handlers.py[DEBUG]: finish: modules-final: SUCCESS: running modules for final
[opc@testVM conf]$
~~~


実際には、このcloud-init.logの中の以下`config-scripts-user`部分が、今回OCI コンソールにて記述したスクリプトの開始と終了を示している。
これを確認することで、OCI コンソールにて記述部分が成功していることやその実行時間を明確に確認することができる。

~~~:start
2024-09-14 13:03:19,114 - handlers.py[DEBUG]: start: modules-final/config-scripts-user: running config-scripts-user with frequency once-per-instance
~~~
~~~:finish
2024-09-14 13:04:41,322 - handlers.py[DEBUG]: finish: modules-final/config-scripts-user: SUCCESS: config-scripts-user ran successfully
~~~

またコンソールにて記述したcloud-initスクリプトの中身は`/var/lib/cloud/instance/scripts/part-001`から確認することができる。

~~~bash:cloud-initスクリプトの中身
[opc@testVM ~]$ sudo cat /var/lib/cloud/instance/scripts/part-001
#!/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
[opc@testVM ~]$ 
~~~
:::note info
スクリプトがうまく処理されなかった際に、コンソールでは記述したスクリプトの中身を確認する画面が見当たらなかったため、上記方法にて記述したスクリプトを確認できる。
:::

    
### プロセス確認（topコマンド）
topコマンドであれば、スクリプト内のどの処理が実行されているのかがリアルタイムにわかる可能性はあるが、ssh接続してすぐ確認しないと今回のようなスクリプトでは実行完了になってしまうこともあるため、時間との勝負になる。
~~~bash:topコマンド
top
~~~
（結果省略）

### プロセス確認（psコマンド）
今回はcloud-initスクリプトでapacheをインストールしているのでapacheでgrepしてプロセスが出てくれば正しく動いていることが確認できる。
~~~bash:psコマンド
ps -ef | grep apache
~~~

~~~bash
[opc@testVM ~]$ ps -ef | grep apache
apache     12389   12358  0 08:48 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     12391   12358  0 08:48 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     12392   12358  0 08:48 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     12393   12358  0 08:48 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
opc        47010   31893  0 09:20 pts/0    00:00:00 grep --color=auto apache
[opc@testVM ~]$
~~~

### ブラウザアクセス
今回の例に限った確認方法として、ブラウザアクセスによりApacheのデフォルト画面が表示されるかを確認することで正しく処理できたかを知ることが可能。
セキュリティリストのイングレスルールに80番ポートの穴あけが必要となる。

:::note info
宛先CIDRは0.0.0.0/0ではなく、念のためご自身で利用しているIPアドレスを/32で指定したほうが良い。
:::

~~~:ブラウザアクセス
http://[public IP of compute-instance]
~~~

任意のブラウザにて上記アクセスするとApacheの静的テストページが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588872/ae70bff4-3843-8374-4923-022b48511c89.png)



### コンソール上で実行結果がわかるといいが・・・
わざわざログインしなくてもコンソール上で実行ログなどが追うことができれば、正しく動作したのかがわかりやすいと思うが、そのような画面は見つからなかったため、コンソールからは確認できないと思われる（詳細は未確認）。






# 番外編
## cloud-initスクリプトにてPythonインストール
以下、Oracle公式ドキュメントにPythonインストールコマンドが書かれているが、意外と時間がかかる。
cloud-initスクリプトでコンピュート立ち上げ時に合わせて実行すると効率的かと感じた。
参照先：[Oracle公式ドキュメント Pythonのインストール](https://docs.oracle.com/ja-jp/iaas/Content/API/SDKDocs/climanualinst.htm#Installi2)


~~~bash:Pythonインストール（Oracle Linux 8）
sudo dnf -y update
sudo dnf -y groupinstall "Development Tools"
sudo dnf -y install gcc wget openssl-devel bzip2-devel libffi-devel
sudo dnf -y module enable python39
sudo dnf -y install python39
touch /home/opc/finish.txt
~~~
※cloud-initスクリプトに上記内容を貼り付けて実行させた。
最終行はスクリプトが終了したことをわかるようにするために、空ファイルを作成するような工夫とした（[cloud-init.log](https://qiita.com/ramtan0522/items/7344fda94150d92fb2cb#varlogcloud-initlog)で実行終了までに約7分程度かかっていた）。

# まとめ
Compute インスタンスを作成する時にcloud-init スクリプトを追加してスクリプト処理を実行させた。


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

- [【OCI Compute】cloud-init利用した自動スケーリングで、複数Apache Webサーバを初期セットアップする](https://qiita.com/ramtan0522/items/2a971652a0e04dfc8702)

# リソース削除
以下削除をお忘れなく。
- compute インスタンス
- ウィザードを利用して作成したVCNやサブネットなど

# 参考URL
[cloud-init公式マニュアル](https://cloudinit.readthedocs.io/en/latest/)