OCIコマンドライン（OCI CLI）をプライベートネットワーク内から実行する方法３選

# 1. はじめに
Oracle Cloud Infrastructure（OCI）にて、Webコンソールからボタンをポチポチ押してOCIリソースの操作を行うのとほぼ同等のことを、適切な権限があればインスタンスからコマンドで実行できるOCI CLIがある。
https://docs.oracle.com/ja-jp/iaas/Content/API/Concepts/cliconcepts.htm

OCI CLIはAPIがPythonでラッピングされており、OCI CLIコマンドを実行するとAPIエンドポイントと通信を行う。そのため、プライベートサブネットからAPIを発行してエンドポイントへ到達させるには経路の設定が必要になる。経路を設定する３つの方法を本記事では紹介する。

方法は以下の３つである。
①NATゲートウェイを利用してインターネットに出ていく。
②サービスゲートウェイを使用して、OCI環境内に閉じた通信を行う。
③プロキシを使用してインターネットへ出ていくルートを作る。

# 2. 初期状態での挙動
まずは、何も設定しない状態でプライベートサブネットからコマンドを実行してみる。その際、APIの実行履歴を出力させるためにデバックオプション```--debug```(または```-d```）をつけて実行する。

```bash
$ oci compute instance list --all -d
~省略～
DEBUG:oci.base_client.140243454499864:Endpoint: https://iaas.ap-tokyo-1.oraclecloud.com/20160918
INFO:oci.base_client.140243454499864: 2022-08-14 15:05:12.072064: Request: GET https://iaas.ap-tokyo-1.oraclecloud.com/20160918/instances
INFO:oci.base_client.140243454499864: 2022-08-14 15:05:23.487363: Request: GET https://iaas.ap-tokyo-1.oraclecloud.com/20160918/instances
～つづく～
```
となり、エンドポイントへの接続を所定の回数試行して失敗すると、以下のようなエラーが返ってくる。
```
oci.exceptions.ConnectTimeout: (MaxRetryError("OCIConnectionPool(host='iaas.ap-tokyo-1.oraclecloud.com', port=443): Max retries exceeded with url: /20160918/instances?
compartmentId=ocid1.compartment.oc1..aaaaaaaantybfae5pn7h77jmgcwgzg2hm27gv6whsiwhmo54ycefc3sxyiwa (Caused by ConnectTimeoutError(<oci.base_client.OCIConnection object at 0x7f8cf8e2f2b0>, 
'Connection to iaas.ap-tokyo-1.oraclecloud.com timed out. (connect timeout=10.0)'))",), 
'Request Endpoint: GET https://iaas.ap-tokyo-1.oraclecloud.com/20160918/instances 
See https://docs.oracle.com/en-us/iaas/Content/API/Concepts/sdk_troubleshooting.htm for help troubleshooting this error, or contact support and provide this full error message.')
```

エンドポイント（```iaas.ap-tokyo-1.oraclecloud.com```）にpingを打ってもらとわかるが、返ってこない。

# 3. 経路設定方法
## 3.1 NATゲートウェイの利用
NATゲートウェイを作成して、プライベートサブネットのルート表のルート・ルールに追加する。

まずは、
ネットワーキング＞仮想クラウド・ネットワーク＞仮想クラウド・ネットワークの詳細＞NATゲートウェイ
から「NATゲートウェイの作成」を行う。作成したNATゲートウェイをルート表のルート・ルールに追加する。
![01951106d2320a385b1563346721930462f9118f303fa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649674/a6d05c42-40a3-2144-49ce-e17e2d0d7844.png)

追加できたら、まずはエンドポイント（```iaas.ap-tokyo-1.oraclecloud.com```）にpingを打ってみる。きっと返ってくるはずだ。
エンドポイントへの疎通が確認できたら、OCIコマンドを実行してみよう。例えば以下のような。
```bash
$ oci compute instance list --all -d
```

インスタンス情報が出力されたと思う。

## 3.2 サービスゲートウェイの利用
社内ルールで、むやみにインターネットに出ていける設定をしてはいけない場合もあるはず。そういった場合には、OCIのVCN内に閉じた環境でエンドポイントへの通信できるサービスゲートウェイを利用するといい。
ネットワーキング＞仮想クラウド・ネットワーク＞仮想クラウド・ネットワークの詳細＞サービス・ゲートウェイ
からサービスゲートウェイを作成する。
![01951106d2320a385b1563346721930462f914cd84d54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649674/1f4c1fc0-2932-5a5d-4576-cdb7241e695b.png)
作成したら、さきほどと同じようにプライベートサブネットのルート表のルート・ルールに追加する。
![01951106d2320a385b1563346721930462f9151e5f6a7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649674/8a4e0e3d-53e3-5c21-2c6f-c8e8630c6b42.png)

追加できたら、まずはエンドポイント（iaas.ap-tokyo-1.oraclecloud.com）にpingを打つ。きっと返ってくるはずだ。
エンドポイントへの疎通が確認できたら、OCIコマンドを実行してみよう。
```bash
$ oci compute instance list --all -d
```
さきほどと同様に、インスタンス情報が出力されたことだと思う。

## 3.3 プロキシを使用してインターネット経由のルーティング
https通信を行う際に、パブリックサブネット内にあるプロキシサーバを経由するように設定をするだけでよい。
以下は、Squidサーバを経由してインターネットに出るよう設定した。
```bash
$ export HTTPS_PROXY=http://10.1.1.45:3128
```
設定した後はOCI CLIコマンドを実行すると成功するはずだ。



以上、3選でした。加筆修正することがあえば随時更新予定。

（作成途中）OCI CLIの設定方法
https://crieit.net/posts/OCI-AWS#7%EF%BC%8EOCI%20CLI%E3%81%AE%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%95