最近ブログ用の検証していると、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
ポリシーが反映されたはずなので、コマンドを作成していきます。
インスタンスの詳細画面から"実行コマンド"メニューを開きます。
コマンド作成を選択し、スクリプトを貼り付け、出力タイプはテキストとして出力を選択します。スクリプトは "uname -n && date"とします。
数分おきに登録したコマンドを読み取ってOS上でエージェントがコマンド実行するため、暫し待つとコマンドが完了となり、詳細画面より出力を確認できるようになります。
ちなみにコマンドのtypoで失敗した場合のOCIコンソールの出力は以下のようになります。
以上でコマンドの作成から出力の確認までが完了です。
続いて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作成時にスクリプトと出力タイプでオブジェクトストレージバケットを選択します。
暫し待つとコマンドの実行が完了しますので、詳細画面を見てみると、今回はスクリプトも出力も詳細画面には表示されず、オブジェクトストレージへのリンクになっています。
リンクをクリックしてオブジェクトストレージを表示します。
出力ファイルをダウンロードして正常に出力を確認できました。
終わりに
実際に使ってみましたが、設定項目が少ないし、シンプルで使いやすいなという印象です。オブジェクトストレージから直接インプット、アウトプットをやりとりできるのも気がきいてます。
ただし、自由にスクリプトを実行できてしまう点から、実行履歴については”誰が”、”いつ”、”どのスクリプトを実行した”という点が残って欲しいのですが、記録されません。"誰が"についてはAuditログ、"どのスクリプトを実行した"かについてはRunComnmand履歴やオブジェクトストレージで見なければいけないのでその点だけ注意が必要です。
以上、最後までご覧いただきありがとうございました。