👻

Azure CLI&PowerShell CoreでManaged DiskをBLOB Storageにコピーする

2024/08/14に公開

結論

PowerShellではAzure CLIではなく、同等のAzure PowerShellを使え。

メモ

Azure CLIを利用していて、次のような問題にあたりました。対処は可能ですが、逐一こういった問題に対処することを考えるより、すなおにAzure PowerShellを利用した方がよさそうです。

下記のようにManaged DiskをVHDにエクスポートして、Azure CLIでコピーしたらエラーができて実行できませんでした。

# Managed DiskをVHDファイルにエクスポート
$sas = az disk grant-access `
  --resource-group $resourceGroupName `
  --name $diskName `
  --duration-in-seconds 3600 `
  --access-level Read `
  --query "accessSas" `
  --output tsv

# Blob Storageコピー
az storage blob copy start `
  --account-key $storageAccountKey `
  --account-name $storageAccountName `
  --destination-container $containerName `
  --destination-blob $vhdFileName `
  --source-uri $sas

エラーの詳細はつぎのとおりです。

Server failed to authenticate the request. Please refer to the information in the www-authenticate header.
RequestId:9d7078d6-501e-0009-27cf-xxxxxxxxxxx
Time:2024-08-13T22:20:41.9863384Z
ErrorCode:CannotVerifyCopySource
'sr' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
'si' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
'sig' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
コピーにかかった時間: 1.28059 秒

これは$sasに&が含まれていて、実行時に展開されているからのようです。つぎのようにダブルクォーテーションで括って渡すことで正常に実行できます。

$sas = '"' + $sas + '"'

全文はこちら。

# Managed DiskをVHDファイルにエクスポート
$sas = az disk grant-access `
  --resource-group $resourceGroupName `
  --name $diskName `
  --duration-in-seconds 3600 `
  --access-level Read `
  --query "accessSas" `
  --output tsv
$sas = '"' + $sas + '"'

# Blob Storageコピー
az storage blob copy start `
  --account-key $storageAccountKey `
  --account-name $storageAccountName `
  --destination-container $containerName `
  --destination-blob $vhdFileName `
  --source-uri $sas

Discussion