はじめに
Azure Coud Shell を利用し、操作記録をログ ファイルに残しておきたい場合、どうするのがいいか簡単ですがまとめました。
"bash の場合" と "PowerShell の場合" だけ見てもらえれば OK です。
目次
Azure Cloud Shell
Azure ポータルで、ブラウザ上で Bash または PowerShell を用いて Azure リソースを操作することができます。
Azure ポータル右上のこれです
Azure で利用できるコマンドライン ツールが予めインストールされており、以下のツールや言語などなどを操作端末へインストールすることなく利用できます。(初回起動時はプロファイル用ストレージ アカウントの設定が必要)
ツール
- Azure CLI
- Azure PowerShell
- AzCopy
- Azure Functions CLI
- Service Fabric CLI
- Batch Shipyard
- blobxfer
言語
- .NET Core
- Go
- Java
- Node.js
- PowerShell
- Python
- Ruby
Git や Terraform、kubectl などもありますが本題ではないので細かくはこちらを参照
本題 : ログ出力がしたい
このように、Cloud Shell はブラウザの下部でコマンドを実行できます。
コマンドで操作する場合、いつ、どんなコマンドを実行してどんな結果が返って来たか、構築作業などでエビデンスとしてログ ファイルを残すのはよくあると思いますが、Cloud Shell 自体には、操作ログをファイル出力する機能は備わっていません。
ではどうするかというと、bash や PowerShell には標準で、セッションの内容をログ出力するコマンドが備わっているので、それを使えば OK です。
bash の場合
bash の場合は script コマンドにてログ出力が可能なため、それを以下のように実行します。
script -fq >(awk '{print strftime("%F %T ") $0}{fflush() }'>> PATH)
PATH はログの出力先です。
これはこちらの記事で Linux、UNINX 用に紹介されていたコマンドです。
script コマンド単体だとログ開始とログ終了のタイムスタンプしか出力されず、コマンド実行毎のタイムスタンプが出力されません。
それを解消するため、コマンド実行毎にタイムスタンプをログに出力、その後にコマンドとその実行結果を出力、としているようです。大変参考になりました。
ログの出力を終了するときは exit です。
実際のログはこんな感じです。
2023-06-21 02:48:47 Script started on 2023-06-21 02:48:47+00:00 [TERM="xterm-256color" TTY="/dev/pts/4" COLUMNS="231" LINES="31"] 2023-06-21 02:48:52 [?2004hsh-5.1$ az vm list -o table 2023-06-21 02:48:53 [?2004l Name ResourceGroup Location Zones 2023-06-21 02:48:53 --------- ----------------- ---------- ------- 2023-06-21 02:48:53 DC DC japaneast 2023-06-21 02:48:53 Member01 DC japaneast 2023-06-21 02:48:53 Demo-Win1 DEMO-RG japaneast 2023-06-21 02:50:01 sh-5.1$ cat ~/test/a.txt 2023-06-21 02:50:05 [?2004l [?2004hsh-5.1$ exit 2023-06-21 02:50:05 [?2004l exit 2023-06-21 02:50:05 2023-06-21 02:50:05 Script done on 2023-06-21 02:50:05+00:00 [COMMAND_EXIT_CODE="0"]
PowerShell の場合
PowerShell の場合は Start-Transcript コマンドにてログ出力が可能なため、それを以下のように実行します。
Start-Transcript -Path PATH -NoClobber -IncludeInvocationHeader
PATH はログの出力先です。
Start-Transcript コマンドも、デフォルトではログ開始とログ終了のタイムスタンプしか出力されず、コマンド実行毎のタイムスタンプが出力されませんが、オプションとして -IncludeInvocationHeader があるため、それをつけるだけで実行毎のタイムスタンプも出力されます。
ログの出力を終了するときは Stop-Transcript です。
実際のログはこんな感じです。
********************** PowerShell transcript start Start time: 20230621025602 Username: cc-xxxxxxxx-xxxxxxxxxx-kc9nb\kazuki RunAs User: cc-xxxxxxxx-xxxxxxxxxx-kc9nb\kazuki Configuration Name: Machine: cc-xxxxxxxx-xxxxxxxxxx-kc9nb (Unix 5.4.0.1109) Host Application: /opt/microsoft/powershell/7/pwsh.dll -NoLogo Process ID: 126 PSVersion: 7.3.4 PSEdition: Core GitCommitId: 7.3.4 OS: Linux 5.4.0-1109-azure #115~18.04.1-Ubuntu SMP Mon May 22 20:06:37 UTC 2023 Platform: Unix PSCompatibleVersions: 1.0, 2.0, 3.0, 4.0, 5.0, 5.1.10032.0, 6.0.0, 6.1.0, 6.2.0, 7.0.0, 7.1.0, 7.2.0, 7.3.4 PSRemotingProtocolVersion: 2.3 SerializationVersion: 1.1.0.1 WSManStackVersion: 3.0 ********************** Transcript started, output file is /home/kazuki/psdemo.txt ********************** Command start time: 20230621025609 ********************** PS /home/kazuki> Get-AzVM ResourceGroupName Name Location VmSize OsType NIC ProvisioningState Zone ----------------- ---- -------- ------ ------ --- ----------------- ---- DC DC japaneast Standard_B2ms Windows dc413 Succeeded DC Member01 japaneast Standard_B2ms Windows member01567 Succeeded DEMO-RG Demo-Win1 japaneast Standard_B2ms Windows demo-win11 Succeeded ********************** Command start time: 20230621025612 ********************** PS /home/kazuki> ls bashdemo.txt basiclb.ps1 clouddrive Microsoft psdemo.txt ********************** Command start time: 20230621025650 ********************** PS /home/kazuki> Stop-Transcript ********************** PowerShell transcript end End time: 20230621025650 **********************
注意点
Azure Cloud Shell の仕様上、出力されているタイムスタンプは UTC のためそこは注意です。
終わりに
前述のコマンドを用いて Cloud Shell の操作ログをファイル出力し、作業後にファイルをダウンロードすることでエビデンスにしましょう。
PowerShell はオプションがありよかったのですが、bash はわからなかったので、まとめてくれている方がいて助かりました。