こんにちは。
クライアントビジネス推進部の開發(@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の作成
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