IBM Cloud: 東京/大阪リージョンのprivate onlyの環境からインターネットに出ることなくCLIを実行する方法

# 1. はじめに

現在は、東京/大阪リージョンで、private onlyのVSIからCLIを直接実行することはできない。
回避策として、[publicへのアクセスが可能なproxyサーバーを指定してCLIを実行することもできる](https://qiita.com/testnin2/items/7d05acd6ab6d36fc91a0)が、本稿では別の回避策を紹介したい。

以下では、自動的にCLI更新を試行しないようにあらかじめ以下が構成されている。

```
$ ibmcloud config --check-version false
```

# 2. private endpoint(CSE)経由でのアクセス -> 失敗

これは、東京リージョンに、`private.jp-tok.iam.cloud.ibm.com`というendpointが存在しないためである。このendpointがないため、USリージョンなどにproxyを配置しても結局動かない。

```
$ ibmcloud login -a private.cloud.ibm.com --apikey @ibmcloud_apikey -r jp-tok
API endpoint: https://private.cloud.ibm.com
Targeted region jp-tok

Authenticating...
Post "https://private.jp-tok.iam.cloud.ibm.com/identity/token": dial tcp: lookup private.jp-tok.iam.cloud.ibm.com on 161.26.0.7:53: no such host

API endpoint:   https://private.cloud.ibm.com
Region:         jp-tok
Not logged in.
FAILED
Unable to authenticate.
```
```txt:debug情報
$ IBMCLOUD_TRACE=true ibmcloud login -a private.cloud.ibm.com --apikey @ibmcloud_apikey -r jp-tok 2>&1 | grep -i host
Host: private.us-south.globalcatalog.cloud.ibm.com
Host: private.us-south.globalcatalog.cloud.ibm.com
Host: private.us-south.globalcatalog.cloud.ibm.com
Host: private.us-south.globalcatalog.cloud.ibm.com
Host: private.us-south.globalcatalog.cloud.ibm.com
Host: private.us-south.globalcatalog.cloud.ibm.com
Host: private.jp-tok.iam.cloud.ibm.com
Post "https://private.jp-tok.iam.cloud.ibm.com/identity/token": dial tcp: lookup private.jp-tok.iam.cloud.ibm.com on 161.26.0.7:53: no such host
```

# 3. private endpoint(VPE)経由でのアクセス -> 失敗
そもそも東京リージョンに、CLIアクセスのためのVPEが存在しないので利用できない。

# 4. DALのProxyサーバー経由でVPEアクセスする方法 -> 成功

1. DALにVPCを構成し、proxyサーバーをsquidなどで構成する。
2. DALに以下のVPEの構成を行う。詳細手順は[こちら](https://cloud.ibm.com/docs/cli?topic=cli-service-connection#cli-private-vpc&locale=en)
    1. Account Management
    1. Global Catalog
    1. Global Search
    1. Global Tagging
    1. Usage Metering
    1. Enterprise Management
    1. Resource Controller
    1. User Management
3. TGWでTokyoおよびOsakaのVPCと、このDALのVPCを接続する。
4. Security Groupを構成し、Tokyo/OsakaのCLIを呼び出すVSIからDALのproxyサーバーに対してアクセス許可を与える。
5. Tokyo/OsakaのCLIを呼び出すVSIで、DALのproxyサーバー（以下の例では`192.168.0.19`)を利用するように構成する。[参考](https://qiita.com/testnin2/items/7d05acd6ab6d36fc91a0)
 
```
$ export https_proxy=http://192.168.0.19:3128
```

6 . プライベートエンドポイント(`private.cloud.ibm.com`）と`--vpc`オプションを指定してアクセスする。

```
$ ibmcloud login -a private.cloud.ibm.com --vpc --apikey @ibmcloud_apikey -r jp-tok
API endpoint: https://private.cloud.ibm.com
Targeted region jp-tok

Authenticating...
OK

Targeted account xxx (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx) <-> xxxxxxx

API endpoint:      https://private.cloud.ibm.com
Region:            jp-tok
User:              xxxxxx@xx.xxx.xxx
Account:           xxx (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx) <-> xxxxxxx
Resource group:    No resource group targeted, use 'ibmcloud target -g RESOURCE_GROUP'
CF API endpoint:
Org:
Space:

$ ibmcloud plugin install vpc-infrastructure

$ ibmcloud is vpcs
（問題なく東京リージョンのサーバーが表示された）

$ ibmcloud is instances
（問題なく東京リージョンのサーバーが表示された）
```

以下より、VPEアクセスの際には`tokyo`などのキーワードが入らないアドレスにアクセスしていることがわかる。

```txt:debug情報
$ IBMCLOUD_TRACE=true ibmcloud login -a private.cloud.ibm.com --vpc --apikey @ibmcloud_apikey -r jp-tok 2>&1 | grep -i host
Host: private.globalcatalog.cloud.ibm.com
Host: private.globalcatalog.cloud.ibm.com
Host: private.globalcatalog.cloud.ibm.com
Host: private.globalcatalog.cloud.ibm.com
Host: private.globalcatalog.cloud.ibm.com
Host: private.globalcatalog.cloud.ibm.com
Host: private.iam.cloud.ibm.com
Host: private.iam.cloud.ibm.com
Host: private.accounts.cloud.ibm.com
Host: private.user-management.cloud.ibm.com
Host: private.user-management.cloud.ibm.com

```