Oracle Cloud Infrastructure(OCI) のCLIを鍵認証無しで実行可能にしてみた

# はじめに
今回は、Oracle Cloud InfrastructureのComputeインスタンスにコマンド・ライン・インターフェース（CLI）をインストールし、また、下記のURLを参考に"Dynamic Groups"、"Policies"の設定で「Instance Principal」の構成をすることで**鍵認証無しでCLIを実行可能** にしてみた。
[Calling Services from an Instance](https://docs.cloud.oracle.com/iaas/Content/Identity/Tasks/callingservicesfrominstances.htm)

## 1. CLIのインストール
Install方法は以下のマニュアルに記載有。
[CLI Install方法](https://docs.cloud.oracle.com/iaas/Content/API/SDKDocs/cliinstall.htm)

### 1-1. Python確認
OCIのComputeインスタンスは必要なPythonが導入されているため確認をする。
(2.7.5 or 3.5以上)  

```
[opc@hostname ~]$ python -V
Python 2.7.5

```

### 1-2. Installの実施
今回はopcユーザーでInstallする。

```
[opc@hostname ~]$ bash -c "$(curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh)"
     　　　　　～省略～
===> In what directory would you like to place the install? (leave blank to use '/home/opc/lib/oracle-cli'):     ←そのままEnter
     　　　　　～省略～
===> In what directory would you like to place the 'oci' executable? (leave blank to use '/home/opc/bin'):     ←そのままEnter
     　　　　　～省略～
===> In what directory would you like to place the OCI scripts? (leave blank to use '/home/opc/bin/oci-cli-scripts'):     ←そのままEnter
     　　　　　～省略～
===> Modify profile to update your $PATH and enable shell/tab completion now? (Y/n): Y     ←Yを入力してEnter
     　　　　　～省略～
===> Enter a path to an rc file to update (leave blank to use '/home/opc/.bashrc'):      ←そのままEnter
 -- ** Run `exec -l $SHELL` to restart your shell. **
 -- 
 -- Installation successful.
 -- Run the CLI with /home/opc/bin/oci --help

### 上記の出力の通り下記を最後に実行
[opc@hostname ~]$ exec -l $SHELL
```

### 1-3. CLIの設定

```
[opc@hostname ~]$ oci setup config
     　　　　　～省略～
Enter a location for your config [/home/opc/.oci/config]:       ←そのままEnter
Enter a user OCID:       ←ユーザーのOCIDを入力
Enter a tenancy OCID:       ←TenancyのOCIDを入力
Enter a region (e.g. ca-toronto-1, eu-frankfurt-1, uk-london-1, us-ashburn-1, us-phoenix-1):       ←Regionを入力
Do you want to generate a new RSA key pair? (If you decline you will be asked to supply the path to an existing key.) [Y/n]: Y     ←Yを入力してEnter
Enter a directory for your keys to be created [/home/opc/.oci]: ←そのままEnter
Enter a name for your key [oci_api_key]: ←そのままEnter
Public key written to: /home/opc/.oci/oci_api_key_public.pem
Enter a passphrase for your private key (empty for no passphrase): ←そのままEnter
Private key written to: /home/opc/.oci/oci_api_key.pem
Fingerprint: 29:05:32:08:81:20:04:ae:d9:f9:c1:0b:61:bd:49:64
Config written to /home/opc/.oci/config
     ～省略～

[opc@hostname ~]$ ls -la
dr-xr-x---.  9 opc opc 4096 Jan 30 05:45 .
dr-xr-xr-x. 17 opc opc 4096 Jan 15 23:22 ..
-rw-------.  1 opc opc  208 Jan 30 04:51 .bash_history
-rw-r--r--.  1 opc opc   18 Apr 30  2014 .bash_logout
-rw-r--r--.  1 opc opc  176 Apr 30  2014 .bash_profile
-rw-r--r--.  1 opc opc  391 Jan 30 04:51 .bashrc
-rw-r--r--.  1 opc opc  176 Jan 30 04:51 .bashrc.backup
drwxr-xr-x.  3 opc opc   52 Jan 30 04:50 bin
drwxr-xr-x.  4 opc opc   29 Jan 30 04:50 .cache
drwxr-xr-x.  3 opc opc   18 Jan 30 04:47 .config
-rw-r--r--.  1 opc opc  100 Apr 30  2014 .cshrc
drwxr-xr-x.  3 opc opc   24 Jan 30 04:50 lib
drwx------.  2 opc opc   73 Jan 30 05:46 .oci
drwxr-----.  3 opc opc   19 Jan 30 04:49 .pki
drwx------.  2 opc opc   29 Jan 30 04:42 .ssh
-rw-r--r--.  1 opc opc  129 Apr 30  2014 .tcshrc
### Installでbin、lib、.ociディレクトリ等が作成されている

```



## 2. Instance Principalの構成
構成は以下のマニュアルに記載。
[Calling Services from an Instance](https://docs.cloud.oracle.com/iaas/Content/Identity/Tasks/callingservicesfrominstances.htm)


### 2-1. Dynamic Groupsの作成
まずは、Dynamic Groupsを作成する。
`Identity > Dynamic Groups`と遷移し、`Create Dynamic Group`を押す。

【Create Dynamic Groupの画面】
<img width="476" alt="001.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/278065/c8539d43-a658-bdcd-05e0-b99ab52c634a.png">
`NAME`,`DESCRIPTION`を入力して`Launch Rule Builder`を押す

【Create Matching Ruleの画面】
<img width="474" alt="002.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/278065/03cb421f-ca6a-69d7-88de-6b1e5382916a.png">
`ATTRIBUTE`に`Match instances in Compartment ID`を選択してComputeインスタンスが所属するコンパートメントのOCIDを入力し`Add Rule`を押す。

そうするとRULEに値が入力されるので、`Create Dynamic Group`を押す



### 2-2. Policyの作成
`Identity > Policies`と遷移し、`Create Policy`を押す。

【Create Policyの画面】
<img width="475" alt="003.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/278065/eec7cbfb-6e5c-24f9-e14c-0614030864c9.png">
`NAME`、`DESCRIPTION`を入力、`KEEP POLICY CURRENT`を選択し、`STATEMENT`に以下の記載をする。

` Allow dynamic-group <作成したDynamic Group名> to manage all-resources in compartment <Instanceに使用させたいコンパートメント名> `  

上記の内容は、実際にInstance Principalで有効にさせたい項目によって変更をする必要がある。Policyの参考などについては以下を参照。
[Common Policies](https://docs.cloud.oracle.com/iaas/Content/Identity/Concepts/commonpolicies.htm)


実はここまでで、最低限の構成は完了している。


## 3. 最終設定と確認

### 3-1. 最終設定
CLIは現在、鍵を使用する前提で構成されているため、その箇所を削除する。（念の為）

```
[opc@hostname ~]$ vi /home/opc/.oci/config
### 以下の部分をコメントアウト ###
#user=XXX
#fingerprint=XXX
#key_file=XXX
# 他は特に変更しない
```

### 3-2. 確認

コマンドで確認をする。（マニュアルのコマンドを実行することにする）
確認方法（実行方法）は以下の2パターンとなる。

- --auth instance_principal のオプションを付与する  
or
- OCI_CLI_AUTH=instance_principal を環境変数に入れてから実行する


```
[opc@hostname ~]$ oci os ns get --auth instance_principal
 {
   "data": "XXX"
 }
# 成功

[opc@hostname ~]$ export OCI_CLI_AUTH=instance_principal
[opc@hostname ~]$ oci os ns get
 {
   "data": "XXX"
 }
# こちらも成功
 ```

これで、鍵がなくてもCLIが実行可能になった。