Azure CLI无法扩展/锁定不可变策略:ETag不正确导致操作失败
Azure CLI操作不可变存储策略ETag错误解决方案
问题描述
使用Azure CLI操作容器级不可变存储(WORM)策略时,可正常创建策略,但执行锁定未锁定策略或扩展已锁定策略操作时,即使通过az storage container immutability-policy show获取了ETag,仍报错:
(ContainerImmutabilityPolicyFailure) Operation not allowed on immutability policy with incorrect etag.
Code: ContainerImmutabilityPolicyFailure
Message: Operation not allowed on immutability policy with incorrect etag.
使用--if-match *、添加--resource-group参数均无效,但通过Azure门户使用相同凭据可正常完成操作。
解决方案
1. 传递带完整引号的ETag
Azure存储服务返回的ETag实际包含双引号(例如"0x8DABC1234567890"),但--output tsv会自动去除引号,导致CLI传递的ETag不符合服务端校验要求。调整ETag获取命令,保留引号:
$etag = az storage container immutability-policy show ` --account-name <a-name> ` --container-name <c-name> ` --query etag ` --output json
执行锁定命令时直接使用该ETag:
az storage container immutability-policy lock ` --account-name <a-name> ` --container-name <c-name> ` --if-match $etag
2. 升级Azure CLI至最新版本
旧版本CLI存在ETag处理的已知bug,执行以下命令升级:
az upgrade
升级完成后重新登录Azure:
az login
3. 直接调用Azure REST API绕开CLI问题
如果上述方法无效,可通过az rest直接调用存储服务API完成操作:
锁定策略
$accountName = "<a-name>" $containerName = "<c-name>" # 获取不带引号的ETag值 $etag = (az storage container immutability-policy show --account-name $accountName --container-name $containerName --query etag --output json).Trim('"') az rest ` --method POST ` --uri "https://$accountName.blob.core.windows.net/$containerName/?restype=container&comp=immutabilitypolicy&action=lock" ` --headers "If-Match=`"$etag`"" ` --headers "Content-Type=application/json" ` --body '{}'
扩展已锁定策略(指定新保留天数)
$newRetentionDays = 365 # 替换为实际需要的保留天数 az rest ` --method PUT ` --uri "https://$accountName.blob.core.windows.net/$containerName/?restype=container&comp=immutabilitypolicy" ` --headers "If-Match=`"$etag`"" ` --headers "Content-Type=application/json" ` --body "{'properties': {'immutabilityPeriodSinceCreationInDays': $newRetentionDays}}"
内容的提问来源于stack exchange,提问作者Claus Appel
相关产品推荐
相关产品推荐

