概要
- こんにちわ、新川です。今回もOracle Cloud Infrastructure (OCI) の検証結果をブログにまとめます。本日はOCI を学習する方にとってファーストステップとなるハンズオンを想定してみました! OCI Compute サービスと関連する基本的なサービスを活用した構築ハンズオンとなります。
- ハンズオンの内容としては、まずロードバランサーを作成し、次にOCI Compute インスタンスをスケーリングさせるためのインスタンス構成、インスタンスプールを作成します。続いて、オートスケーリングのポリシー導入を行います。OCI Compute インスタンスは、起動時にCloud-init スクリプトによってWebサーバーが導入され、サーバーのホスト名とIPアドレスを表示するサンプルページが配置されます。最後に、負荷ツールをかけながらロードバランサー経由でWebサーバーへアクセスして、負荷分散やスケールアウト/ スケールインを体験します。
- OCI の構築を行いながら、より実案件に近いサーバー構築に挑戦しましょう。
前提条件
- 本記事では、以下の環境がすでに準備されている前提で進めます。
- Oracle Cloud アカウントが作成されていること。まだ作成していなければ、以下のブログを参考にアカウントを作成してください。
- VCNおよびサブネットが作成されていること。まだVCN を作成していなければ、以下のブログを参考に作成してください。
- オートスケーリングのベースとなるインスタンスには、Oracle Linux 9 のOSを使用します。
オートスケーリング構築手順
VCNおよびサブネットの準備
- VCNおよびサブネット、ルートテーブルが作成済みであることを確認します。サブネットは、パブリックサブネット、プライベートサブネットの2つが作成されていることを確認します。また、パブリックサブネット用のルートテーブルはDestination 0.0.0.0 のターゲットにInternet Gateway が設定され、プライベートサブネット用のルートテーブルはDestination 0.0.0.0 のターゲットにNAT Gateway が設定されていることを確認しましょう。

- 次に、セキュリティリストのSecurity rules を確認します。今回は、以下のようにVCN のCIDR内の通信を許可するIngress Ruleを追加しております。

ロードバランサーの作成
- ここから、インターネットからの通信を受けるロードバランサーを作成します。
- OCIの管理コンソールにて、左ナビゲーションから「Networking」→「Load balancer」を選択します。
- 「Create load balancer」を選択します。
- 「Load balancer name」を入力、「Choose visibility type」に「Public」、「Assign a public IP address」に「Ephemeral」を選択します。

- ロードバランサーを配置するネットワークを設定します。Virtual cloud network、Subnet を選択します。作成済みのVCN、パブリックサブネットを選択します。
- 続いて、Bandwidthの「Choose a minimum bandwidth」は「10」、「Choose a maximum bandwidth」は「10」を指定します。その他の設定はデフォルトで構いません。「Next」を選択します。

- 次に、「Load balancing policy」は、「Weighted round robin」を選択します。

- 次に、「Select instances」の設定では、インスタンスの選択は行いません。

- Health check policy は、「Protocol」に「HTTP」、「Port」に「80」が選択されていることを確認します。その他の設定はデフォルトで構いません。
- 「Backend set name」を入力します。

- Security List は、先ほど設定済みのため、「Manually configure security list rules after the backend servers are added」を選択します。
- その他の設定はデフォルトで構いません。「Next」を選択します。

- 次に、HTTPリスナーを設定します。
- 「Listener name」を入力します。「Specify the type of traffic your listener handles」に「HTTP」、「Specify the port your listener monitors for ingress traffic」に「80」が選択されていることを確認します。
- その他の設定はデフォルトで構いません。「Next」を選択します。

- 今回、Error logs、Access logs の設定は任意です。必要に応じて、設定を行います。検証のみであれば、無効でも構いません。「Next」を選択します。
- 最後にReview の画面で「Submit」を選択します。
- ロードバランサーが作成されました。バックエンドは存在しないため、以下のようにステータスが「Incomplete」となっています。次に進みます。

