presents by IT Consulting 109

Azure – PowerShellでパブリックIPアドレスの作成

AWSをメインで利用しているエンジニアがAzure環境の構築をPowerShellで進める連載。
リソースグループの作成から仮想マシンを起動するまでを連載していく予定です。

第7回は、これから作成する仮想マシンにアタッチする、AWSで言うところのElastic IPに類似するサービス「パブリックIPアドレス」を作成します。

番外編

  • 第10回 PowerShellでストレージアカウントの作成
  • 第11回 PowerShellで仮想マシン用VHDイメージのアップロード
  • 第12回 PowerShellで仮想マシンをVHDイメージから作成
  • 第13回 PowerShellでディスクの拡張

手順

前提:事前に「仮想ネットワーク」が作成されていること。

# リソースグループ名を設定
$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 アドレスの割り当て」を以下から指定。

  • Static
  • Dynamic
-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 によって既に使用されています。
この記事を書いた人
名前:TRUE's。 千葉県育ち、神奈川県在住のIT系フリーエンジニア。 IT系のナレッジサイトを不定期で更新中。 フォトグラファー兼エンジニアとして日々勤しんでいる。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です