gpt4 book ai didi

java - 在 Azure 中的存储帐户之间复制 blob - 此存储帐户错误不允许公共(public)访问

转载 作者:行者123 更新时间:2023-12-03 06:58:15 24 4
gpt4 key购买 nike

我想要将 blob 从一个存储帐户 (ADLS Gen2) 复制到另一个存储帐户(相同类型)。我什至有带有 SAS token 授权的WORKING代码:

import com.microsoft.azure.storage.{CloudStorageAccount,StorageException,StorageCredentials,StorageCredentialsToken}
import com.microsoft.azure.storage.blob.{CloudBlobClient,CloudBlockBlob,CloudBlobDirectory,CloudBlobContainer,ListBlobItem}

val srcStorageAccountName = "<src-account-name>"
val destStorageAccountName = "<dest-account-name>"


// SAS authorization
val srcSas = "<src-sas-token>"
val srcCloudStorageAccount= CloudStorageAccount.parse(s"DefaultEndpointsProtocol=https;AccountName=${srcStorageAccountName};SharedAccessSignature=${srcSas};EndpointSuffix=core.windows.net")

val destSas = "<dest-sas-token>"
val destCloudStorageAccount= CloudStorageAccount.parse(s"DefaultEndpointsProtocol=https;AccountName=${destStorageAccountName};SharedAccessSignature=${destSas};EndpointSuffix=core.windows.net")

val destBlobClient = destCloudStorageAccount.createCloudBlobClient()
val srcBlobClient = srcCloudStorageAccount.createCloudBlobClient()

try {
val srcPath = "<src-path>"
val destPath = "<dest-path>"
val srcContainerName = "<src-container>"
val destContainerName = "<dest-container>"
val srcContainer = srcBlobClient.getContainerReference(srcContainerName)
val destContainer = destBlobClient.getContainerReference(destContainerName)
val blobs = srcContainer.listBlobs(srcPath)
import scala.jdk.CollectionConverters._
copyBlobList(blobs.asScala, destContainer, srcContainer, srcContainerName, srcPath, destPath)
} catch {
case e: StorageException =>
e.printStackTrace()
}

def copyBlobList(blobs: Iterable[ListBlobItem], destContainer: CloudBlobContainer, srcContainer: CloudBlobContainer, srcContainerName: String, srcPath: String, destPath: String): Unit = {
for (blob <- blobs) {
blob match {
case blockBlob: CloudBlockBlob => copySingleBlob(blockBlob, destContainer, srcContainer, srcContainerName, srcPath, destPath)
case blobDirectory: CloudBlobDirectory => copyBlobDirectory(blobDirectory, destContainer, srcContainer, srcContainerName, srcPath, destPath)
case _ => println(s"Unknown blob type")
}
}
}

def copySingleBlob(blob: CloudBlockBlob, destContainer: CloudBlobContainer, srcContainer: CloudBlobContainer, srcContainerName: String, srcPath: String, destPath: String): Unit = {
val srcBlob = srcContainer.getBlockBlobReference(blob.getUri.getPath.replaceFirst(srcContainerName, "").substring(1).replace(srcPath, destPath))
val destBlob = destContainer.getBlockBlobReference(blob.getUri.getPath.replaceFirst(srcContainerName, "").substring(1).replace(srcPath, destPath))
destBlob.startCopy(srcBlob)
}

def copyBlobDirectory(blobDirectory: CloudBlobDirectory, destContainer: CloudBlobContainer, srcContainer: CloudBlobContainer, srcContainerName: String, srcPath: String, destPath: String): Unit = {
val blobsFromDir = srcContainer.listBlobs(blobDirectory.getUri.getPath.replace(srcContainerName, ""))
import scala.jdk.CollectionConverters._
copyBlobList(blobsFromDir.asScala, destContainer, srcContainer, srcContainerName, srcPath, destPath)
}

这里的问题是任何其他授权都会导致异常:com.microsoft.azure.storage.StorageException:此存储帐户不允许公共(public)访问。

我已经尝试过:

// Account key authorization
val destKey = "<dest-account-key>"
val srcKey = "<src-account-key>"

val srcCloudStorageAccount = CloudStorageAccount.parse(s"DefaultEndpointsProtocol=https;AccountName=${srcStorageAccountName};AccountKey=${srcKey};EndpointSuffix=core.windows.net")
val destCloudStorageAccount = CloudStorageAccount.parse(s"DefaultEndpointsProtocol=https;AccountName=${destStorageAccountName};AccountKey=${destKey};EndpointSuffix=core.windows.net")

// Access token authorization
val srcTokenCredentials = new StorageCredentialsToken(srcStorageAccountName, srcToken)
val srcCloudStorageAccount = new CloudStorageAccount(srcTokenCredentials, true)

val destTokenCredentials = new StorageCredentialsToken(destStorageAccountName, destToken)
val destCloudStorageAccount = new CloudStorageAccount(destTokenCredentials, true)

它们都允许在同一存储帐户内复制 blob,但在两个不同存储帐户之间的复制操作失败。

问题:我真正不明白的是为什么 SAS 授权允许在两个存储帐户之间进行复制,而帐户 key 授权和访问 token 授权会失败并出现“不允许公共(public)访问”异常。有什么想法吗?

谢谢

最佳答案

  • 默认情况下,存储帐户未配置为具有公共(public)访问权限。您可以从门户、CLI、Powershell 或模板设置/检查其值。如果您授予对存储帐户的公开访问权限,则拥有足够权限的用户就可以访问您的存储帐户。
  • 但默认情况下,SAS 在生成时会获得某些权限,例如读/写、服务、资源类型、开始和到期日期/时间、允许的 IP 地址等,从而可以访问存储帐户的某些部分。
  • 在您的情况下,您可能会提供访问 key ,但由于容器和 blob 的默认权限,您需要提供可由访问 key 生成的 SAS token 。
  • 建议为 SAS 客户端提供访问 key ,使用户可以访问所有存储帐户。而 SAS 则为您提供对存储帐户的有限访问权限(在有限的时间内仅访问存储帐户的少数部分),并且如果您不想再通过轮换 key 来授予访问权限,还可以轻松撤销权限。

引用文献:

  1. public read access for containers and blobs - MSFT Document
  2. Grant limited access to Azure Storage resources using SAS - MSFT Document

关于java - 在 Azure 中的存储帐户之间复制 blob - 此存储帐户错误不允许公共(public)访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72707053/

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