AWSをメインで利用しているエンジニアがAzure環境の構築をPowerShellで進める連載。
リソースグループの作成から仮想マシンを起動するまでを連載していく予定です。
第7回は、これから作成する仮想マシンにアタッチする、AWSで言うところのElastic IPに類似するサービス「パブリックIPアドレス」を作成します。
番外編
前提:事前に「仮想ネットワーク」が作成されていること。
# リソースグループ名を設定
$private:resourceGroupName = "rg001"
# ロケーションを設定
$private:location = "japaneast"
# タグを設定
$tags = @{"環境名"="ITC109"}
# 仮想マシン名を設定
$private:vmname = $private:resourceGroupName + "vm01"
##################################################
Write-Host "■■【パブリックIPアドレス】の作成処理 ■■"
##################################################
# パブリックIPアドレス作成
$private:pipname = $private:vmname + "pip"
$private:pips = Get-AzPublicIpAddress -ResourceGroupName $private:resourceGroupName -Name $private:pipname -ErrorAction Ignore
if ($private:pips.Count -eq 0) {
try{
# パブリックIPアドレス作成
Write-Host ("${private:resourceGroupName} の「パブリックIPアドレス」に ${private:pipname} を作成中...")
$private:pip = New-AzPublicIpAddress -Location $private:location -ResourceGroupName $private:resourceGroupName -Name $private:pipname -AllocationMethod Static -Tag $tags -ErrorAction Stop -WarningAction Ignore
Write-Host ("${private:resoucreGroupName} の「パブリックIPアドレス」に ${private:pipname} を作成しました。")
Write-Host ""
}catch{
Write-Host "パブリックIPアドレス作成エラー" -ForegroundColor Red
Write-Error -Message $_.Exception
}
# ネットワークインターフェース紐づけ
try{
# NICにPIPを紐づける
$private:nic = Get-AzNetworkInterface -ResourceGroupName $private:resourceGroupName -Name $private:nicname
$private:nic.IpConfigurations[0].PublicIpAddress = $private:pip
$null = Set-AzNetworkInterface -NetworkInterface $private:nic -ErrorAction Stop
Write-Host ("$private:resourceGroupName の「パブリックIPアドレス(${private:pipname}) に「ネットワークインターフェイス(${private:nicname})」を紐づけました。")
Write-Host ""
}catch{
Write-Host "ネットワークインターフェース紐づけエラー" -ForegroundColor Red
Write-Error -Message $_.Exception
}
# DNSラベル名設定
try{
# DNS 名ラベル設定
$private:domainlabel = $private:vmname.ToLower() #小文字に変換
$private:dnssetting = New-object -TypeName "Microsoft.Azure.Commands.Network.Models.PSPublicIpAddressDnsSettings"
$private:dnssetting.DomainNameLabel = $private:domainlabel
$private:pip.DnsSettings = $private:dnssetting
$null = Set-AzPublicIpAddress -PublicIpAddress $private:pip -ErrorAction Stop
$vmnameDns = $private:vmname
Write-Host "$private:resourceGroupName の「パブリックIPアドレス("$private:pipname")」に「DNS("$private:domainlabel"."$private:location".cloudapp.azure.com)」を設定しました。"
Write-Host ""
}catch{
Write-Host "DNSラベル名設定エラー" -ForegroundColor Red
Write-Error -Message $_.Exception
}
} else {
Write-Host ("$private:resourceGroupName の「パブリックIPアドレス」には、既に ${private:pipname} が存在するため作成をスキップしました。") -ForegroundColor Yellow
Write-Host ""
}
Get-AzPublicIpAddress
で既に同名のリソースが存在しないか確認。
$private:pips = Get-AzPublicIpAddress -ResourceGroupName $private:resourceGroupName -Name $private:pipname -ErrorAction Ignore
if ($private:pips.Count -eq 0) {
※リソースが存在しない場合は、ここに作成する処理を記述。
} else {
※リソースが存在する場合は、ここに作成しない処理を記述。
}
New-AzPublicIpAddress
でパブリックIPアドレスを作成。
New-AzPublicIpAddress -Location $private:location -ResourceGroupName $private:resourceGroupName -Name $private:pipname -AllocationMethod Static -Tag $tags
-AllocationMethod
オプション「IP アドレスの割り当て」を以下から指定。
-AllocationMethod Static
ネットインターフェースにパブリックIPアドレスを設定。
$private:nic = Get-AzNetworkInterface -ResourceGroupName $private:resourceGroupName -Name $private:nicname
$private:nic.IpConfigurations[0].PublicIpAddress = $private:pip
Set-AzNetworkInterface -NetworkInterface $private:nic
ドメイン名には大文字が指定できないので、エラーを回避するために小文字(ToLower
)に変換。
$private:domainlabel = $private:vmname.ToLower() #小文字に変換
パブリックIPアドレスにDNS名を設定。
$private:dnssetting.DomainNameLabel = $private:domainlabel
$private:pip.DnsSettings = $private:dnssetting
Set-AzPublicIpAddress -PublicIpAddress $private:pip
try ~ catch
で例外が発生したときにエラーメッセージを表示。
try {
※リソースの作成の作成。
} catch {
※リソースの作成の作成に失敗。
Write-Error -Message $_.Exception
}
補足
ドメイン名では「大文字」が利用できないので、命名規則として大文字を含む場合は小文字へ変換します。
The domain name label vmRG001sv01 is invalid. It must conform to the following regular expression: ^[a-z][a-z0-9-]{1,61}[a-z0-9]$.
ドメイン名ラベル vmRG001sv01 が無効です。 次の正規表現に準拠する必要があります: ^[a-z][a-z0-9-]{1,61}[a-z0-9]$。
Domain Labelが短すぎるとすでに使用されている場合がありますので、ネットワーク規模を大きくする場合は命名規則に注意する必要があります。
DNS record vm01.japaneast.cloudapp.azure.com is already used by another public IP.
DNS レコード vm01.japaneast.cloudapp.azure.com は、別のパブリック IP によって既に使用されています。