複数のパブリックIPを使用してOCI VMにアクセスする

本ブログは、[オラクル・クラウドの個人ブログ](https://qiita.com/letian/items/10152a4fec813c1b7d98)の1つです。

# 初めに
OCI（Oracle Cloud Infrastructure）は、<strong>エフェメラル</strong>と<strong>予約済</strong>の2種類のパブリックIPを提供します。どちらも<font color=blue>無料</font>です。これは、他のクラウド・プロバイダーによりも大きな利点です。AWS、Azure、またはGCPを使用している場合は、パブリックIPの料金を支払う必要があります。

|クラウド・プロバイダー|OCI|AWS|Azure|GCP|
|:--|:---|:--|:---|:---|
|IPの名称|Public IP|Elastic IP|Static IP, Dynamic IP|External IP|
|料金|<font color=blue>無料</font>|[有料](https://aws.amazon.com/ec2/pricing/on-demand/#Elastic_IP_Addresses)|[有料](https://azure.microsoft.com/en-us/pricing/details/ip-addresses/)|[有料](https://cloud.google.com/vpc/pricing#ipaddress)|

「パブリックIP」の呼び方は、クラウド・プロバイダーによって異なりますのでご注意ください。

パブリック・サブネットのインスタンスを起動すると、デフォルトではインスタンスはパブリックIPを取得します。特定のインスタンスに複数のセカンダリVNICを含めることができ、特定のVNICには複数のセカンダリ・プライベートIPを含めることができます。したがって、必要に応じて、1つ以上のVNICで特定のインスタンスに<font color=blue>複数のパブリックIPを割り当てることができます</font>。

<strong>エフェメラル・パブリックIPの制限</strong>:
1. VNICごとに<font color=blue>1つ</font>
2. VMインスタンスごとに<font color=blue>2つ</font>、ベア・メタル・インスタンスごとに16 

では、異なるVNICにまたがる2つのパブリックIPを使用してOCI VMにアクセスする方法を簡単に紹介したいと思います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/93cf35ff-c889-790c-7002-25833887505a.png" width="600">

<strong>検証環境</strong>:
インスタンス・タイプ: OCI VM 
OS: Oracle Linux 7.9
パブリックIPのタイプ: エフェメラル
アタッチされたVNIC: ２つ

__ステップ__
[1. パブリックIP持ちのインスタンスを作成する](#1-パブリックip持ちのインスタンスを作成する)
[2. セカンダリVNICを追加する](#2-セカンダリvnicを追加する)
[3. 構成スクリプトを実行する](#3-構成スクリプトを実行する)

# 1. パブリックIP持ちのインスタンスを作成する
パブリック・サブネットのインスタンスを作成する時、デフォルトでは「<strong>パブリックIPv4アドレスの割当て</strong>」がチェックされます。起動後、プライマリVNICにエフェメラル・パブリックIPが割り当てられ、インスタンスの存続期間中に存在します。AWS Elastic IPとは異なり、OCIエフェメラル・パブリックIPは、インスタンスのリブート後に<strong>変更されません</strong>。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/b609249c-456e-ebd5-75f9-f645ab420beb.png">

OCIコンソールからパブリックIPをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/f16a032c-5982-dcc3-8442-16e3338cf988.png)

それで、SSHを使用してインスタンスにアクセスできます。セキュリティ・リストとルート・テーブル（インターネットGWを含む）が正しく設定されているのを確保しておいてください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/51b2a113-c287-da4b-7ed7-c5cf7c0dd408.png" width="600">

# 2. セカンダリVNICを追加する
Compute Instances -> Instance details -> Attached VNICs -> Create VNIC
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/718e1f7e-1d83-560c-1e21-07412fc5473f.png)

VNIC名（オプション）を入力し、VCNとサブネットを選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/97abe326-5e54-3048-6197-8e203ef0a9b6.png" width="600">

デフォルトでは「<strong>パブリックIPv4アドレスの割り当て</strong>」がチェックされていません。それをチェックし、「変更の保存」ボタンをクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/03559b30-c46e-a7b8-cb1a-020d4175cdfb.png" width="600">

VNICがアタッチされたら、VNICの詳細画面からパブリックIPを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/17c8cea2-f380-ccf8-c48f-23fa383bc3d8.png)

# 3. 構成スクリプトを実行する
セカンダリVNICをLinux VMインスタンスに追加すると、新しいインタフェース(イーサネット・デバイス)がインスタンスに追加され、OSで自動的に認識されます。ただし、DHCPはセカンダリVNICに対してアクティブではないため、静的IPアドレスおよびデフォルト・ルートでインタフェースを構成する必要があります。 

VNICを追加した後のインターフェース情報は、次のようです。（構成実行前）

```shell
[opc@linux-vm-with-public-ips ~]$ ifconfig
ens3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 9000
        inet 10.0.0.17  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::17ff:fe01:5084  prefixlen 64  scopeid 0x20<link>
        ether 02:00:17:01:50:84  txqueuelen 1000  (Ethernet)
        RX packets 4497  bytes 47103124 (44.9 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3943  bytes 2596438 (2.4 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 458  bytes 31519 (30.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 458  bytes 31519 (30.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[opc@linux-vm-with-public-ips ~]$
```

Oracleは、OS構成を完了するためのシェル・スクリプトを提供しています。[ここ](https://docs.oracle.com/en-us/iaas/Content/Resources/Assets/secondary_vnic_all_configure.sh)からスクリプトをダウンロードできます。

<strong>注意点</strong>
スクリプトでは、インスタンスを再起動した場合に維持されない単純な構成プロセスが使用されます。スクリプトを使用する場合、再起動するたびに再実行してください。

構成スクリプトをインスタンスにアップロードし、次のコマンドで実行します。
`secondary_vnic_all_configure.sh -c`

```shell
[opc@linux-vm-with-public-ips ~]$ pwd
/home/opc
[opc@linux-vm-with-public-ips ~]$ ll
total 56
-rwxr-xr-x. 1 opc opc 55938 Jan 11 07:18 secondary_vnic_all_configure.sh
[opc@linux-vm-with-public-ips ~]$ sudo ./secondary_vnic_all_configure.sh -c
Info: adding IP config for VNIC MAC 02:00:17:02:e6:f3 with id ocid1.vnic.oc1.ap-tokyo-1.abxhiljrzuxqqz4cir3z7htbswcn6ce4lcxk2fzgz544pe6utnv2woswjeoa
Info: added IP address 10.0.1.172 on interface ens5 with MTU 9000
Info: added rule for routing from 10.0.1.172 lookup ort1 with default via 10.0.1.1
[opc@linux-vm-with-public-ips ~]$
```

構成完了後のインターフェース情報は、次のようです。
("ens5"が追加された。)

```shell
[opc@linux-vm-with-public-ips ~]$ ifconfig
ens3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 9000
        inet 10.0.0.17  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::17ff:fe01:5084  prefixlen 64  scopeid 0x20<link>
        ether 02:00:17:01:50:84  txqueuelen 1000  (Ethernet)
        RX packets 5447  bytes 47346293 (45.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4810  bytes 3290349 (3.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens5: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 9000
        inet 10.0.1.172  netmask 255.255.255.0  broadcast 0.0.0.0
        inet6 fe80::17ff:fe02:e6f3  prefixlen 64  scopeid 0x20<link>
        ether 02:00:17:02:e6:f3  txqueuelen 1000  (Ethernet)
        RX packets 1  bytes 56 (56.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 10  bytes 796 (796.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 552  bytes 36599 (35.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 552  bytes 36599 (35.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[opc@linux-vm-with-public-ips ~]$
```
それで、SSHを使用して新しいパブリックIPでインスタンスにアクセスできます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/4013d92d-a362-e5cc-a666-2785fb63f515.png" width="650">

以上

__関連記事__
[オラクル・クラウドの個人ブログ一覧](https://qiita.com/liu-wei/items/10152a4fec813c1b7d98)
[OCI「エフェメラル・パブリックIP」を「予約済パブリックIP」に変更する方法](https://qiita.com/liu-wei/items/c663461adc1e763e91dd)

----
__公式ドキュメント__
[仮想ネットワーク・インタフェース・カード(VNIC)](https://docs.oracle.com/ja-jp/iaas/Content/Network/Tasks/managingVNICs.htm)
[Release Announcement - Reserved Public IPs are now available on Oracle Cloud Infrastructure!](https://blogs.oracle.com/cloud-infrastructure/post/release-announcement-reserved-public-ips-are-now-available-on-oracle-cloud-infrastructure)