IBM Cloud: F5 BIG-IP Virtual Edition on VPCでHTTPリクエストを負荷分散(private-to-private)してみた

# 1. はじめに

前回、[IBM Cloud: VPCにF5 BIG-IP Virtual Editionを導入してみた](https://qiita.com/testnin2/items/395eb7ea5c9fd274863d)という記事で、IBM CloudのVPC上にF5 BIG-IP Virtual Editionをデプロイしました。
本稿では、設定を追加してF5 BIG-IP経由でWebサーバーの負荷分散をしてみたいと思います。


# 2. NW構成

F5のインターフェース情報は以下のようになっていたが、今回はアプリケーション処理をするためには１つ目のdata-1-1しか使わないことにする(one-arm構成。そもそも別Availability Zoneへの割り振りもしたいので)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/a88b532b-5685-3fb1-153e-5b0cf9724361.png)

今回構成したいNWの全体像は以下になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/5ec5be5c-ac69-0d32-4dfd-8c64d94782dd.png)

# 3. IBM Cloud(VPC)の設定

## 3-1. Webサーバーの構築
（省略）

## 3-2. Custom Routeの設定(Virtual IPの作成）
将来BIG-IPでHA構成にする場合、そのStandby側のサーバーにもまったく同じアドレスでクライアントからアクセスしたい。そのために、`192.168.10.10`というアドレス宛へのパケットは172.16.5.7に転送されるようにVPCのcustom routeを構成しておき、もしBIG-IPに障害があった時にはcustom routeの設定を変えるだけでStandby側のBIG-IPにアクセスするように構成したい。
このあたりの手順は、[IBM Cloud: VPC Custom Routesを利用したAZまたぎのHA環境の構成例(VPC内部からのアクセス）](https://qiita.com/testnin2/items/95d539f0e08a0f14788c)などに詳細に説明したので、参照のこと。

最終的には以下のような設定になり、private-to-privateの割り振りができることを確認した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/a50a38ce-8050-94a7-edc2-72e841c76bdb.png)

## 3-3 IP Spoofingの設定。

1-1のインターフェースで192.168.10.10というアドレスの送受信をする必要があるため、IP Spoofingを有効化させる必要がある。そのあたりの説明も[IBM Cloud: VPC Custom Routesを利用したAZまたぎのHA環境の構成例(VPC内部からのアクセス）](https://qiita.com/testnin2/items/95d539f0e08a0f14788c)などを参照のこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/dbc22ea3-06c2-8d83-ea30-2a5e2864e567.png)


# 4. BIG-IPの構成

## 4-1. Static Routeの構成

VPCでデプロイされたBIG-IPにおいて、Default Gatewayはmgmtインターフェースが利用されている。よって、デフォルト構成では別subnetとの通信にmgmtインターフェースが使われてしまう。
mgmtインターフェースにはFloating IPが割り当てられているため、Default Gatewayの変更までやるのは今回は敷居が高いと考え、まずは簡単に構成するために、Webサーバー宛のパケットは1.1側のGateway(つまり172.16.5.1)を利用するようにStatic Routeで構成する。

- Network -> Routesにて、「Create」を押下。<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/d111533c-6131-07e6-8fc1-d5c721b8522e.png)
- Static Routeの設定(WebServer1用）。完了したらFinishedを押下。<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/e6f5ab65-7d8d-f3aa-2f10-505f197e9765.png)
- Static Routeの設定(WebServer2用）。完了したらFinishedを押下。<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/6423e9b6-ad3e-26d8-5018-26ece2eb6869.png)


## 4-2. (Backend memberを登録する）Poolの作成

- Local Traffic -> Poolsにて、「Create」を押下。<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/0812ab00-bbdd-f071-d4d6-189955cac83f.png)
- 以下の入力をしてFinishedを押下。
    - Name
    - Health Monitors
    - Load Balancing Method
    - New Members(Node Name, Address, Service Port)<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/6cd1ca8e-2f32-bf9f-27cc-e26e0e278f9a.png)
- - Statusが緑色（正常）になっていることを確認<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/0275cb0f-3f84-f930-8d9b-2cdda276c2dc.png)<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/7c61e0c4-4bb0-85ac-0334-e8ddcd473da7.png)


## 4-3. (ClientからのアクセスをListenする）Virtual Serverの構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/4ec3554a-b2aa-0794-ad7b-952faa6c1ba0.png)

- Local Traffic -> Virtual Serversにて、「Create」を押下。<br>
- 以下を入力してFinished.
    - Name
    - Destination Address(VIPである192.168.10.10を指定）
    - Service Port<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/98ebbacb-d220-aae6-79be-16b4d0c96cc6.png)
    - HTTP Profile (Client) -> `http`
    - Source  Address Translation -> `Auto Map` <br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/7499b889-ae55-dc61-7b02-4c4acfb81840.png)
    - Default Pool -> 先ほど作成したPool。<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/d879f88e-811b-5145-b57c-8449ca58f8ef.png)


（補足）Source Address TranslationのAuto Mapについて
以下はBIG-IPのマニュアルより引用

> バーチャルサーバの仕組みについて
（途中略）
BIG-IPが、要求パケットのDestination IP Addressヘッダに含まれる宛先IPアドレス （つまり、バーチャルサーバのアドレス）を、選択されたノードの実際のアドレスに変更します。この場合、 パケットに含まれる送信元アドレス （つまり、 その接続を開始したクライアントのアドレス） は変更されずに残ります。
（途中略）
> 常にBIG-IP経由でサーバ応答が返されるよ うにするには、 サーバのデフォルト経路を内部VLANのセルフIPアドレスに設定する必要があります。サーバがBIG-IPとは別のネッ トワーク上に置かれており、この設定ができない場合は、SNATを作成することが可能です。
（途中略）
>SNAT automapというBIG-IPの機能を利用してSNATを作成する方法もあります。SNAT automap機能では、BIG-IP自身のIPアドレスからいずれか1つ（通常は出力VLANのフローティングセルフIPアドレス） が自動的に選択され、 オリジナルIPアドレスまたはSNAT作成時に指定したアドレスにそれがマップされます。この機能を使用すると、 変換アドレスを明示的に指定する必要がなくなります。


# 5. テスト

VPC上のサーバーからアクセステスト

```
[root@syssuda5-vpc2 ~]# curl 192.168.10.10
tokyo1-web1
[root@syssuda5-vpc2 ~]# curl 192.168.10.10
tokyo2-web1
[root@syssuda5-vpc2 ~]# curl -I 192.168.10.10
HTTP/1.1 200 OK
Date: Wed, 02 Dec 2020 06:54:35 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips
Last-Modified: Mon, 30 Nov 2020 01:02:49 GMT
ETag: "c-5b54891aea968"
Accept-Ranges: bytes
Content-Length: 12
Content-Type: text/html; charset=UTF-8
```