オンプレミスやPowerVSからDirect Link 2.0越しにVPE経由でICOSのDirect Endpointにアクセスする

# はじめに
IBM Cloud Object Storageには、3種類のエンドポイントがあります。
https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-endpoints
・Public Endpoint
・Private Endpoint
・Direct Endpoint

Private EndpointまたはDirect Endpointを使うと、プライベートネットワークを介してICOSとデータをやり取りできます。セキュアで、かつ、インターネット側へのアウトバウンド転送費用が発生しないため、オンプレミスからDirect Link経由でICOSのプライベート側にアクセスしたいというリクエストが以前からありました。
これまで、オンプレミスからICOSへは直接アクセスできなかったため（ICOSは利用者のサブネットでなく共有サービスセグメントに位置するため、そこまでのルーティング情報がオンプレミス側に広告されない）、IBM Cloud内に立てたreverse proxyを介してアクセスする必要がありました。
https://cloud.ibm.com/docs/direct-link?topic=direct-link-using-ibm-cloud-direct-link-to-connect-to-ibm-cloud-object-storage

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/8dcf4044-14cc-b620-547a-b915aa51b891.png)

また、PowerVSからICOSにアクセスする要件も多くありますが、上記と同様に直接は行けないため、x86側にreverse proxyを立てる必要がありました。
参考：　https://qiita.com/y_tama/items/bb9c553ba8f35f12f8a4


今回は、Virtual Private Endpoint（VPE）という、ICOS等のIBM CloudサービスへのエンドポイントをユーザーのVPCサブネット上に作成できるサービスの新機能についてです。
https://cloud.ibm.com/docs/vpc?topic=vpc-about-vpe

これまでVPEでは、同じVPCからの通信のみ可能で、Direct Link越しやTransit Gateway越しにはアクセスできませんでした。
今回の新機能として、Direct Link 2.0越しやTransit Gateway越しにVPEにアクセスできるようになったため、利用者自身でreverse proxyを構成する必要が無くなりました。
このVPEの新機能は、東京・大阪を含む、MZRで対応しています。

:::note warn
Direct Link 2.0越しやTransit Gateway越しにVPEにアクセスする機能はTCPのみサポートしています。NTPのようなUDPを使うプロトコルは対応していませんのでご注意ください。
https://cloud.ibm.com/docs/vpc?topic=vpc-end-to-end-private-connectivity-vpe&interface=cli
>Only TCP services are supported.
:::

# 構成概要

概要図は下記となります。
今回は接続元としてPowerVSを使用します。オンプレミスから接続する場合も同様の構成で可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/0b310023-4ea6-378c-116a-32751476751b.png)

手順の概要は下記となります。

・PowerVSとVPCをCloud Connections（Direct Link2.0）+Transit Gatewayで接続
・ICOSと紐づけたVPEをオーダー
・DNS ServicesでCustom Resolverを作成
・PowerVSのDNS参照先を上記で作成したCustom Resolverに設定
・PowerVS(AIX)上でICOSクライアント（今回はs3cmd）をセットアップ。接続確認。

# 構成詳細

## PowerVSとVPCをCloud Connections（Direct Link2.0）+Transit Gatewayで接続

PowerVSとVPCをCloud Connections（Direct Link2.0）+Transit Gateway経由で接続します（Transit Gatewayは必須ではありませんが、経路情報を確認できて便利なので利用します）。
https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-cloud-connections

ご参考に、PowerVSをTransit Gatewayに接続する画面キャプチャ入りの手順は下記です。（※下記では2箇所のPowerVSを繋いでいますが、今回は1箇所でOKです。）
https://qiita.com/y_tama/items/7000125129f817209796

PowerVSからのDirect LinkとVPCがTransit Gatewayに接続され、双方のルーティング情報が伝搬されている事を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/95413d83-822e-1c3c-9cfd-e80f5252eaea.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/01aea8a0-e248-4f29-9321-717942311bf5.png)

