Facebook Twitter
お問い合わせ
TOPICS
更新情報
ホーム > ブログ > Oracle Cloud > 【Oracle Cloud】OCIコンソール上からコマンドを実行できるRunCommandを使ってみる

【Oracle Cloud】OCIコンソール上からコマンドを実行できるRunCommandを使ってみる

ブログ
Oracle Cloud
2021.10.18

最近ブログ用の検証していると、Ashburnで障害が発生するk.sasakiです。

今日は前々から気になっていた、OCIコンソール上からインスタンスにログインせずにスクリプトを実行できる、”RunCommand”機能を使ってみました。

RunCommandとは

ドキュメントは1ページだけで、それほどボリュームのある機能ではないため、冒頭を以下に引用します。

コマンド実行機能を使用してインスタンス内のスクリプトを実行することで、コンピュート・インスタンスをリモートで構成、管理およびトラブルシューティングできます。
たとえば、コマンド実行機能は、セカンダリ仮想ネットワーク・インタフェース・カード(VNIC)の構成、アイデンティティ・プロバイダへのインスタンスの結合、SSH接続のトラブルシューティング、クロスリージョン・ディザスタ・リカバリ・シナリオへの対応などのタスクの自動化に役立ちます。
インスタンスにSSHアクセス権がない場合やインバウンド・ポートが開いていない場合でも、インスタンスでコマンドを実行できます。
コマンド実行機能は、Oracle Cloud Agentソフトウェアによって管理されるコンピュート・インスタンスのコマンド実行・プラグインを使用します。
引用元:インスタンスでのコマンドの実行

ドキュメントを読み進めて以下のような仕様が確認できます。タスクの自動化にも言及されていますが、本機能単体ではタスクの管理機能まではないようです。

  • OSにログインすることなく、Linux、Windowsでスクリプトが実行できる
  • OS上で許可すればsudoが必要なスクリプトも実行できる
  • RunCommandの実行履歴が1ヶ月残り、削除できない
  • オブジェクトストレージと連携してスクリプト取得や、出力の保存が可能
  • 登録したRunCommandの再実行する機能やスケジュールして実行する機能はない

スクリプトを作成して結果を取得する

古いインスタンスでない限りはRunCommandプラグインがデフォルトで有効なので、下記のユーザ向けのポリシーと対象インスタンスを含む動的グループ向けのポリシーを設定すれば使えるようになります。

Allow group RunCommandUsers to manage instance-agent-command-family in compartment ABC
any { instance.id = 'ocid1.instance.oc1.phx.', 'ocid1.instance.oc1.phx.' }
Allow dynamic-group RunCommandDynamicGroup to use instance-agent-command-execution-family in compartment ABC where request.instance.id=target.instance.id
Allow dynamic-group RunCommandDynamicGroup to read objects in compartment ABC where all {target.bucket.name = ''}
Allow dynamic-group RunCommandDynamicGroup to manage objects in compartment ABC where all {target.bucket.name = ''}

ドキュメントによるとポリシーを作成してから実際にコマンドが実行できるまで30分ほどかかってしまうとのことです。手動でOS側でエージェントを再起動すれば反映されるとのことなので、今回は以下のコマンドでエージェントを再起動して反映させました。

sudo systemctl restart oracle-cloud-agent

ポリシーが反映されたはずなので、コマンドを作成していきます。
インスタンスの詳細画面から"実行コマンド"メニューを開きます。

RunCommand履歴画面
※画像は検証後に取得したので、履歴が表示されています

コマンド作成を選択し、スクリプトを貼り付け、出力タイプはテキストとして出力を選択します。スクリプトは "uname -n && date"とします。

RunCommand作成画面

数分おきに登録したコマンドを読み取ってOS上でエージェントがコマンド実行するため、暫し待つとコマンドが完了となり、詳細画面より出力を確認できるようになります。

RunCommand詳細画面 成功

ちなみにコマンドのtypoで失敗した場合のOCIコンソールの出力は以下のようになります。

RunCommand詳細画面 失敗

以上でコマンドの作成から出力の確認までが完了です。

続いてOCI監査ログでの表示を確認してみます。

OCI監査ログでは作成したコマンド名がリソースとして表示されるようです。ちなみに監査ログのJOSN内にはコマンドの内容や出力は記録されていませんでした

監査ログ画面

OS側では以下のファイルがRunCommandのログになりますのでこちらも確認してみます。

/var/log/oracle-cloud-agent/plugins/runcommand/runcommand.log

コマンドが正常に実行された場合、コマンド自体の記録はありませんが、出力は記録されていました。

2021/10/11 15:20:59.579386 cmdstatus.go:211: command state : SUCCEEDED , lifecycle: SUCCEEDED
2021/10/11 15:20:59.579483 cmdstatus.go:63: updating execution result: { InstanceAgentCommandId=ocid1.instanceagentcommand.oc1.iad.amaaaaaa7swuj4yako3rm5yabhhqvfonhgjkzap5mgz7arzjm2u6nbqztvyq UpdateInstanceAgentCommandExecutionDetails={ LifecycleState=SUCCEEDED OutputContent={ ExitCode=0 Message={"execExitCode":0,"runtime":"4ms"} Text=oca-vm 2021年 10月 11日 月曜日 15:20:59 JST TextSha256= } InstanceId=ocid1.instance.oc1.iad.anuwcljt7swuj4yc656sic35md5scxaoxhhgu6cn6tcgvdpzo7mbyqegvcla } OpcRequestId= IfMatch= OpcRetryToken= RequestMetadata={} }

オブジェクトストレージのスクリプトを読み込み、オブジェクトストレージへ出力を保存する

続いてオブジェクトストレージからスクリプトを読み込んでオブジェクトストレージに出力してみます。

実行するスクリプトを作成し、オブジェクトストレージへアップロードします。スクリプトは "uname -n && date"とします。

オブジェクト一覧画面

RunCommand作成時にスクリプトと出力タイプでオブジェクトストレージバケットを選択します。

RunCommand作成画面

暫し待つとコマンドの実行が完了しますので、詳細画面を見てみると、今回はスクリプトも出力も詳細画面には表示されず、オブジェクトストレージへのリンクになっています。

RunCommand詳細画面

リンクをクリックしてオブジェクトストレージを表示します。

オブジェクト一覧画面

出力ファイルをダウンロードして正常に出力を確認できました。

出力テキスト

終わりに

実際に使ってみましたが、設定項目が少ないし、シンプルで使いやすいなという印象です。オブジェクトストレージから直接インプット、アウトプットをやりとりできるのも気がきいてます。

ただし、自由にスクリプトを実行できてしまう点から、実行履歴については”誰が”、”いつ”、”どのスクリプトを実行した”という点が残って欲しいのですが、記録されません。"誰が"についてはAuditログ、"どのスクリプトを実行した"かについてはRunComnmand履歴やオブジェクトストレージで見なければいけないのでその点だけ注意が必要です。

以上、最後までご覧いただきありがとうございました。


この記事が気に入ったら
「いいね!」

この記事を書いた人


関連コンテンツ

CONTACT お問い合わせ

Cloudiiのサービスやプロダクトについて
興味をお持ちの方は、
お気軽にお問い合わせください。