如何从 azure 中获取 blob
How to fetch blob from azure
我正在尝试通过官方 azure-sdk-for-go
.
从 Go 中的 Azure Blob 存储下载一些数据
为了设置我的开发环境,我已经通过 az login
成功登录。我已验证可以通过 CLI 访问该 blob:
az storage blob download --container-name [container-name] --name [blob-name] --account-name [storage-account-name] -f out.txt
这按预期工作。为了获取文件 unsing go 我正在使用以下代码片段(作为复制者):
func getBlob(account, container, object string) ([]byte, error) {
blobPath := fmt.Sprintf("https://%s.blob.core.windows.net/%s/%s", uri.Host, container, object)
ctx := context.Background()
credential, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
return []byte{}, err
}
blobClient, err := azblob.NewBlockBlobClient(blobPath, credential, nil)
if err != nil {
return []byte{}, err
}
get, err := blobClient.Download(ctx, nil)
if err != nil {
return []byte{}, err
}
downloadedData := &bytes.Buffer{}
reader := get.Body(&azblob.RetryReaderOptions{})
_, err = downloadedData.ReadFrom(reader)
if err != nil {
return []byte{}, err
}
err = reader.Close()
if err != nil {
return []byte{}, err
}
data = downloadedData.Bytes()
return data, nil
}
通过 az login
登录我希望 azidentity.NewDefaultAzureCredential(nil)
使用此 session/cerdentials(请参阅 https://docs.microsoft.com/en-us/azure/developer/go/azure-sdk-authentication?tabs=bash#-option-3-sign-in-with-azure-cli),但是这似乎并没有像预期的那样工作。我得到的错误如下:
===== RESPONSE ERROR (ErrorCode=AuthorizationPermissionMismatch) =====
Description=This request is not authorized to perform this operation using this permission.
RequestId:b078ec61-xxxx-xxxx-xxxx-604682000000
Time:2022-05-05T10:24:18.8093649Z, Details: (none)
exit status 255
我错过了什么?
(我有 AWS 背景,所以我很可能会根据这种经验假设事情应该如何运作。)
显然,与 blob 的交互不适用于 azidentity.NewDefaultAzureCredential()
提供的凭据。 Azure 需要 SAS 令牌或共享密钥才能使用 blob。下面是一个示例函数,可用于获取特定 blob 的客户端:
func getBlobClient(account, container, object string) (*azblob.BlockBlobClient, error) {
accountKey, ok := os.LookupEnv("AZURE_STORAGE_ACCOUNT_KEY")
if !ok {
return nil, errors.New("AZURE_STORAGE_ACCOUNT_KEY could not be found")
}
credential, err := azblob.NewSharedKeyCredential(account, accountKey)
if err != nil {
return nil, err
}
accountPath := fmt.Sprintf("https://%s.blob.core.windows.net/", account)
serviceClient, err := azblob.NewServiceClientWithSharedKey(accountPath, credential, nil)
if err != nil {
return nil, err
}
containerClient, err := serviceClient.NewContainerClient(container)
if err != nil {
return nil, err
}
blobClient, err := containerClient.NewBlockBlobClient(object)
if err != nil {
return nil, err
}
return blobClient, nil
}
这使用 AZURE_STORAGE_ACCOUNT_KEY
环境变量作为凭据。
可以找到的示例比较混乱(并且可能是错误的),这里打开一个问题:
https://github.com/Azure-Samples/storage-blobs-go-quickstart/issues/7
我正在尝试通过官方 azure-sdk-for-go
.
为了设置我的开发环境,我已经通过 az login
成功登录。我已验证可以通过 CLI 访问该 blob:
az storage blob download --container-name [container-name] --name [blob-name] --account-name [storage-account-name] -f out.txt
这按预期工作。为了获取文件 unsing go 我正在使用以下代码片段(作为复制者):
func getBlob(account, container, object string) ([]byte, error) {
blobPath := fmt.Sprintf("https://%s.blob.core.windows.net/%s/%s", uri.Host, container, object)
ctx := context.Background()
credential, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
return []byte{}, err
}
blobClient, err := azblob.NewBlockBlobClient(blobPath, credential, nil)
if err != nil {
return []byte{}, err
}
get, err := blobClient.Download(ctx, nil)
if err != nil {
return []byte{}, err
}
downloadedData := &bytes.Buffer{}
reader := get.Body(&azblob.RetryReaderOptions{})
_, err = downloadedData.ReadFrom(reader)
if err != nil {
return []byte{}, err
}
err = reader.Close()
if err != nil {
return []byte{}, err
}
data = downloadedData.Bytes()
return data, nil
}
通过 az login
登录我希望 azidentity.NewDefaultAzureCredential(nil)
使用此 session/cerdentials(请参阅 https://docs.microsoft.com/en-us/azure/developer/go/azure-sdk-authentication?tabs=bash#-option-3-sign-in-with-azure-cli),但是这似乎并没有像预期的那样工作。我得到的错误如下:
===== RESPONSE ERROR (ErrorCode=AuthorizationPermissionMismatch) =====
Description=This request is not authorized to perform this operation using this permission.
RequestId:b078ec61-xxxx-xxxx-xxxx-604682000000
Time:2022-05-05T10:24:18.8093649Z, Details: (none)
exit status 255
我错过了什么?
(我有 AWS 背景,所以我很可能会根据这种经验假设事情应该如何运作。)
显然,与 blob 的交互不适用于 azidentity.NewDefaultAzureCredential()
提供的凭据。 Azure 需要 SAS 令牌或共享密钥才能使用 blob。下面是一个示例函数,可用于获取特定 blob 的客户端:
func getBlobClient(account, container, object string) (*azblob.BlockBlobClient, error) {
accountKey, ok := os.LookupEnv("AZURE_STORAGE_ACCOUNT_KEY")
if !ok {
return nil, errors.New("AZURE_STORAGE_ACCOUNT_KEY could not be found")
}
credential, err := azblob.NewSharedKeyCredential(account, accountKey)
if err != nil {
return nil, err
}
accountPath := fmt.Sprintf("https://%s.blob.core.windows.net/", account)
serviceClient, err := azblob.NewServiceClientWithSharedKey(accountPath, credential, nil)
if err != nil {
return nil, err
}
containerClient, err := serviceClient.NewContainerClient(container)
if err != nil {
return nil, err
}
blobClient, err := containerClient.NewBlockBlobClient(object)
if err != nil {
return nil, err
}
return blobClient, nil
}
这使用 AZURE_STORAGE_ACCOUNT_KEY
环境变量作为凭据。
可以找到的示例比较混乱(并且可能是错误的),这里打开一个问题:
https://github.com/Azure-Samples/storage-blobs-go-quickstart/issues/7