Windows に Oracle Cloud Infrastructure のコマンドライン・インターフェース(OCI CLI)をインストールする

Windows マシンに Oracle Cloud Infrastructure の CLI をインストールする際にすこし手間取ったのでメモ書き。
基本的に[これ](https://docs.oracle.com/ja-jp/iaas/Content/API/SDKDocs/cliinstall.htm)に沿って実施しているので，公式ドキュメントで十分な人であればこの記事はいらない。

# OCI CLI のインストール
## ①PowerShell を管理者権限で開く

もし Windows PowerShell しかない場合は，念のため最新の（OSS 化した）PowerShell をインストールしておくとよい。 
see: https://github.com/PowerShell/PowerShell/releases

## ②実行ポリシを RemoteSigned に変更する

後段にてダウンロードした PowerShell スクリプトを実行するため，実行ポリシを RemoteSigned に変更する。
いまのPowerShellプロセスのみに適用されるようスコープを指定しておくとよいです。

```powershell
Set-ExecutionPolicy RemoteSigned -Scope Process
```

## ③インストールスクリプトをダウンロードする

以下のコマンドを実行。

```powershell
Invoke-WebRequest https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.ps1 -OutFile install.ps1
```

もし `SSL/TLS のセキュリティで保護されているチャネルを作成できませんでした` エラーが発生した場合は，以下記事を参考に TLS1.2 の有効化を行う。
[PowerShell で GitHub に wget(Invoke-WebRequest) できない場合の対処方法](https://qiita.com/tikkss@github/items/4db7bec95a7337ca826d)

## ④インストールスクリプトを実行する

全てデフォルトの設定でインストールする場合は以下のコマンドを実行する。

```powershell
install.ps1 -AcceptAllDefaults
```

プロンプトを表示し対話式に設定を行いながらインストールする場合は，以下コマンドを実行すると公式ドキュメントには書いてある。

```powershell
iex ((New-ObjectSystem.Net.WebClient).DownloadString('https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.ps1'))
```

しかし，前段で同 URL からスクリプトをダウンロードしているので，おそらく

```powershell
install.ps1
```

だけでよいかも。というか前者のコマンドを実行したらエラーが起きた[^1]。

## インストールの確認

インストール後は，`oci -v` でバージョンが表示されることを確認しておく。

```
PS C:\Windows\System32> oci -v
2.17.0
```

# APIキーの設定
## 秘密鍵/公開鍵の作成
OCI CLI を使って，キーペアを作成する。
キーペアの作成は`oci setup keys`コマンドで行える。

```
PS C:\Windows\System32> oci setup keys
Enter a passphrase for your private key (empty for no passphrase):
Public key written to: C:\Users\【ユーザ名】\.oci\oci_api_key_public.pem
Private key written to: C:\Users\【ユーザ名】\.oci\oci_api_key.pem
Public key fingerprint: 【フィンガープリント】


    If you haven't already uploaded your API Signing public key through the
    console, follow the instructions on the page linked below in the section
    'How to upload the public key':

        https://docs.cloud.oracle.com/Content/API/Concepts/apisigningkey.htm#How2
```

## 公開鍵の登録

前段で作成した公開鍵を OCI のユーザに登録する。

### ① OCIコンソールを開き，ユーザ画面へ移動する

OCIコンソール画面右上のプロファイルからユーザ詳細画面へ移動する。
![2021-01-04_173132.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66988/40c31d87-61e4-b390-5f15-d37990d13506.png)

### ②APIキー設定画面を開く

ユーザ詳細画面左下「リソース」から，「APIキー」を選択。
![2021-01-04_173316.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66988/28576b15-4043-1a61-2eda-c831b1b5671e.png)

すると以下の画面が表示される。
スクリーンショットでは，キーを追加済みなのでフィンガープリントが表示されているが，設定していない場合はここにはなにも表示されない。
「APIキーの追加」をクリック。
![2021-01-04_173342.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66988/905d2256-0042-809d-9cf3-67b136e22faf.png)

「APIキーの追加」をクリックすると以下のダイアログが開く。
![2021-01-04_174036.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66988/def2b3c6-1341-8893-596c-00a9018a3540.png)

### ③APIキーを設定する

この画面でAPIキーペアを生成することもできるが，今回は先ほど作成したキーペアを使用するため，「公開キー・ファイルの選択」または「公開キーの貼付け」を選択する。
![2021-01-04_173419.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66988/af7510ca-a068-cb92-707d-d9281e1f5412.png)

ここでは「公開キーの貼付け」を選択し，先ほど作成した公開キー(`oci_api_key_public.pem`)の中身をテキストエリアに貼り付ける。

![2021-01-04_174206.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66988/911222de-1b69-589f-1f8b-10377d2c8836.png)

貼り付けたら「追加」をクリックする。
設定が完了したら，先ほどのAPIキー一覧テーブルにフィンガープリントとともに表示される。

## OCI CLI設定ファイルを作成する

前段までで，秘密鍵/公開鍵の作成と登録を行った。
ここからはOCI CLIにこれらのキーペアを認識させるための手順となる。

### ①ユーザ OCID の確認

ユーザ OCID は，APIキーの設定で開いたユーザ詳細画面から確認できる。

![2021-01-04_180243.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66988/8e941bf7-2739-bdcd-0035-de78ed60a088.png)

「ユーザー情報」タブの「OCID」欄に表示されている。
「コピー」をクリックするとクリップボードにコピーされるので，控えておく。

### ②テナンシ OCID，ホームリージョンの確認
ユーザ詳細画面と同様，プロファイルからテナンシ詳細画面に移動する。

![2021-01-04_180448.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66988/b004e5c3-10e1-92b6-8ec4-9d8c878158b1.png)

こちらもユーザ詳細画面と同様，「テナンシ情報」タブの「OCID」欄に表示されている。
「コピー」をクリックするとクリップボードにコピーされるので，控えておく。
また，テナンシのホームリージョンもあわせて確認しておく。
![2021-01-04_175957.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66988/3fafaecf-b35f-9ac6-da24-a71061f0ac46.png)

### ③`oci setup config` で設定ファイルを作成する

①，②で確認した情報をもとに，`oci setup config`コマンドで対話式に設定ファイルを作成する。

なお，リージョン名とリージョン識別子の対応は以下に記載されている。
リージョン名が `Japan East(Tokyo)` の場合は，`ap-tokyo-1` がリージョン識別子となる。
https://docs.oracle.com/en-us/iaas/Content/General/Concepts/regions.htm

```
PS C:\Windows\System32> oci setup config
    This command provides a walkthrough of creating a valid CLI config file.

    The following links explain where to find the information required by this
    script:

    User API Signing Key, OCID and Tenancy OCID:

        https://docs.cloud.oracle.com/Content/API/Concepts/apisigningkey.htm#Other

    Region:

        https://docs.cloud.oracle.com/Content/General/Concepts/regions.htm

    General config documentation:

        https://docs.cloud.oracle.com/Content/API/Concepts/sdkconfig.htm


Enter a location for your config [C:\Users\【ユーザ名】\.oci\config]:
Enter a user OCID: 【①で確認したユーザ OCID】
Enter a tenancy OCID: 【②で確認したテナンシ OCID】
Enter a region (e.g. ap-chiyoda-1, ap-chuncheon-1, ap-hyderabad-1, ap-melbourne-1, ap-mumbai-1, ap-osaka-1, ap-seoul-1, ap-sydney-1, ap-tokyo-1, ca-montreal-1, ca-toronto-1, eu-amsterdam-1, eu-frankfurt-1, eu-zurich-1, me-dubai-1, me-jeddah-1, sa-santiago-1, sa-saopaulo-1, uk-cardiff-1, uk-gov-cardiff-1, uk-gov-london-1, uk-london-1, us-ashburn-1, us-gov-ashburn-1, us-gov-chicago-1, us-gov-phoenix-1, us-langley-1, us-luke-1, us-phoenix-1, us-sanjose-1): 【②で確認したホームリージョンを指定しておく】
Do you want to generate a new API Signing RSA key pair? (If you decline you will be asked to supply the path to an existing key.) [Y/n]: n【すでに作成済みのため n を選ぶ】
Enter the location of your API Signing private key file: C:\Users\【ユーザ名】\.oci\oci_api_key.pem
Fingerprint: hogehoge
Config written to C:\Users\【ユーザ名】\.oci\config


    If you haven't already uploaded your API Signing public key through the
    console, follow the instructions on the page linked below in the section
    'How to upload the public key':

        https://docs.cloud.oracle.com/Content/API/Concepts/apisigningkey.htm#How2
```

作成した設定ファイルは`C:\Users\【ユーザ名】\.oci\config`に保存される。

## APIが実行できることを確認する

なんらかのコマンドを実行して，APIが実行できることを確認する。

```
PS C:\Windows\System32> oci iam region list --output table
+-----+----------------+
| key | name           |
+-----+----------------+
| AMS | eu-amsterdam-1 |
| BOM | ap-mumbai-1    |
| CWL | uk-cardiff-1   |
| DXB | me-dubai-1     |
| FRA | eu-frankfurt-1 |
| GRU | sa-saopaulo-1  |
| HYD | ap-hyderabad-1 |
| IAD | us-ashburn-1   |
| ICN | ap-seoul-1     |
| JED | me-jeddah-1    |
| KIX | ap-osaka-1     |
| LHR | uk-london-1    |
| MEL | ap-melbourne-1 |
| NRT | ap-tokyo-1     |
| PHX | us-phoenix-1   |
| SCL | sa-santiago-1  |
| SJC | us-sanjose-1   |
| SYD | ap-sydney-1    |
| YNY | ap-chuncheon-1 |
| YUL | ca-montreal-1  |
| YYZ | ca-toronto-1   |
| ZRH | eu-zurich-1    |
+-----+----------------+
```

なお，`--output table` を指定しない場合は，JSON 形式でレスポンスが返ってくる。


# Reference
- https://docs.oracle.com/ja-jp/iaas/Content/API/Concepts/cliconcepts.htm
- https://qiita.com/shirok/items/e63be9a22158fef10ba9
- https://qiita.com/sugimount/items/63a8cfe1163030ae8804

## 本記事におけるバージョン情報

```
PS C:\Windows\System32> systeminfo
OS 名:                  Microsoft Windows 10 Pro
OS バージョン:          10.0.19042 N/A ビルド 19042
```

```
PS C:\Windows\System32> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      7.1.0
PSEdition                      Core
GitCommitId                    7.1.0
OS                             Microsoft Windows 10.0.19042
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0
```

```
PS C:\Windows\System32> oci --version
2.17.0
```

[^1]: [これ](https://speakerdeck.com/mmarukaw/oci-cli-woshi-idao-su?slide=5)を見ると、`powershell -NoProfile -ExecutionPolicy Bypass "iex ((New-ObjectSystem.Net.WebClient).DownloadString('https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.ps1'))"`を実行するとあるので、こちらならいいのかも？