みち草

Azure中心にまとめる技術情報ブログ

Azure Cloud Shell でタイムスタンプ付きのログ ファイルを取得する

はじめに

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 などもありますが本題ではないので細かくはこちらを参照

learn.microsoft.com

本題 : ログ出力がしたい

このように、Cloud Shell はブラウザの下部でコマンドを実行できます。

コマンドで操作する場合、いつ、どんなコマンドを実行してどんな結果が返って来たか、構築作業などでエビデンスとしてログ ファイルを残すのはよくあると思いますが、Cloud Shell 自体には、操作ログをファイル出力する機能は備わっていません。

ではどうするかというと、bash や PowerShell には標準で、セッションの内容をログ出力するコマンドが備わっているので、それを使えば OK です。

bash の場合

bash の場合は script コマンドにてログ出力が可能なため、それを以下のように実行します。

script -fq >(awk '{print strftime("%F %T ") $0}{fflush() }'>> PATH)

PATH はログの出力先です。

これはこちらの記事で Linux、UNINX 用に紹介されていたコマンドです。

orebibou.com

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 はわからなかったので、まとめてくれている方がいて助かりました。