はじめに
どうも。
仮想マシンを実行していなかったので自動アップデートの対象外だった鶴見です。
年末年始にかけてSpectreやMeltdownなどで中々の騒ぎになってましたね。
Azureも1/9までは手動アップデート期間だったのを前倒して、1/4にアップデートを強行するに至っていました。
参考リンク↓
https://blogs.technet.microsoft.com/jpaztech/2018/01/04/securing-azure-customers-from-cpu-vulnerability/
ただ、今回の記事は上記とは全く関係ありません。
Azureリソースのログ管理を色々と探っている際に、少しだけ引っかかった内容を記載していきます。
というわけでAzure FunctionsのログをBLOBにアーカイブする方法を記載します!
そもそもAzure Functionsのログって…
Azure FunctionsはAzureが提供するサーバーレスアーキテクチャで、ユーザーが定義した関数を実行するサービスです。
実行の際のトリガーやバインディング(データの入力や出力)の部分はあらかじめ作りこまれており、その部分をユーザーがほとんど介入しなくていいようなってます。
このAzure FunctionsはベースはApp Serviceと近いものとなっており、課金もApp Service Planか従量課金を選べるようになっています。
そんなAzure Functionsのログですが、Windows版であればWeb Appと同様に診断ログを構成することが出来ます。
ですのでWebサーバーログとアプリケーションログはストレージにアーカイブすることが可能です。
Function>プラットフォーム機能>診断ログから設定が可能です。
しかし、最近発表されたLinux版のAzure Functionsの場合、そうは問屋が卸しません。
(まぁ、プレビュー版なので仕方がないですが…)
Azure Functions(Linux)のログ
ではLinux版の場合どうやってログを取得したりアーカイブすればいいのか。
Kuduを使います。
他のApp Serviceを含め、Functionsのログファイルはファイルシステム上の/home/LogFilesに出力されます。
Kuduにはログファイルをダンプする機能があります。
またAPIにも対応しているために、
「https://< Functions名 >.scm.azurewebsites.net/api/dump」
を叩くことによってzipファイルをダウンロードすることができます。
ただ一点気を付けなければならないのは、Kuduへの認証情報を入れ込む必要があります。
Kuduの認証情報はAzureで設定するデプロイ資格情報になります。
(ユーザー名はドメイン名を抜いたもの)
実際に実装してみた
個人的に親しみのあるPowershellを使用して実装してみました。
以下がそのスクリプトになります。
$Filename = "./"+(Get-Date).ToString('yyyy-MM-dd')+"_log.zip"
$blobname = (Get-Date).ToString('yyyy-MM-dd')+"_log.zip"
$username = "<デプロイ資格情報のユーザー名>"
$password = "<デプロイ資格情報のパスワード>"
# Note that the $username here should look like `SomeUserName`, and **not** `SomeSite\SomeUserName`
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username, $password)))
$userAgent = "powershell/1.0"
$apiUrl = "https://<Functions名>.scm.azurewebsites.net/api/dump"
Invoke-RestMethod -Uri $apiUrl -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -UserAgent $userAgent -Method GET -OutFile $FileName -Debug
$saname = "<ストレージアカウント名>"
$sakey = "<ストレージアカウントキー>"
$ctx = New-AzureStorageContext -StorageAccountName $saname -StorageAccountKey $sakey
$ContainerName = "test"
$localfile = $localfilepath + $blobname
Set-AzureStorageBlobContent -File $FileName -Container $ContainerName -Blob $blobname -Context $ctx
上記の方法の問題点が一つだけあるのは、LogFilesのファイルをそのまま丸ごとZipにしてBLOBに送り込むために、更新分だけを綺麗に送ることが出来ない点です。
ただ、アーカイブ用途であるならばその状態でも問題はないかと思います。
(ストレージ料金が少しだけかさみますが…)
終わりに
今回はFunctionsとして取り上げておりますが、Web App on Linuxにも同様のことが言えるので、そちらにも使えますね。
あくまでもプレビュー段階のものに対する施策なので実際にGAされた多岐には綺麗にその機能が付いている可能性はあります。
今までも、機能が無いから実装してみたけどすぐに公式で機能拡張された経験も多々あるので、自分から仕組みを作るのか、仕組みが作られるのを待つのかは悩ましいところですね。
個人的な願望としては、この機能も標準でほしい部分だけをアーカイブできるように実装されてほしいです。
ここまで駄文に付き合ってくださってありがとうございます。
ではでは。
参考リンク
https://docs.microsoft.com/ja-jp/azure/azure-functions
https://github.com/projectkudu/kudu/wiki