如何从 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