NEXTSCAPE blog

株式会社ネクストスケープの社員による会社公式ブログです。ネスケラボでは、社員が日頃どのようなことに興味をもっているのか、仕事を通してどのような面白いことに取り組んでいるのかなど、会社や技術に関する情報をマイペースに紹介しています。

MENU

Azure Cloud Services クラシック から 延長サポート への移行

こんにちは。

クライアントビジネス推進部の開發(@mamikaihatsu)です。
この記事は「NEXTSCAPE Advent Calendar 2022」の10日目です。

 

qiita.com

 

Azure は 2010年からサービスが開始され、様々なIaaSやPaaSがリリースされてきました。

この歴史の中で、レガシーなサービスが廃止されたり、リニューアルされる事も少なくありません。

今回、取り上げるCloud Services (クラシック) は、ASM(Azure Service Management)*1 の頃からですのでAzureの中でも長く提供されているサービスです。

遂に2024 年 8 月 31 日に廃止される事となり、現在は 新しいCloud Service (延長サポート) への移行が推奨されております。

 

新しい Cloud Service (延長サポート) への移行を実施した際の手順を纏めましたので、記載いたします。

これから移行される方のご参考になれば幸いです。

 

 

移行方法は2通りあります。

  • AzureポータルからCloud Services (クラシック)の移行ボタンを押してホストしているアプリを 延長サポートへ インプレース移行する方法
  • 新しい Cloud Service (延長サポート)に再デプロイする方法

今回記載するのは後者となります。

 

手順

1. リソースの作成

 1-1. KeyVaultの作成
    • KeyVaultにアプリで使用している証明書を登録し、以下設定。

      • アクセスの有効化

        • Azure Virtual Machines

        • Azure Resource Manager

      • アクセスポリシーの追加

        • 必要ユーザーを追加

 1-2. Storageの作成(Storage(クラシック)使用分をARMへ)
    • Cloud Service 設定ファイルアップロード先のStorage
    • Cloud Service 診断設定用のStorage etc…
 1-3. VNetの作成
    • Cloud Service をホストする為に必要になります

 

2. 設定ファイル修正

 2-1. csdefファイルの設定変更

  1. 証明書指定( <Certificates> )から中間証明書を削除

    • 変更前
    <Certificates>
      <Certificate name="xxxx.com" storeName="My" storeLocation="CurrentUser" />
      <Certificate name="xxxxx" storeLocation="LocalMachine" storeName="CA" />
      <Certificate name="xxxxx" storeLocation="LocalMachine" storeName="CA" />
      <Certificate name="xxxxx" storeLocation="LocalMachine" storeName="CA" />
  </Certificates>
    • 変更後
    <Certificates>
    <Certificate name="xxxx.com" storeName="My" storeLocation="CurrentUser" />
  </Certificates>

 

  2. RDP設定箇所を削除

    <Imports>
      <Import moduleName="RemoteAccess" />
      <Import moduleName="RemoteForwarder" />
  </Imports>

 

  3. WebRoleのサイズ変更

    <WebRole name="xxxx" vmsize="Large">
    • 変更後
    <WebRole name="xxxx" vmsize="Standard_A4_v2">

  

 

 

 2-2. cscfgファイルの設定変更

  1. 証明書指定( <Certificates> )からRDP設定や中間証明書を削除

    • 変更前
    <Certificates>
      <Certificate name="Microsoft.WindowsAzure.Plugins.RemoteAccess.PasswordEncryption" thumbprint="xxxxx" thumbprintAlgorithm="sha1" />
      <Certificate name="xxxx.com" thumbprint="xxxxx" thumbprintAlgorithm="sha1" />
      <Certificate name="xxxxx" thumbprint="xxxxx" thumbprintAlgorithm="sha1" />
      <Certificate name="xxxxx" thumbprint="xxxxx" thumbprintAlgorithm="sha1" />
      <Certificate name="xxxxx" thumbprint="xxxxx" thumbprintAlgorithm="sha1" />
    </Certificates>
    • 変更後
    <Certificates>
    <Certificate name="xxxx.com" thumbprint="xxxxx" thumbprintAlgorithm="sha1" />
    </Certificates>

 

  2. RDP設定箇所を削除

    • 変更前
    <ConfigurationSettings>
      <Setting name="StorageConnectionString" value="xxxxx" />
      <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="xxxxx" />
      <Setting name="Microsoft.WindowsAzure.Plugins.RemoteAccess.Enabled" value="true" />
      <Setting name="Microsoft.WindowsAzure.Plugins.RemoteAccess.AccountUsername" value="xxxxx" />
      <Setting name="Microsoft.WindowsAzure.Plugins.RemoteAccess.AccountEncryptedPassword" value="xxxxx" />
      <Setting name="Microsoft.WindowsAzure.Plugins.RemoteAccess.AccountExpiration" value="xxxxx" />
      <Setting name="Microsoft.WindowsAzure.Plugins.RemoteForwarder.Enabled" value="true" />
      <Setting name="APPINSIGHTS_INSTRUMENTATIONKEY" value="xxxxx" />
    </ConfigurationSettings>
    • 変更後
    <ConfigurationSettings>
      <Setting name="StorageConnectionString" value="xxxxx" />
      <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="xxxxx" />
      <Setting name="APPINSIGHTS_INSTRUMENTATIONKEY" value="xxxxx" />
    </ConfigurationSettings>

 

  3. 診断設定箇所の接続先をStorageV2の接続先に変更

<Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="xxxxx" />

 

  4. ネットワーク設定(<NetworkConfiguration>)にVNet情報等を追加

  <NetworkConfiguration>
    <VirtualNetworkSite name="xxxx-vnet"/>
      <AddressAssignments>
          <InstanceAddress roleName="xxxx" >
              <Subnets>
                <Subnet name="xxxx"/>
              </Subnets>
          </InstanceAddress>
    </AddressAssignments>
  </NetworkConfiguration>

 

3. VS2022でデプロイ

VS2022では、CloudService(延長サポート)へのデプロイが可能です

 

右クリックで「発行(延長サポート)」からデプロイできます。

 

作成したKeyVaultはここで「キー コンテナー」で指定します。

RDP設定を行う場合は、「すべてのロールのリモートデスクトップを有効にする」にチェックを入れ、ユーザー名、パスワード、有効期限を設定します。

 

必要な項目を入力し、「発行」ボタンを押すとデプロイが開始します。

 

4. Azure Az PowerShell でデプロイ

  • Azure Cloud Service(クラシック) の時に CI/CDツール等で使用していた AzureRM PowerShellは、延長サポートでは使用出来ない為、Azure Az PowerShellで書き換える必要があります。
## デプロイ ##

$cloudServiceName = 'ServiceName'
$resourceGroupName = 'ResourceGroupName'

$publishConfiguration = 'C:\xxxx\app.publish\ServiceConfiguration.xxxx.cscfg'
$definitionFile = 'C:\xxxx\app.publish\ServiceDefinition.csdef'
$publishPackage = 'C:\xxxx\app.publish\xxx.cspkg'
$storageAccountName = 'StorageAccountName'
$storageContainerName = 'vsdeploy'

# CloudService確認
Write-Host "Finding existing service $cloudServiceName in Resource Group $resourceGroupName"
$svc = Get-AzCloudService -ResourceGroup $resourceGroupName -CloudServiceName $cloudServiceName
if (!$svc)
{   
    throw "Failed to find existing cloud service $cloudServiceName"
}

# SKU変更
$svc.RoleProfile.Role | ForEach-Object {$_.SkuName = $SkuName}
$svc.RoleProfile.Role | ForEach-Object {$_.SkuCapacity = $SkuCapacity}


# StorageAccount確認
Write-Host "Checking if storage account $storageAccountName exists"
$storageAccount = Get-AzStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccountName -ErrorAction SilentlyContinue
if (!$storageAccount)
{
    throw "Failed to find existing storage account $storageAccountName"
}

# Storageコンテナ確認
Write-Host "Checking if storage container $storageContainerName exists"
$container = Get-AzStorageContainer -Name $storageContainerName -Context $storageAccount.Context -ErrorAction SilentlyContinue

if (!$container)
{
    Write-Host "Storage account container not found. Creating container $storageContainerName"
    $container = New-AzStorageContainer -Name $storageContainerName -Context $storageAccount.Context -Permission Off 
}

# Storageにアップロード
$tokenStartTime = Get-Date 
$tokenEndTime = $tokenStartTime.AddYears(1) 
$rundum = $tokenStartTime.ToString("yyyymmddhhmmssfff")

Write-Host "Uploading service configuration file to blob storage"

$cscfgBlob = Set-AzStorageBlobContent -File $publishConfiguration -Container $storageContainerName -Blob "cloudservice$($rundum).cscfg" -Context $storageAccount.Context -Force
$cscfgToken = New-AzStorageBlobSASToken -Container $storageContainerName -Blob $cscfgBlob.Name -Permission r -StartTime $tokenStartTime -ExpiryTime $tokenEndTime -Context $storageAccount.Context 
$cscfgUrl = $cscfgBlob.ICloudBlob.Uri.AbsoluteUri + $cscfgToken 

Write-Host "Service configuration uploaded."

Write-Host "Uploading service package file to blob storage"

$cspkgBlob = Set-AzStorageBlobContent -File $publishPackage -Container $storageContainerName -Blob "cloudservice$($rundum).cspkg" -Context $storageAccount.Context -Force
$cspkgToken = New-AzStorageBlobSASToken -Container $storageContainerName -Blob $cspkgBlob.Name -Permission r -StartTime $tokenStartTime -ExpiryTime $tokenEndTime -Context $storageAccount.Context 
$cspkgUrl = $cspkgBlob.ICloudBlob.Uri.AbsoluteUri + $cspkgToken 

Write-Host "Service package uploaded."

Write-Host "Updating existing service $cloudServiceName with new configuration and executable package"

New-AzCloudService `
-Name $svc.Name `
-ResourceGroupName $svc.ResourceGroupName `
-Location $svc.Location `
-ConfigurationUrl $cscfgUrl `
-PackageUrl $cspkgUrl `
-UpgradeMode Auto `
-RoleProfile $svc.RoleProfile `
-NetworkProfile $svc.NetworkProfile `
-OSProfile $svc.OSProfile `
-ExtensionProfile $svc.ExtensionProfile 

Write-Host "Cloud Service Updated"

 

まとめ

Azure Cloud Service(クラシック)からの移行は、延長サポート以外では、コード改修は増えますがAppServiceやAzure Batch、仮想マシンなども検討の範囲に入るかと思います。
要件によって何が適切かを判断し、移行方針を決める必要があります。

 

ネクストスケープでは、一緒に働く仲間を募集しております。
新しい技術を検証し導入する事も多く、色々なことにチャレンジしたいという方がいらっしゃれば、ぜひご応募ください。

www.nextscape.net

 

 

*1:ASMについて・・現在はARM(Azure Resource Management)であり、この違いを知りたい方はこちらの記事をご参照ください。