次の方法で共有


PowerShell を使用して Azure Cloud Services の VIP スワップを管理する (延長サポート)

この記事では、Microsoft Azure Cloud Services (延長サポート) で 2 つの独立したクラウド サービス デプロイを交換する方法について説明します。 Azure Cloud Services (クラシック) とは異なり、拡張サポート バージョンの Azure Resource Manager モデルではデプロイ スロットは使用されません。 Azure Cloud Services (延長サポート) でクラウド サービスの新しいリリースをデプロイする場合、拡張サポート バージョンの既存のクラウド サービスとクラウド サービスを "スワップ可能" にすることができます。 この記事では、PowerShell と REST API を使用してクラウド サービスのバージョンを更新し、仮想 IP アドレス (VIP) をスワップする方法について説明します。

運用環境とステージング環境の関係の図。最初の図は、VIP スワップ前の環境を示しています。2 つ目はスワップ後に表示されます。

前提条件

  • Azure PowerShell

  • 2 つの 静的パブリック IP アドレス: 1 つは運用環境用、もう 1 つはステージング環境用です。 この例の IP アドレスには、それぞれ cses-prodcses-stag という名前が付けられています。

  • テスト環境の 仮想ネットワーク 。 この例では、仮想ネットワークの名前は test001VNet です。

  • Azure Blob Storage アカウント

  • サービス構成ファイルとパッケージ ファイルの URL (サービス共有アクセス署名 (SAS) URI 形式。 これらの URL をまだ作成していない場合は、Azure portal を使用するか、 New-AzStorageBlobSASToken コマンドレットを呼び出して、各 SAS URI (または SAS URI の一部である SAS トークン) を作成できます。 サービス構成ファイルとパッケージ ファイルの URL をそれぞれ $cscfg 変数と $cspkg 変数に割り当てます。 次の PowerShell コード スニペットは、これらの URL の形式を示しています。 URL は、 New-AzCloudService コマンドレットの後続の呼び出しで使用されます。

    $containerUrl = "https://<storage-account-name>.blob.core.windows.net/<container-name>"
    $sasTokenCfg = "?sp=r&st={0}&se={1}&spr=https&sv={2}&sr=b&sig={3}" -f (
        "<start-time1>", "<expiration-time1>", "<storage-version1>", "<signature1>"
    )
    $sasTokenPkg = "?sp=r&st={0}&se={1}&spr=https&sv={2}&sr=b&sig={3}" -f (
        "<start-time2>", "<expiration-time2>", "<storage-version2>", "<signature2>"
    )
    $cscfg = "$containerUrl/<configuration-file>$sasTokenCfg"
    $cspkg = "$containerUrl/<package-file>$sasTokenPkg"
    
  • 運用環境のパブリック IP アドレスの構成ファイル。 ファイルは次のコードのようになります。

    <ServiceConfiguration
        xmlns=http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration
        serviceName="Test_cloudservice"
        osFamily="6"
        osVersion="*"
        schemaVersion="2015-04.2.6">
      <Role name="TestWebRole">
        <Instances count="1" />
      </Role>
      <Role name="TestWorkerRole">
        <Instances count="1" />
      </Role>
      <NetworkConfiguration>
        <VirtualNetworkSite name="test001VNet" />
        <AddressAssignments>
          <InstanceAddress roleName="TestWebRole">
            <Subnets>
              <Subnet name="default" />
            </Subnets>
          </InstanceAddress>
          <InstanceAddress roleName="TestWorkerRole">
            <Subnets>
              <Subnet name="default" />
            </Subnets>
          </InstanceAddress>
          <ReservedIPs>
            <ReservedIP name="cses-stag" />
          </ReservedIPs>
        </AddressAssignments>
      </NetworkConfiguration>
    </ServiceConfiguration>
    
  • ステージング環境のパブリック IP アドレスの構成ファイル。 ファイルは次のコードのようになります。 (予約済み IP アドレスの名前が cses-stag から cses-prod に変更されていることに注意してください)。

    <ServiceConfiguration
        xmlns=http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration
        serviceName="Test_cloudservice"
        osFamily="6"
        osVersion="*"
        schemaVersion="2015-04.2.6">
      <Role name="TestWebRole">
        <Instances count="1" />
      </Role>
      <Role name="TestWorkerRole">
        <Instances count="1" />
      </Role>
      <NetworkConfiguration>
        <VirtualNetworkSite name="test001VNet" />
        <AddressAssignments>
          <InstanceAddress roleName="TestWebRole">
            <Subnets>
              <Subnet name="default" />
            </Subnets>
          </InstanceAddress>
          <InstanceAddress roleName="TestWorkerRole">
            <Subnets>
              <Subnet name="default" />
            </Subnets>
          </InstanceAddress>
          <ReservedIPs>
            <ReservedIP name="cses-prod" />
          </ReservedIPs>
        </AddressAssignments>
      </NetworkConfiguration>
    </ServiceConfiguration>
    

ワークフロー

次の図は、VIP スワップを行うために実行する必要があるアクションを示しています。

Azure Cloud Service のさまざまなバージョンの仮想 IP アドレス (VIP) をスワップするワークフロー手順の概要を示す図。

アクションについては、次の手順で説明します。

  1. 運用クラウド サービス (testcsesv1) を作成し、運用の静的パブリック IP アドレス (cses-prod) を運用クラウド サービスにマップします。

  2. 新しいコード バージョン 2 がある場合は、ステージング クラウド サービス (testcsesv2) を作成し、ステージング パブリック IP アドレス (cses-stag) をステージング クラウド サービスにマップします。

  3. VIP スワップ操作をトリガーして、ステージング クラウド サービスを運用パブリック IP アドレス (cses-prod) に昇格させます。

  4. 新しいバージョンのクラウド サービスをステージングから運用環境に昇格すると、古いクラウド サービスバージョンが削除されます。

  5. 新しいコード バージョン 3 がある場合は、クラウド サービス (testcsesv3) を作成し、ステージング パブリック IP アドレス (cses-stag) を新しいクラウド サービスにマップします。

  6. 新しいクラウド サービス バージョンを運用パブリック IP アドレス (cses-prod) に昇格させるために、別の VIP スワップ操作をトリガーします。

これらのアクションについては、以降のセクションで詳しく説明します。

手順 1: 運用 IP アドレスをマップする運用クラウド サービスを作成する

次の PowerShell スクリプトは、手順 1 の運用クラウド サービスを初期化します。 New-AzCloudService コマンドレットの呼び出しでは、AllowModelOverride パラメーターは定義ファイル内のロール プロファイル設定をオーバーライドするのに役立ちます。 詳細については、「 Cloud Services (延長サポート)の .cscfg ファイルと .csdef ファイルの SKU 設定をオーバーライドする」を参照してください。

# Define basic variables.
$csName = "testcsesv1" 
$csRG = "testcses"
$publicIPName = "cses-prod"
$publicIPRG = "testcses"
$location = "East US"
 
# Create the network profile.
$publicIP = Get-AzPublicIpAddress -Name $publicIPName -ResourceGroupName $publicIPRG
$feIpConfigParams = @{
    Name = $csName + '_FEIP'
    PublicIPAddressId = $publicIp.Id
}
$feIpConfig = New-AzCloudServiceLoadBalancerFrontendIPConfigurationObject @feIpConfigParams
$loadBalancerConfigParams = @{
    FrontendIPConfiguration = $feIpConfig
    Name = $csName + '_LB'
}
$loadBalancerConfig = New-AzCloudServiceLoadBalancerConfigurationObject @loadBalancerConfigParams
$networkProfile = @{loadBalancerConfiguration = $loadBalancerConfig}

# Create the role profile.
$skuInfo = @{
    SkuCapacity = 1
    SkuName = 'Standard_A1_v2'
    SkuTier = 'Standard'
}
$role1 = New-AzCloudServiceRoleProfilePropertiesObject -Name "TestWebRole" @skuInfo
$role2 = New-AzCloudServiceRoleProfilePropertiesObject -Name "TestWorkerRole" @skuInfo
$roleProfile = @{role = @($role1,$role2)}
 
# Create the cloud service.
$azCloudServiceParams = @{
    Name = $csName
    ResourceGroupName = $csRG
    Location = $location
    AllowModelOverride = $true
    ConfigurationUrl = $cscfg
    NetworkProfile = $networkProfile
    PackageUrl = $cspkg
    RoleProfile = $roleProfile
}
New-AzCloudService @azCloudServiceParams

この PowerShell スクリプトを実行すると、次の出力に示すように、Azure によってクラウド サービスが作成されます。

ResourceGroupName Name       Location ProvisioningState
----------------- ---------- -------- -----------------
TESTCSES          testcsesv1 eastus   Succeeded

Azure ポータルでは、新しい運用クラウド サービスに関する詳細を表示できます。 Cloud サービス (延長サポート) を検索して選択し、クラウド サービスの一覧から testcsesv1 クラウド サービスを選択します。 そのクラウド サービスの Overview ページの Essentials セクションには、 Public IP DNS 名 フィールド (ワークフロー図のcses-prod.eastus.cloudapp.azure.com ) に運用 IP アドレス名が表示されます。

手順 2: ステージング IP アドレスをマップするステージング クラウド サービスを作成する

新しいバージョンのクラウド サービスがある場合は、手順 2 のステージング クラウド サービスとして作成できます。 この手順では、運用パブリック IP アドレスのフロントエンド設定を使用して、運用クラウド サービスを検索します。 この手順を実装するには、ステージング クラウド サービスのネットワーク プロファイルを定義するときに、スワップ可能なクラウド サービス プロパティの ID を運用クラウド サービスの ID に設定していることを確認します。

# Define basic variables.
$csName = "testcsesv2"
$csRG = "testcses"
$publicIPName = "cses-stag"
$publicIPRG = "testcses"
$location = "East US"
$FEName = $csName+'_FEIP'   # Frontend IP address name
$LBName = $csName+'_LB'     # Load balancer name
 
# Pair to the production public IP address.
$prodPIPName= "cses-prod"
$prodPIPRG = "testcses"

# Get the properties of the production cloud service.
$prodPIPres = (Get-AzPublicIpAddress -Name $prodPIPName -ResourceGroupName $prodPIPRG).Id
$prodCS = (Get-AzCloudService) |
    Where-Object {
        $_.networkProfile.LoadBalancerConfiguration.FrontendIPConfiguration.PublicIPAddressId
            -eq $prodPIPres
    }
$csName_pair = $prodCS.Name
$csRG_pair = $prodCS.ResourceGroupName

# Create the network profile.
$publicIP = Get-AzPublicIpAddress -Name $publicIPName -ResourceGroupName $publicIPRG
$feIpConfigParams = @{
    Name = $csName + '_FEIP'
    PublicIPAddressId = $publicIp.Id
}
$feIpConfig = New-AzCloudServiceLoadBalancerFrontendIPConfigurationObject @feIpConfigParams
$loadBalancerConfigParams = @{
    FrontendIPConfiguration = $feIpConfig
    Name = $csName + '_LB'
}
$loadBalancerConfig = New-AzCloudServiceLoadBalancerConfigurationObject @loadBalancerConfigParams
$networkProfile = New-Object Microsoft.Azure.PowerShell.Cmdlets.CloudService.Models.Api20210301.CloudServiceNetworkProfile

# Set the network profile's load balancer configuration and swappable cloud service ID.
$networkProfile.LoadBalancerConfiguration = $loadBalancerConfig 
$networkProfile.SwappableCloudService.Id = (
    Get-AzCloudService -Name $csName_pair -ResourceGroup $csRG_pair
).Id

# Create the role profile.
$skuInfo = @{
    SkuCapacity = 1
    SkuName = 'Standard_A1_v2'
    SkuTier = 'Standard'
}
$role1 = New-AzCloudServiceRoleProfilePropertiesObject -Name "TestWebRole" @skuInfo
$role2 = New-AzCloudServiceRoleProfilePropertiesObject -Name "TestWorkerRole" @skuInfo
$roleProfile = @{role = @($role1,$role2)}
 
# Create the cloud service.
$azCloudServiceParams = @{
    Name = $csName
    ResourceGroupName = $csRG
    Location = $location
    AllowModelOverride = $true
    ConfigurationUrl = $cscfg
    NetworkProfile = $networkProfile
    PackageUrl = $cspkg
    RoleProfile = $roleProfile
}
New-AzCloudService @azCloudServiceParams

この PowerShell スクリプトを実行すると、次の出力に示すように、Azure によってクラウド サービスが作成され、ステージング パブリック IP アドレスとペアになります。

ResourceGroupName Name       Location ProvisioningState
----------------- ---------- -------- -----------------
TESTCSES          testcsesv2 eastus   Succeeded

Azure ポータルで、この新しいステージング クラウド サービスが運用クラウド サービスとスワップ可能に設定されていることを確認できます。 Cloud サービス (延長サポート) を検索して選択し、クラウド サービスの一覧から testcsesv2 クラウド サービスを選択します。 そのクラウド サービスの Overview ページの Essentials セクションには、ステージング IP アドレス名が Public IP DNS 名 フィールド (ワークフロー図のcses-stag.eastus.cloudapp.azure.com ) に表示されます。 また、このセクションには、 Swappable クラウド サービス testcsesv1 の値が表示されます。 逆に、クラウド サービスの一覧から testcsesv1 を選択した場合、 Swappable クラウド サービス 値は testcsesv2 として表示されます。

手順 3: VIP スワップをトリガーして、運用 IP アドレスをステージング クラウド サービスにマップする

フロントエンド構成で Load Balancers - Swap Public Ip Addresses REST API を使用して、クラウド サービスの IP アドレスをスワップできます。 応答ヘッダーの URL を使用して、非同期操作が完了したことを確認できます。

VIP スワップ操作では、Azure Resource Manager の Azure-AsyncOperation 要求が使用されます。 スワップ操作の詳細については、「 Track 非同期 Azure 操作」を参照してください。

# Get the staging public IP address.
$stagPIP = "cses-stag"
$stagPIPRG = "testcses"
$stagPIPres = Get-AzPublicIpAddress -Name $stagPIP -ResourceGroupName $stagPIPRG
$stagPIPID = $stagPIPres.id
$stagPIPFEID = $stagPIPres.IpConfiguration.id
 
# Get the production public IP address.
$prodPIP = "cses-prod"
$prodPIPRG = "testcses"
$prodPIPres = Get-AzPublicIpAddress -Name $prodPIP -ResourceGroupName $prodPIPRG
$prodPIPID = $prodPIPres.id
$prodPIPFEID = $prodPIPres.IpConfiguration.id
 
$Payload = (
    '{"frontendIPConfigurations":[{"properties":{"publicIPAddress":{"id":"', $prodPIPID,
    '"}},"id":"', $stagPIPFEID,
    '"},{"properties":{"publicIPAddress":{"id":"', $stagPIPID,
    '"}},"id":"', $prodPIPFEID,
    '"}]}'
) -Join ""
 
$subID = (Get-AzContext).Subscription.id
$location = $prodPIPres.Location
$url = (
    "/subscriptions/", $subID,
    "/providers/Microsoft.Network/locations/", $location,
    "/setLoadBalancerFrontendPublicIpAddresses?api-version=2021-02-01"
) -Join ""

# Start a swap operation.
$result = Invoke-AzRestMethod -Path $url -Method POST -Payload $Payload
If ($result.StatusCode -eq 202)
{
    $async_url = (
        $result.Headers | Where-Object {$_.Key -eq "Azure-AsyncOperation"}
    ).Value[0]
    $code = 0
    Do {
        $code = (Invoke-AzRestMethod -Uri $async_url -Method Get).StatusCode
        If ($code -eq 200) {
              Write-Host "Swap Completed!"
        }
        Else {
              Write-Host "In Swapping... Retry after 5 seconds"
              Start-Sleep -Seconds 5 
        }
    } While (!($code -eq 200))
}

手順 4: 運用環境からスワップアウトされたステージング クラウド サービスを削除する

ステージング パブリック IP アドレスを持つクラウド サービスを削除します。 このクラウド サービスは、以前は運用クラウド サービスでした。 ただし、前の手順では、クラウド サービスの新しいバージョンとスワップされました。 ステージング IP アドレスがこの古いバージョンにマップされるようになりました。 そのため、古いクラウド サービスを安全に削除できるようになりました。

# Define basic variables.
$prodPIPName = "cses-prod"
$prodPIPRG = "testcses"
$stagPIPName= "cses-stag"
$stagPIPRG = "testcses"

# Get the cloud service that has the production public IP address.
$prodPIPres = (Get-AzPublicIpAddress -Name $prodPIPName -ResourceGroupName $prodPIPRG).Id
$prodCS = (Get-AzCloudService) |
    Where-Object {
        $_.networkProfile.LoadBalancerConfiguration.FrontendIPConfiguration.PublicIPAddressId
            -eq $prodPIPres
    }

# Get the cloud service that has the staging public IP address.
$stagPIPres = (Get-AzPublicIpAddress -Name $stagPIPName -ResourceGroupName $stagPIPRG).Id
$stagCS = (Get-AzCloudService) |
    Where-Object {
        $_.networkProfile.LoadBalancerConfiguration.FrontendIPConfiguration.PublicIPAddressId
            -eq $stagPIPres
    }
                
# Remove the cloud service that has the staging name.
Remove-AzCloudService -Name $stagCS.Name -ResourceGroupName $stagCS.ResourceGroupName

これで、運用環境のパブリック IP アドレス名にマップされている新しいクラウド サービスのバージョンを確認できるようになります。 さらに、スワップ可能なクラウド サービスは表示されなくなります。

Azure ポータルでCloud サービス (延長サポート)を検索して選択し、クラウド サービスの一覧から testcsesv2 クラウド サービスを選択します。 ( testcsesv1 クラウド サービスは表示されなくなります)。そのクラウド サービスの Overview ページで、 Essentials セクションに、 Swappable クラウド サービス フィールド (以前は testcsesv1 の値が含まれていた) が表示されなくなります。 Public IP DNS 名 フィールドに、運用 IP アドレス (ワークフロー図にcses-prod.eastus.cloudapp.azure.com) が表示されるようになりました。

手順 5 と 6: クラウド サービスの新しいバージョンを 3 番目のバージョンにスワップする

手順 2 から 4 を繰り返して、3 番目のバージョンのクラウド サービスを運用環境に配置するように構成し、2 番目のクラウド サービスのバージョンも削除できます。 次のアクションの概要で説明されているように、クラウド サービス名を変更する必要があります。

  1. ステージング パブリック IP アドレスにマップされたステージング クラウド サービス testcsesv3 として、3 番目のバージョンのクラウド サービスを作成します。

  2. この 3 番目のバージョンのクラウド サービスを 2 番目のバージョンと交換します (testcsesv2、ステージング IP アドレスで設定された後、運用 IP アドレスにマップされるようになりました)。

  3. クラウド サービスの 2 番目のバージョンを削除します (testcsesv2、ステージング IP アドレスに再度マップされます)。

VIP スワップ操作の制限事項

VIP スワップ操作の制限事項の詳細については、「 Azure Cloud Services (延長サポート)でのデプロイのスワップまたは切り替え」を参照してください。

お問い合わせはこちらから

質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。