OCIのFLB(フレキシブルロードバランサ)を使う

# はじめに

OCIのフレキシブルロードバランサを使ってみる。
ロードバランサの後ろに2台インスタンスがぶら下がっていて、httpでアクセスするとランダムにバックエンドに振り分けられる構成を考える。
`curl http://${ロードバランサのIP}/hello.html`を打つと、`this is instance 1.` と`this is instance 2`がランダムに返ってくるイメージ。

# バックエンドの作成

先にバックエンドのインスタンスを2つ作成しておく。

1つ目のインスタンス(my-instance)を作成する。
・既存のコンパートメント(my-compartment) に作成
・既存のmy-vcnのパブリックサブネットに作成
　・せっかくロードバランサの後ろにぶら下げるので、インスタンスはプライベートサブネットに作ってもよいのだが、検証用途のため。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/6d433e10-7545-1ef5-65ba-e72ba354714f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/c3301333-7cdd-e2cd-49ec-2931928527ae.png)

作成できた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/2c6f2a55-0a06-7879-1e98-8b9fc24ef438.png)

ログインする。

```shell
PS > ssh -i .\ssh-key-2023-10-09.key opc@xxx.xxx.xxx.xxx -o ServerAliveInterval=60
The authenticity of host 'xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx)' can't be established.
ED25519 key fingerprint is SHA256:BZfuA9IqggeNYpo8wZ7XFdX0gePAZ27yy0/rKpO8WqE.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'xxx.xxx.xxx.xxx' (ED25519) to the list of known hosts.
Activate the web console with: systemctl enable --now cockpit.socket

[root@my-instance ~]# 
```

いくつか設定を入れる。

```shell
# OCI提供のoracle linux デフォルトイメージでは、firewalldが最初から有効になっている。
# ありがたいことなのだが検証用途では面倒なのでいったんOFFする
[root@my-instance ~]# systemctl stop firewalld

# apacheを入れる。
[root@my-instance~]# yum install httpd

# httpd サービスを起動する
[root@my-instance ~]# systemctl start httpd

# ヘルスチェック用にファイルを一つ置いておく。200になればよいので中身はなんでもよい。
[root@my-instance ~]# echo "ok" > /var/www/html/ok.html

# どのインスタンスかがわかるように、判別用のファイルを置いておく。
[root@my-instance ~]# echo "this is my instance."  > /var/www/html/hello.html
```

もう一つのインスタンスも同様に作成する。

# セキュリティリスト

サブネット内で、LB → インスタンス:80番ポートの通信ができる必要があるため、LB・インスタンスが配置されているパブリックサブネットのセキュリティリストに許可設定を入れる。
・このルールがサブネット内のすべてのVNICに適用される。同じサブネット内だからといってツーカーではない点に注意。
・LB作成時に自動で作成されたような気もするが、念のため。（LB作成時に自動生成するか手動で入れるか選べる）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/a47b30e3-7bdd-46dc-50c1-c7f23cd0c579.png)


# ロードバランサの作成


・パブリックロードバランサを指定し、ロードバランサにパブリックIPを持たせる。
・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/ee3b48f0-2d44-8639-7394-9a58ca753dbc.png)

・配置サブネットはインスタンスと同じ、my-vcnのパブリックサブネットに作成。
・拡張オプションは特に変更せず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/3c72b1cf-a58b-a4a9-b2ad-a34f13d793d9.png)

・ロードバランシング・ポリシーは「重みづけラウンドロビン」。特に重みを設定しないのでランダムになる。
・バックエンドサーバに先ほど作成したインスタンス2つを指定。（2つ目がmy-instance3になっているが気にしないでください）
・ヘルスチェックポリシーのURLパスには先ほど作成した`/ok.html`を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/990fca5f-15ed-8d70-5d6b-6e8c2efa78f5.png)

・リスナはHTTP。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/1f8d16d3-e848-165d-4b33-355fc8bed11d.png)

・エラーログ・アクセスログともに有効化。
・アクセスログはデフォルトでは有効になっていないが、合わせて有効にしておくと便利。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/eba2fb9f-f818-261d-6ae4-4e1c60936a0b.png)


・作成できた。
・ヘルスチェックも無事OKになっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/f5a7aeb6-2161-2f24-c768-541b7a2b223b.png)

うまくいかないときはエラーログを確認すると色々情報が出ている。以下はfirewalldをOFFにし忘れてヘルスチェックが通らなかった際のエラー。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/faa47471-4bd9-41f0-8945-8d60531e9e1e.png)


# 動作確認

手元からcurlを打ってみると、期待した通り、
リクエストごとにランダムなインスタンスに割り振られていることがわかる。


```
PS > curl http://xxx.xxx.xxx.xxx/hello.html


StatusCode        : 200
StatusDescription : OK
Content           : this is my instance.

RawContent        : HTTP/1.1 200 OK
                    Connection: close
                    Accept-Ranges: bytes
                    Content-Length: 21
                    Content-Type: text/html; charset=UTF-8
                    Date: Sat, 09 Dec 2023 23:21:23 GMT
                    ETag: "15-60c1b4d3d5839"
                    Last-Modified: Sat,...
Forms             : {}
Headers           : {[Connection, close], [Accept-Ranges, bytes], [Content-Length, 21], [Content-Type, text/html; charset=UTF-8], [Date, Sat, 09 Dec 2023 23:21:23 GMT], [ETag,
                     "15-60c1b4d3d5839"], [Last-Modified, Sat, 09 Dec 2023 22:34:19 GMT]}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 21



PS I> curl http://xxx.xxx.xxx.xxx/hello.html


StatusCode        : 200
StatusDescription : OK
Content           : this is my instance3.

RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    Accept-Ranges: bytes
                    Content-Length: 22
                    Content-Type: text/html; charset=UTF-8
                    Date: Sat, 09 Dec 2023 23:21:24 GMT
                    ETag: "16-60c1b49915144"
                    Last-Modified:...
Forms             : {}
Headers           : {[Connection, keep-alive], [Accept-Ranges, bytes], [Content-Length, 22], [Content-Type, text/html; charset=UTF-8], [Date, Sat, 09 Dec 2023 23:21:24 GMT], [
                    ETag, "16-60c1b49915144"], [Last-Modified, Sat, 09 Dec 2023 22:33:18 GMT]}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 22

```


アクセスログにも表示されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/66e62894-f260-fa6f-6d12-5716eccf49f2.png)