AzureのグローバルIPアドレスレンジ取得スクリプト

Azureで使うGlobal IP アドレスのレンジは固定されていない。そのため、Azure向けに静的にルーティングを行っている場合は、レンジが変更される度にルーティング設定を追加する必要がある。下記サイトからIPレンジを取得できるが、自動で検知・対処するためのスクリプトの作成手順

Download Microsoft Azure Datacenter IP Ranges from Official Microsoft Download Center

管理者としてPowershellを起動し、PowerShell Gallery からモジュールを追加

> Install-Module -Name AzurePublicIPAddresses

*こちらのモジュールを利用してIPレンジを取得する

www.powershellgallery.com

インストールされたモジュールを確認

> Get-InstalledModule

Version Name Repository Description
------- ---- ---------- -----------
0.8.3 AzurePublicIPAddresses PSGallery Gets the IP ranges associated with Azure regions...

IPレンジ情報をファイルに書き出し

> Get-MicrosoftAzureDatacenterIPRangeFile -Path C:\test\AzurePurlicIp.xml

*-Pathオプションで出力先ファイルを指定する

スクリプトサンプル

更新状況を確認して、Gメールで送信

<#
NAME
CheckAzureDatacenterIpRanges

SYNOPSIS
Check for the change of Azure Datacenter IP Ranges
and send mail if they have been changed.

EXAMPLE
./CheckAzureDatacenterIpRanges.ps1
#>

#-------------------------------------------------------------
# Functions
#-------------------------------------------------------------

function Send-Mail-Gmail($ACCOUNT_NAME, $PASSWORD, $MAILTO, $BODY, $ATTACH_FILE)
{
#Connect to Gmail
$SMTP_SERVER = "smtp.gmail.com"
$SMTP_CLIENT = New-Object Net.Mail.SmtpClient($SMTP_SERVER, 587)
$SMTP_CLIENT.EnableSsl = $TRUE
$SMTP_CLIENT.Credentials = New-Object System.Net.NetworkCredential("$ACCOUNT_NAME","$PASSWORD");

#Create Message
$MAIL_FROM = $ACCOUNT_NAME
$MESSAGE = New-Object Net.Mail.MailMessage($MAIL_FROM, $MAILTO, $SUBJECT, $BODY)

#Attach File
if( !($ATTACH_FILE -eq $NULL)){
$ATTACH_FILE = @(Get-ChildItem $ATTACH_FILE)
$ATTACH_FILE = New-Object Net.Mail.ATTACHMENT($ATTACH_FILE)
$MESSAGE.ATTACHMENTs.Add($ATTACH_FILE)
}

#Send Message
$SMTP_CLIENT.Send($MESSAGE)
}

#-------------------------------------------------------------
# Variables
#-------------------------------------------------------------
$EXECUTION_DATE = (Get-Date -Format "yyyy-MMdd-HHmmss")
$SCRIPT_DIR = $PSScriptRoot
$OUTPUT_DIR = "$SCRIPT_DIR\IpRanges"
$OUTPUT_FILE = "$OUTPUT_DIR\Azure-PublicIPs-$EXECUTION_DATE.xml"
$OUTPUT_FILE_ZIP = "$OUTPUT_FILE.zip"
$LATEST_FILE = "$OUTPUT_DIR\Azure-PublicIPs-Latest.xml"
$NEXTLATEST_FILE = "$OUTPUT_DIR\Azure-PublicIPs-NextLatest.xml"
$ACCOUNT_NAME = "XXX@gmail.com"
$PASSWORD = "XXX"
$MAILTO = "XXX"
$BODY = @()
$URL="https://www.microsoft.com/en-us/download/details.aspx?id=41653"

#-------------------------------------------------------------
# BODY
#-------------------------------------------------------------

try{
# Check HTTP Response
$RESPONSE_CODE = (Invoke-WebRequest -Uri $URL -Method Post).StatusCode

# Create Output Directory
if (!(Test-Path $OUTPUT_DIR)){
New-Item $OUTPUT_DIR -ItemType Directory
}

# Get Latest Public IPs
Get-MicrosoftAzureDatacenterIPRangeFile -Path $OUTPUT_FILE

# Renew Latest Public IPs File
if (Test-Path $NEXTLATEST_FILE){
Move-Item $LATEST_FILE $NEXTLATEST_FILE -Force
Copy-Item $OUTPUT_FILE $LATEST_FILE
}else{
Copy-Item $OUTPUT_FILE $NEXTLATEST_FILE
Copy-Item $OUTPUT_FILE $LATEST_FILE
}

# Check for the change of IPaddress
$COMPARISON = Compare-Object -ReferenceObject (Get-Content $LATEST_FILE) -DifferenceObject (Get-Content $NEXTLATEST_FILE) -CaseSensitive -PassThru

$BODY += "`n定期チェックが完了しました。`n"
$BODY += "`n■チェック日時`n$EXECUTION_DATE`n"
$BODY += "`n■HTTP Status Code($URL)`n$RESPONSE_CODE`n"

if ( $COMPARISON -eq $NULL )
{
$SUBJECT = "[Azure]Check Azure Public IPs ($EXECUTION_DATE) OK"
$BODY += "`n■チェック結果`nAzure Datacenter IP Ranges に変更はありませんでした。`n"
}else{
$COMPARISON = $COMPARISON -join "`r`n"
$SUBJECT = "[Azure]Check Azure Public IPs ($EXECUTION_DATE) NG"
$BODY += "`n■チェック結果`nAzure Datacenter IP Ranges の下記IPに変更がありました。`n"
$BODY += "`n$COMPARISON`n"
}

# Compress Output File
Compress-Archive -Path $OUTPUT_FILE -DestinationPath $OUTPUT_FILE_ZIP
Remove-Item $OUTPUT_FILE

# Send Mail
Send-Mail-Gmail $ACCOUNT_NAME $PASSWORD $MAILTO $BODY $OUTPUT_FILE_ZIP

} catch {

# SendMail
$SUBJECT = "[Azure]Check Azure Public IPs ($EXECUTION_DATE) NG"
$BODY += "`n定期チェックの実行に失敗しました。`n"
$BODY += "`n■チェック日時`n$EXECUTION_DATE`n"
$BODY += "`n■HTTP Status Code($URL)`n$RESPONSE_CODE`n"
$BODY += "`n■チェック結果`チェックに失敗しました。"
Send-Mail-Gmail $ACCOUNT_NAME $PASSWORD $MAILTO $BODY
}

この記事が気に入ったらサポートをしてみませんか?