Azure AutomationのRunbook実行は、Azure実行基盤であるサンドボックス環境が使用されます。
今回は、サンドボックス環境のIPを調べたい方や、NSGやFWでガチガチに環境固めていて、必要最低限のIPのみ許可したい方向けに、サンドボックス環境のIP調査方法について説明します。
はじめに
なぜ、サンドボックス環境のIPを調べることになったか、簡単に経緯をお話しします。
あるプロジェクトで、ACR(Azure Container Registry)のリポジトリ登録されているイメージを、Azure Automationを使用して週次でバックアップ用ACRにコピーする、というバックアップ環境の整備を実施していた際に、スクリプトのGetコマンドが動作しないという問題が発生しました。
ACRの診断ログから、Runbookを実行した際に138.91.14.162というIPがACRに対して通信している形跡がありました。このアドレスは、リソースやVMで用いられているものではなかったので、MSに問い合わせてみたところ。。。
本IPは東日本のAzure実行基盤(サンドボックス環境)のWindowsサーバーインスタンスIPとのことでした。どうやら、Runbookを使用する場合、本サンドボックス環境が使用されるようです。
サンドボックス環境のIPアドレスは、定期的に変更する
上記MSに行った質問には、実は続きがあり。。
サンドボックス環境のIPは、東日本公開IPに含まれるものから不定期に変更して決まるとのことでした。
では、「東日本公開IP」を全部許可すればいいのか。。
という訳にもいかないのです!
この公開されているIPアドレス一覧は、定期的にこうしんされているようでした。。
(試しに、2週間前後の差分をチェックすると、2件アドレスレンジが追加されていました。。)
ということで、Automationを実行するサンドボックス環境のIPアドレスを知る必要が発生したという経緯があり、アドレスを取得するスクリプトの開発を行いました。
サンドボックス環境のIPアドレスを取得
今回は、サンドボックス環境のIPアドレスを取得する、PowerShellスクリプトを準備しました。
スクリプト実行時のサンドボックス環境のIPアドレスを取得してきて、現在NSGで許可されているIPアドレスと比較し、IPが不足していたら連絡する、という内容になっています。
try {
$srcAcrId = Get-AutomationVariable -Name "acr_id_from"
Write-Output "以下のACRのネットワーク情報を取得します:" $srcAcrId
$reg = Get-AzContainerRegistry -ResourceId $srcAcrId
$currentallowIp = $reg.NetworkRuleSet.IpRules.IPAddressOrRange
Write-Output "現在許可されているIPアドレスは以下の通りです" $currentallowIp
}
catch {
Write-Output "エラー:現在のACR情報の取得に失敗しました"
$returncode = 1
Write-Output $returncode
Write-Error
}
try {
$latestIp = (Invoke-RestMethod 'https://api.ipify.org?format=json').ip
Write-Output "許可する必要がある最新のIPアドレスは以下の通りです" $latestIp
}
catch {
Write-Output "最新のIP情報の取得に失敗しました。"
$returncode = 1
Write-Output $returncode
Write-Error
}
$dif = $currentallowIp | Select-String -SimpleMatch -Pattern $latestIp -Quiet
if ($dif -eq $true) {
Write-Output "現在許可されているIPアドレスは最新です"
}
else {
Write-Output "サンドボックス環境のIPアドレスに変更があります。各ACRの許可設定から下記IPアドレスを追加してください。"
Write-Output $latestIp
$returncode = 1
Write-Output "終了コード:" $returncode
Write-Error
}
試しに、このスクリプトを1ヶ月実行してみたところ、1日だけ別のIPに変更し、翌日元のIPに戻ることが数回発生することが確認できました。
閉域環境で必要最低限のIPを許可する必要がある方などの参考になれば幸いです。