[Oracle Cloud] Oracle Cloud Agentコマンドを使って、コンソールからOSコマンドを実行する

# はじめに
[WebコンソールからComputeインスタンスに任意のコマンドを実行する機能](https://docs.cloud.oracle.com/en-us/iaas/releasenotes/changes/ef5fb80a-14a8-4035-ad1e-dbd1a7148e4c/)が実装されました。面白そうなので、試したみた。

コンソール上の機能名称は、「Oracle Cloud Agentコマンド」のようです。Computeのインスタンス詳細画面から遷移できます。Oracle Cloud Agentプロセスが、コマンド実行のリクエストを受け取って実行し、結果をコンソール(または任意のObject Storage)に表示する機能です。

当初、静的に登録したコマンドを、任意のタイミングで実行する機能だと思ったのですが、実行の都度コマンドを作成する必要があり、イメージしていた機能とちょっと違いまいした。
(コマンドを静的に登録して、ポリシーで実行権限だけをユーザに与えられるようになるといいな。。)

# 前提条件
[マニュアル](https://docs.cloud.oracle.com/en-us/iaas/Content/Compute/Tasks/runningcommands.htm)によると、いろいろと制約があります。特に、以下の制約に注意。

* コマンド結果の出力サイズの上限は、1KB。それを超える場合は、アウトプットをObject Storageに格納するように設定する

この機能のリリース時点で、利用可能なリージョンは2つだけ。東京/大阪リージョンはまだ使えない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/fc23b9a6-4616-d972-9f49-7e68412bb665.png)

# やってみる
## Computeインスタンスの作成
2020年10月現在、この機能が利用できるPhoenixリージョンにComputeインスタンスを作成します

## バケットの作成
コマンド実行結果の出力が1KBを超える場合を考え、格納先のバケットを用意しておきます

## Object Storageへの通信経路
ComputeインスタンスをPrivateサブネットに作っている場合は、Service GWまたはNAT GWをたてて、Object Storageと通信できるようにします。

## 動的グループの作成
インスタンス・プリンシパルの設定をする必要があるため、動的グループを作成します。マニュアルにあるように、作ったコンピュートインスタンスのOCIDを含めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/089d53fd-0615-8a68-e2cf-d530494d33be.png)

## ポリシーの作成
マニュアルにあるとおりに、動的グループ(インスタンス・プリンシパル)に対して権限を与えてあげます。

Object Storageを併用する場合は、Object Storageへの権限も与えます。実行スクリプトと出力先が異なるバケットの場合は、実行スクリプト格納バケットにread、出力先バケットにmanage権限を与えます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/e5ddd623-add2-c9a1-2e88-8007a0350d50.png)

## AgentのUpdate
Computeインスタンスにログインします。2020年10月より前のイメージを使ってComputeインスタンスを作成した場合、agentのバージョンが古いので、updateしてあげる必要があります。2020年10月現在で利用可能な、Oracle Linuxのイメージではupdateする必要がありました。

```CONSOLE
# rpm -q oracle-cloud-agent
oracle-cloud-agent-1.3.2-2718.el7.x86_64

# yum update oracle-cloud-agent
… 省略

# rpm -q oracle-cloud-agent
oracle-cloud-agent-1.5.1-3277.el7.x86_64

```

## コマンド登録
Computeの詳細画面から、Oracle Clouda Agentコマンドのリンクに遷移し、コマンド作成します。とりあえず、ps -efコマンドで試してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/8e7d92b0-425b-fbd3-e7ff-a83bd99c0115.png)

「コマンド作成」ボタンを押下すると、Oracle Cloud Agentにリクエストが飛んでいきます。結果が返ってくるのが案外遅いので、5分くらいはがんばって待ちます。

実行ステータスが、成功になったのを確認後、「コマンドの詳細の表示」を押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/f715c9f3-efd8-faa6-802f-dde853f20128.png)

出力が見切れてます… (1KBの制限)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/e3c575ec-4c2f-b244-6976-31eabd7a2ac5.png)

なので、今度は出力先をObject Storageにして実行コマンドを作成してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/f41d1c37-9f88-fcb3-e91f-5d1672b07851.png)

実行後、指定したバケットにObjectが出力されいてるので、ダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/5131ccd3-98df-fa6c-72a4-70515b17de1d.png)

画像は張りませんが、こっちの出力は見切れていませんでした。

## root権限が必要なコマンドを実行してみる
Oracle Clouda Agentコマンドは、「ocarun」というOSユーザの権限で実行されるようです。
試しに、実行コマンドにwhoami; ls -ltr /rootと入力して実行してみると以下のような出力になります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/cd7642a0-d61d-a3f1-a5f0-dd644b195fae.png)

rootユーザ権限が必要なコマンドを実行する場合は、(マニュアルにあるとおり)あらかじめ、sudoの設定ファイルに、ocarunユーザに許可するコマンドを書いておいてあげる必要があります。

例えばlsコマンドだけ許可する場合、以下のようなファイルを作成して

```CONSOLE
# vi /etc/sudoers.d/101-oracle-cloud-agent-run-command
ocarun ALL=(ALL) NOPASSWD:/bin/ls

# visudo -cf /etc/sudoers.d/101-oracle-cloud-agent-run-command
/etc/sudoers.d/101-oracle-cloud-agent-run-command: parsed OK

```

Oracle Clouda Agentコマンドから、sudo ls -l /rootが実行できるか確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/655f67e8-4f66-0bec-bfe3-b5d7023ed3fc.png)

できました。