PowerVSのLPARでパブリックIPアドレスを有効にしていると、デフォルトゲートウェイがパブリック側を向いています。VPC宛の通信がプライベート側ゲートウェイにルーティングされるようAIXに静的経路を設定します。

```
# netstat -r
Routing tables
Destination        Gateway           Flags   Refs     Use  If   Exp  Groups

Route tree for Protocol Family 2 (Internet):
default            192.168.167.65    UG        8     39948 en0      -      -   
127/8              localhost         U         5      6771 lo0      -      -   
172.16.10/24       172.16.52.1       UGS       2     62784 en1      -      -   
172.16.20/24       172.16.52.1       UGS       0        34 en1      -      -   
172.16.30/24       172.16.52.1       UGS       0        51 en1      -      -   
172.16.52.0        172.16.52.253     UHSb      0         0 en1      -      -   =>
172.16.52/24       172.16.52.253     U         3         0 en1      -      -   
...
```

## ICOSと紐づけたVPEをオーダー

Virtual Private Endpointをオーダーします。
https://cloud.ibm.com/vpc-ext/provision/endpointGateway

VPEに紐づけるサービスとしてICOSを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/e285cd9c-48c0-c4f6-8967-f3b75fa2b6ed.png)

今回は大阪RegionalのICOSに紐づけるため、大阪RegionalのDirect Endpoint(s3.direct.jp-osa.cloud-object-storage.appdomain.cloud)を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/12581776-12a5-bc20-47ee-9d8f5896bcd3.png)

ICOSのEndpoint一覧は下記にあります。
https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-endpoints#endpoints-region

VPEに紐づけるVPC上のIPアドレスは後から設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/68c91f15-aa21-7926-46fe-acddf8783215.png)

作成されたVPEに対し、各ゾーンから1つずつサブネットを選び、紐づけます。この設定により、1つのゾーンに障害があった場合も、残ったゾーンのVPEを使用してICOSにアクセスすることが可能となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/1d8de697-72d1-3c59-98e9-f0e6d4fed332.png)

VPEにはSecurity Groupsが適用されるため、使用する通信を許可する設定を行います。
今回はPowerVSからICOSへのREST APIの通信なので、PowerVSのサブネット範囲からのTCP 443を許可します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/7ddfa92d-5986-6277-cd19-9f9dc430e850.png)

## DNS ServicesでCustom Resolverを作成

PowerVSからICOSを使用するときは、Direct EndpointのFQDN（今回は大阪なので、s3.direct.jp-osa.cloud-object-storage.appdomain.cloud）を指定します。

パブリックIPを有効にしたPowerVSのデフォルト状態では、このFQDNに対する名前解決は一般のリゾルバが利用され、161.26.x.xが返ります。このIPアドレスは、IBM CloudがプライベートNWに使用しているIPアドレス範囲ですが、PowerVSからは直接ルーティングされないため、このままではアクセスすることができません。

```:PowerVSのAIXでのデフォルトの名前解決結果（パブリックIPを有効にしたLPAR）
# nslookup s3.direct.jp-osa.cloud-object-storage.appdomain.cloud
Server:         9.9.9.9
Address:        9.9.9.9#53

Non-authoritative answer:
Name:   s3.direct.jp-osa.cloud-object-storage.appdomain.cloud
Address: 161.26.0.47
#
```

そこで、DNS Servicesの機能である、Custom Resolverを作成し、PowerVSのAIXのDNS参照先をCustom Resolverに設定します。Custom ResolverにはVPEの設定が反映されているため、s3.direct.jp-osa.cloud-object-storage.appdomain.cloudの名前解決要求に対し、VPEのIPアドレスを返してくれます。

:::note info
custom resolverを使わずに、AIXのhostsファイルでICOSのFQDNをVPEのIPアドレスに名前解決する（VPEを切り替えたい時はhostsファイルを手動で書き換える）事も可能と思いますが、今回は1つのVPEが使えなくなった際に切り替えを自動化する観点でcustom resolverを使用しています。
:::

