gpt4 book ai didi

使用 sas token 为 Multi-Tenancy 应用程序跨容器同步时出现 Azure 'azcopy sync' 问题

转载 作者:行者123 更新时间:2023-12-03 03:52:59 38 4
gpt4 key购买 nike

我正在尝试使用Multitetant App在不同帐户中的Azure容器之间同步数据。和 azcopy 工具。

同步通过“azcopysync”进行,并对源存储帐户和目标存储帐户使用单独的 SAS token 。

我正在按照用户委托(delegate) key 方法使用 Java SDK 生成短期 sas token 。

这是场景:

Account1(目标) 已注册 App1。即 Account1 是 App1 的家庭租户。Account1 配置了 StorageAccount1 和 Container1App1 在 StorageAccount1 上被授予“存储 Blob 数据贡献者”角色

Account2(源)已配置 StorageAccount2 和 Container2。它是我们的数据源。在这里,App1 通过以下方式添加为 ServicePrincipal:

az ad sp create --id client-id-of-App1-in-Account1

在 Account2 中,对于此 SP,我们还将存储 Blob 数据读取器角色指定为:

az role assignment create \
--assignee-object-id <object-id-for-this-sp> \
--role 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1 \
--scope /subscriptions/<subsid-account2>/resourceGroups/<resgrpname>/providers/Microsoft.Storage/storageAccounts/<storagename>

这样就完成了设置。

现在使用 Java SDK,我为源和目标生成了用户委托(delegate) key 。该代码片段如下所示。

genSasToken(String storageAccountName, String containerName,
String tenantId,
String azureAppClientId,
String azureAppClientSecret,
boolean isDestinationAccount) {
BlobContainerSasPermission blobContainerSasPermission =
new BlobContainerSasPermission().setReadPermission(true).setListPermission(true);
if (isDestinationAccount) {
blobContainerSasPermission.setCreatePermission(true)
.setAddPermission(true)
.setWritePermission(true)
.setExecutePermission(true);
}
BlobServiceSasSignatureValues builder =
new BlobServiceSasSignatureValues(OffsetDateTime.now().plusHours(1), blobContainerSasPermission)
.setProtocol(SasProtocol.HTTPS_ONLY);
// Create a BlobServiceClient object which will be used to create a container client
String endpoint = String.format(Locale.ROOT, "https://%s.blob.core.windows.net",
storageAccountName);
ClientSecretCredential clientSecretCredential = new ClientSecretCredentialBuilder()
.clientId(azureAppClientId)
.clientSecret(azureAppClientSecret)
.tenantId(tenantId)
.build();

BlobServiceClient blobServiceClient =
new BlobServiceClientBuilder().endpoint(endpoint).credential(clientSecretCredential).buildClient();
BlobContainerClient blobContainerClient =
blobServiceClient.getBlobContainerClient(containerName);
// Get a user delegation key for the Blob service that's valid for one hour.
// You can use the key to generate any number of shared access signatures over the lifetime of the key.
OffsetDateTime keyStart = OffsetDateTime.now();
OffsetDateTime keyExpiry = OffsetDateTime.now().plusHours(1);
UserDelegationKey userDelegationKey = blobServiceClient.getUserDelegationKey(keyStart, keyExpiry);

String sas = blobContainerClient.generateUserDelegationSas(builder, userDelegationKey);
return sas;
}

针对源和目标调用上述方法,并为我们提供以编程方式生成的 SAS token 。

有趣的事情发生是这样的:

azcopy 同步 https://storageaccount2/container2/?sas-token-for2 https://storageaccount1/container1/?sas-token-for1

以上同步错误为

INFO: Authentication failed, it is either not correct, or expired, or does not have the correct permission -> github.com/Azure/azure-storage-blob-go/azblob.newStorageError, /Users/runner/go/pkg/mod/github.com/!azure/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="afced5daddca82dcdbc0ddcec8ca82cdc3c0cd82c8c0efd99f819e9f819e829f819d9f9d9f9e9f9d9d9f989b979f998297cb97c9cc9e9ecdca989d99" rel="noreferrer noopener nofollow">[email protected]</a>/azblob/zc_storage_error.go:42
===== RESPONSE ERROR (ServiceCode=AuthorizationFailure) =====
Description=This request is not authorized to perform this operation.
RequestId:xxx
Time:2021-01-27T10:26:34.9282634Z, Details:
Code: AuthorizationFailure
GET https://storageaccount1.blob.core.windows.net/container1/?comp=properties&restype=account&se=2021-01-27t11%3A10%3A12z&sig=-REDACTED-&ske=2021-01-27t11%3A10%3A12z&skoid=xxx&sks=b&skt=2021-01-27t10%3A10%3A12z&sktid=xxx&skv=2020-02-10&sp=racwle&spr=https&sr=c&sv=2020-02-10&timeout=901
User-Agent: [AzCopy/10.8.0 Azure-Storage/0.10 (go1.13; darwin)]
X-Ms-Client-Request-Id: [xxx]
X-Ms-Version: [2019-12-12]
--------------------------------------------------------------------------------
RESPONSE Status: 403 This request is not authorized to perform this operation.
Content-Length: [246]
Content-Type: [application/xml]
Date: [Wed, 27 Jan 2021 10:26:34 GMT]
Server: [Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0]
X-Ms-Client-Request-Id: [xxx]
X-Ms-Error-Code: [AuthorizationFailure]
X-Ms-Request-Id: [xxx]
X-Ms-Version: [2019-12-12]

但是,当我尝试使用相同的 sas token 2 从源复制到本地主机时,它起作用了。

azcopy 同步 https://storageaccount2/container2/sas-token-for2/tmp

当我尝试使用相同的 sas token 将 localhost 文件夹复制到目标时,它也可以工作。

azcopy 同步/tmp https://storageaccount1/container1/sas-token-for1

因此, token 像上面一样单独工作。

但是azcopy同步https://storageaccount2/container2/sas-token-for2 https://storageaccount1/container1/sas-token-for1

失败。

有什么指示可能是这里的问题吗?

最佳答案

对于同步,您不需要执行权限(在任何情况下仍处于预览状态)。只要删除 .setExecutePermission(true) 就可以了。事实上,同步应该仅在目标上具有读、写和列出权限的情况下工作。

关于使用 sas token 为 Multi-Tenancy 应用程序跨容器同步时出现 Azure 'azcopy sync' 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65923143/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com