インスタンス構成の作成
- OCIの管理コンソールにて、左ナビゲーションから「Compute」→「Instance configurations」を選択します。
- 「Create instance configuration」を選択します。
- 「Name」を入力します。
- Placement はデフォルトで構いません。
- Image and shape において、「Image」にOracle Linux 9 のイメージを選択します。

- 続いて、Image and shape の「Advanced options」を展開します。
- 「Initialization script」に後述のCloud-init スクリプトを貼り付けます。

- 以下、Cloud-init スクリプトに指定する内容です。WordPress で公開用に一部加工しています。
- もし、インスタンス起動時にCloud-init スクリプトが正常に実行されない場合は、ログファイル /var/log/cloud-init-output.log を確認しましょう。
#!/bin/bash
dnf install -y oracle-epel-release-el9
dnf --enablerepo=ol9_developer_EPEL install -y httpd stress-ng
systemctl enable --now httpd
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
HOSTNAME=$(curl -sL --retry 3 --max-time 5 http://169.254.169.254/opc/v1/instance/hostname)
PRIVATE_IP=$(hostname -I | awk '{print $1}')
mkdir -p /var/www/html
cat << EOF > /var/www/html/index.html
<html>
<head>
<title>OCI AutoScaling Verification</title>
</head>
<body>
<div class="container">
<h1>OCI AutoScaling Demo</h1>
<hr>
<p class="info">Server Hostname: <span class="highlight">${HOSTNAME}</span></p>
<p class="info">Server IP Address: <span class="highlight">${PRIVATE_IP}</span></p>
</div>
</body>
</html>
EOF
chown apache:apache /var/www/html/index.html
- Availability configuration、Oracle Cloud Agent は、デフォルト通り選択します。「Next」を選択します。

- Security はデフォルトで構いません。「Next」を選択します。
- Primary network の設定を行います。「Select existing virtual cloud network」を選択します。
- Virtual cloud network、Subnet を選択します。作成済みのVCN、プライベートサブネットを選択します。

- Add SSH keys において、新たにキーを作成する場合は「Generate a key pair for me」、既存のキーを使用する場合は「Upload public key file (.pub)」あるいは「Paste public key」を選択して既存の公開キーを指定します。
- その他の設定は、デフォルトで構いません。「Next」を選択します。

- Boot volume はデフォルトで構いません。「Next」を選択します。
- 最後にReview の画面で「Create」を選択します。

- インスタンス構成が作成されました。

インスタンスプールの作成
- OCIの管理コンソールにて、左ナビゲーションから「Compute」→「Instance pools」を選択します。
- 「Create instance pool」を選択します。
- 「Name」を入力します。
- 「Number of instances」に「1」を指定します。
- 「Instance configuration」に先ほど作成したインスタンス構成を選択します。「Next」を選択します。

- Availability domains において、Primary VNIC の設定を行います。
- Virtual cloud network、Subnet を選択します。作成済みのVCN、プライベートサブネットを選択します。

- 「Attach a load balancer」を有効にし、「Load balancer type」に「Load balancer」を選択、「Load balancer」、「Backend Set」に作成済みのロードバランサー、バックエンドを選択、「Port」に「80」を選択します。「Next」を選択します。

- 最後にReview の画面で「Submit」を選択します。

- インスタンスプールが作成されました。以下の画像は、インスタンスプール作成のジョブ画面です。
- 指定通りインスタンスが1台起動し、ロードバランサーにアタッチされました。

インスタンスにログイン・OS 設定のチェック
- 以下の画像は、ナビゲーション・メニューから「Compute」→「Instances」を選択した画面です。

- Cloud Shell を使用して、インスタンス OS にssh接続を行います。なお、Cloud Shell はプライベートネットワークに切り替えて作業を行います。Cloud Shell をプライベートネットワークに切り替える方法は、こちらのブログを参照ください。
- インスタンス OS にssh接続後、以下のように、httpdサービスがインストールされサービスが起動していること、localhost にcurl を行ってhtml が返ることを確認します。
systemctl status httpd curl http://localhost

オートスケーリングポリシーの設定
- 続いて、インスタンスプールにオートスケーリングを設定します。
- OCIの管理コンソールにて、インスタンスプールが選択された状態から、「Actions」→「Create autoscaling configuration」を選択します。

- 「Name」を入力します。「Next」を選択します。

- Autoscaling policiesにおいて、「Add autoscaling policy」を選択します。
- 「Type」に「CPU utilization」を選択します。
- 「Autoscaling policy name」を入力します。

- 続けて、Scale-out rule、Scale-in rule、Scaling limits を設定します。
- 「Scale-out operator」に「Greater than (>)」選択、「Scale-out threshold percentage」に「60」、「Number of instances to add」に「1」を指定します。
- 「Scale-in operator」に「Less than (<)」選択、「Scale-in threshold percentage」に「40」、「Number of instances to remove」に「1」を指定します。
- 「Minimum number of instances」に「1」、「Maximum number of instances」に「4」、「Initial number of instances」に「1」を指定します。
- 「Add policy」を選択します。

- Autoscaling policy が作成されました。「Next」を選択します。

- 最後にReview の画面で「Create」を選択します。

オートスケーリングの検証
負荷ツールの実行
- インスタンス起動時の Cloud-init スクリプトでインストールされた stress-ng を使用し、CPU使用率を意図的に高騰させます。
- cpuオプションで負荷をかけるワーカープロセスの数を指定します。インスタンスのOCPU数に合わせて、変更します。
stress-ng --cpu 2 &
- top コマンドで、CPU使用率を監視します。数秒以内に、CPU使用率が99% まで上がりました。
top -c

スケールアウトの確認
- OCIの管理コンソールにて、左ナビゲーションから「Compute」→「Instance pools」を選択します。
- インスタンスプールを選択し、「Monitoring」を選択します。
- メトリクスのCPU Utilization を確認します。メトリクスからもCPU使用率が上がり、100% に張り付いていることが確認できます。

- 次に、「Details」を選択し、「Attached instances」を確認します。スケールアウトのルールに合致したため、インスタンスが1台から2台に増えたことが確認できます。

- OCIの管理コンソールにて、左ナビゲーションから「Networking」→「Load balancer」を選択します。
- ロードバランサーを選択し、「Backend sets」を選択します。
- 以下の画像は、バックエンドのヘルスステータスです。起動したインスタンスは、自動的にロードバランサー配下に追加されました。

- 続いて、ブラウザからロードバランサーのIPアドレスにアクセスし、cloud-init スクリプトで配置したページが表示されることを確認します。

- 再読み込みすると、もう1台のサーバーへアクセスが切り替わります。

スケールインの確認
- 続いて、スケールインの検証を行います。pkill コマンドで、stress-ng の一連のプロセスを停止させます。
pkill stress-ng
- メトリクスのCPU Utilization を確認します。メトリクスからもCPU使用率が約0% に戻ったことが確認できます。

- ロードバランサーのバックエンドのヘルスステータスを確認します。
- スケールインのルールに合致したため、インスタンスが「Drained」のステータスに変わりました。ロードバランサーからインスタンスが切り離されたことが確認できます。スケールインの際、古くから起動していた順に削除対象となります。

- インスタンスプールを選択し、「Details」を選択します。
- 「Attached instances」を確認します。管理下のインスタンスが削除されたことを確認します。

まとめ
- OCI Compute でオートスケーリング構成のウェブサーバーの構築、オートスケーリングの検証を行いました。設定画面は視覚的に分かりやすく、迷うことなく設定を行うことができました。また、cloud-init スクリプトを使用することで、OS 設定の手間を省いています。
- OCI 学習のファーストステップとして、活用ください。