まず、カタログからDNS Servicesを作成し、次に、作成されたDNS Servicesの中でCustom Resolverを作成します。

:::note info
DNS ServicesやCustom Resolverの価格については下記をご確認ください。
https://cloud.ibm.com/docs/dns-svcs?topic=dns-svcs-pricing
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/7d828a41-fc90-a605-17a1-8b71736d10c5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/c53b4b0e-8b0c-b6fa-1e62-57feb47a9f1e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/9d48ab2f-6239-6877-cfab-49fa29452ea2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/9faa5027-bdcb-47f8-437f-a38ea23d556f.png)

ユーザーのVPCのサブネット上に、PowerVSからアクセス可能なCustom Resolverが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/3d981279-7bf6-af7c-453c-31a4dcea4984.png)


## PowerVSのDNS参照先を上記で作成したCustom Resolverに設定

PowerVSのAIXのDNS参照先として、上記で作成したCustom ResolverのIPアドレスを指定します。

```
# cat /etc/resolv.conf 
#nameserver 127.0.0.1
#nameserver 9.9.9.9
nameserver 172.16.10.8
nameserver 172.16.20.5
# 
```

Custom ResolverはVPEの設定が反映された名前解決を行うため、ICOSのDirect EndpointのFQDNへの名前解決要求に対し、VPEのIPアドレスを返します。

```:PowerVSのAIXでの名前解決結果（custom resolverを参照）
# nslookup s3.direct.jp-osa.cloud-object-storage.appdomain.cloud
Server:         172.16.10.8
Address:        172.16.10.8#53

Name:   s3.direct.jp-osa.cloud-object-storage.appdomain.cloud
Address: 172.16.10.11
#
```

:::note info

試しにVPEにアタッチするIPアドレスを削除すると、一定時間（おそらくDNSのTTL）経過後、残っているゾーンのIPアドレスを返すようになります。

上記でcustom resolverが返していた172.16.10.11をVPEから削除。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/1bff27f9-5864-1584-1a16-a90c52f4bb2a.png)

一定時間経過後、残っているゾーンのIPアドレスを返すようになる。
```
# nslookup s3.direct.jp-osa.cloud-object-storage.appdomain.cloud
Server:         172.16.10.8
Address:        172.16.10.8#53

Name:   s3.direct.jp-osa.cloud-object-storage.appdomain.cloud
Address: 172.16.30.6

#
```
:::

## PowerVS(AIX)上でICOSクライアント（今回はs3cmd）をセットアップ。接続確認。

AIXで使うICOSクライアントツールとして、今回はs3cmdを使います。yumが使える環境であれば下記で導入できます。

```
# export PATH=$PATH:/opt/freeware/bin
# yum install python-pip -y
# pip install s3cmd
```

設定ファイル（.s3cfg）を設定します。access_keyとsecret_keyは、ICOSのHMACクレデンシャルを使います。

```
# cat .s3cfg 
[default]
access_key = xxxxxxxxxxxxxxxxxxxxxxxxx
secret_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
host_base = s3.direct.jp-osa.cloud-object-storage.appdomain.cloud
host_bucket = %(bucket)s.s3.direct.jp-osa.cloud-object-storage.appdomain.cloud
# 
```

s3cmdを使ってICOSにアクセスできている事を確認します。

```
# s3cmd ls
2021-11-08 15:04  s3://bucket-osa-20211109
# s3cmd ls s3://bucket-osa-20211109
2022-09-12 11:54   1073741824  s3://bucket-osa-20211109/tmpfile
2022-09-12 11:57   1073741824  s3://bucket-osa-20211109/tmpfile2
# 
```

今回の構成で使ったVPEもCustom Resolverもマネージドサービスのため、これまでのように手動でreverse proxyを構成する事なくICOSにアクセスできるようになり、かなり便利に使えるようになったと思います。

以上