快速入門:適用於 Go 的 Azure Blob 儲存體用戶端程式庫

開始使用適用於 Go 的 Azure Blob 儲存體用戶端程式庫管理 Blob 和容器。 請遵循下列步驟來安裝套件,並試用基本工作的程式碼範例。

API 參考文件 | 程式庫原始程式碼 | 套件 (pkg.go.dev)

必要條件

設定

本節會引導您準備專案以搭配使用適用於 Go 的 Azure Blob 儲存體用戶端程式庫。

下載範例應用程式

本快速入門中使用的範例應用程式是基本的 Go 應用程式。

使用 git 將應用程式的複本下載至您的開發環境。

git clone https://github.com/Azure-Samples/storage-blobs-go-quickstart 

此命令會將存放庫複製到本機的 git 資料夾。 若要開啟 Blob 儲存體的 Go 範例,請尋找名為 storage-quickstart.go 的檔案。

安裝套件

若要在儲存體帳戶中使用 Blob 和容器資源,請使用下列命令安裝 azblob 套件:

go get github.com/Azure/azure-sdk-for-go/sdk/storage/azblob

若要使用 Microsoft Entra ID 進行驗證 (建議使用),請使用下列命令安裝 azidentity 模組:

go get github.com/Azure/azure-sdk-for-go/sdk/azidentity

驗證 Azure,並授權存取 Blob 資料

應用程式向 Azure Blob 儲存體提出的要求必須經過授權。 建議使用 DefaultAzureCredential 和 Azure Identity 用戶端程式庫在程式碼中實作與 Azure 服務 (包括 Blob 儲存體) 的無密碼連線。

您也可以使用帳戶存取金鑰,以授權對 Azure Blob 儲存體的要求。 不過,應該謹慎使用此方法。 開發人員必須盡可能避免在不安全的地方公開存取金鑰。 具有存取金鑰的任何人都可以授權對儲存體帳戶的要求,而且實際上可以存取所有資料。 DefaultAzureCredential 提供優於帳戶金鑰的管理和安全性優點,允許無密碼驗證。 下列範例示範這兩個選項。

DefaultAzureCredential 是由適用於 Go 的 Azure 身分識別用戶端程式庫所提供的認證鏈結實作。 DefaultAzureCredential 支援多個驗證方法,並會在執行階段確定應使用的方法。 此方法可讓您的應用程式在不同的環境中 (本機或實際執行環境) 使用不同的驗證方法,而不需要實作環境特有的程式碼。

若要深入了解 DefaultAzureCredential 尋找認證時的順序和位置,請參閱 Azure 身分識別程式庫概觀

例如,應用程式在本機開發時可以使用 Azure CLI 登入認證進行驗證。 一旦部署至 Azure,您的應用程式接著即可使用受控識別。 這種環境之間的轉換不需要任何程式碼變更。

將角色指派給 Microsoft Entra 使用者帳戶

在本機開發時,請確定存取 Blob 資料的使用者帳戶具有正確的權限。 您需要儲存體 Blob 資料參與者才能讀取和寫入 Blob 資料。 若要指派此角色給您自己,您需要被指派使用者存取管理員角色,或另一個包含 Microsoft.Authorization/roleAssignments/write 動作的角色。 您可以使用 Azure 入口網站、Azure CLI 或 Azure PowerShell,將 Azure RBAC 角色指派給使用者。 您可以在範圍概觀頁面上深入了解角色指派的可用範圍。

在此案例中,您會將權限指派給使用者帳戶 (以儲存體帳戶為範圍),以遵循最低權限原則。 此做法只為使用者提供所需的最低權限,並建立更安全的實際執行環境。

下列範例將儲存體 Blob 資料參與者角色指派給使用者帳戶,以針對儲存體帳戶中的 Blob 資料提供讀取和寫入存取權。

重要

在大部分情況下,角色指派在 Azure 中傳播只需要一兩分鐘,但在罕見情況下,可能需要長達八分鐘。 如果您第一次執行程式碼時收到驗證錯誤,請稍候片刻再試一次。

  1. 在 Azure 入口網站中,使用主要搜尋列或左側導覽找出您的儲存體帳戶。

  2. 在儲存體帳戶概觀頁面上,從左側功能表中選取 [存取控制 (IAM)]

  3. 在 [存取控制 (IAM)] 頁面上,選取 [角色指派] 索引標籤。

  4. 從頂端功能表選取 [+ 新增],然後從產生的下拉功能表中選取 [新增角色指派]

    A screenshot showing how to assign a role.

  5. 使用搜尋方塊,從結果篩選出所需的角色。 在此範例中,搜尋「儲存體 Blob 資料參與者」,選取相符的結果,然後選擇 [下一步]

  6. 在 [存取權指派對象為] 下,選取 [使用者、群組或服務主體],然後選擇 [+ 選取成員]

  7. 在對話方塊中,搜尋 Microsoft Entra 使用者名稱 (通常是您的 user@domain 電子郵件地址),然後在對話方塊底部選擇 [選取]

  8. 選取 [檢閱 + 指派] 以移至最終頁面,然後再次選取 [檢閱 + 指派] 以完成此程序。

使用 DefaultAzureCredential 登入並將應用程式程式碼連線至 Azure

您可以使用下列步驟來授權存取儲存體帳戶中的資料:

  1. 請確定使用您在 Blob 儲存體帳戶上指派角色的相同 Microsoft Entra 帳戶進行驗證。 下列範例會說明如何透過 Azure CLI 進行驗證:

    az login
    
  2. 若要在 Go 應用程式中使用 DefaultAzureCredential ,請使用下列命令安裝 azidentity 模組:

    go get github.com/Azure/azure-sdk-for-go/sdk/azidentity
    

不建議針對 Azure 中執行的應用程式使用 Azure CLI 驗證。 部署至 Azure 時,您可以使用相同的程式碼,從 Azure 中執行的應用程式授權對 Azure 儲存體的要求。 不過,您需要在 Azure 中的應用程式啟用受控識別,並將儲存體帳戶設定為允許該受控識別連線。 如需在 Azure 服務之間設定此連線的詳細指示,請參閱從 Azure 託管應用程式進行驗證教學課程。

若要深入了解不同的驗證方法,請參閱使用 Azure SDK for Go 進行 Azure 驗證

執行範例

此程式碼範例會執行下列動作:

  • 透過 DefaultAzureCredential 建立授權進行資料存取的用戶端物件
  • 在儲存體帳戶中建立容器
  • 將 Blob 上傳到容器
  • 列出容器中的 Blob
  • 將 Blob 資料下載到緩衝區中
  • 刪除應用程式所建立的 Blob 和容器資源

執行範例之前,請開啟 storage-quickstart.go 檔案。 將 <storage-account-name> 取代成您的 Azure 儲存體帳戶名稱。

接著,使用下列命令執行應用程式:

go run storage-quickstart.go

應用程式的輸出類似下列範例:

Azure Blob storage quick start sample
Creating a container named quickstart-sample-container
Uploading a blob named sample-blob
Listing the blobs in the container:
sample-blob
Blob contents:

Hello, world! This is a blob.

Press enter key to delete resources and exit the application.

Cleaning up.
Deleting the blob sample-blob
Deleting the container quickstart-sample-container

當您在提示字元按下 Enter 鍵時,範例程式會刪除應用程式所建立的 Blob 和容器資源。

提示

您也可以使用 Azure 儲存體總管 之類的工具來檢視 Blob 儲存體中的檔案。 Azure 儲存體總管是免費的跨平台工具,可讓您存取儲存體帳戶資訊。

了解範例程式碼

接下來,我們會透過範例程式碼逐步了解其運作方式。

授權存取並建立用戶端物件

使用 SDK 來處理任何 Azure 資源會從建立用戶端物件開始。 若要建立用戶端物件,程式碼範例會呼叫具有下列值的 azblob.NewClient

  • serviceURL - 儲存體帳戶的 URL
  • cred - 透過 azidentity 模組取得的 Microsoft Entra 認證
  • 選項 - 用戶端選項;傳遞 nil 以接受預設值

下列程式碼範例會建立用戶端物件,以和儲存體帳戶中的容器和 Blob 資源互動:

// TODO: replace <storage-account-name> with your actual storage account name
url := "https://<storage-account-name>.blob.core.windows.net/"
ctx := context.Background()

credential, err := azidentity.NewDefaultAzureCredential(nil)
handleError(err)

client, err := azblob.NewClient(url, credential, nil)
handleError(err)

建立容器

程式碼範例會在儲存體帳戶中建立新的容器資源。 如果已經有相同名稱的容器存在,則會引發 ResourceExistsError

重要

容器名稱必須是小寫字母。 若要深入了解容器和 Blob 的命名需求,請參閱命名和參考容器、Blob 及中繼資料

下列程式碼範例會在儲存體帳戶中建立名為 quickstart-sample-container 的新容器:

// Create the container
containerName := "quickstart-sample-container"
fmt.Printf("Creating a container named %s\n", containerName)
_, err = client.CreateContainer(ctx, containerName, nil)
handleError(err)

將 Blob 上傳到容器

程式碼範例會使用某些資料建立位元組陣列,並將資料當做緩衝區上傳至指定容器中的新 Blob 資源。

下列程式碼範例會使用 uploadBuffer 方法,將 Blob 資料上傳至指定的容器:

data := []byte("\nHello, world! This is a blob.\n")
blobName := "sample-blob"

// Upload to data to blob storage
fmt.Printf("Uploading a blob named %s\n", blobName)
_, err = client.UploadBuffer(ctx, containerName, blobName, data, &azblob.UploadBufferOptions{})
handleError(err)

列出容器中的 Blob

該程式碼範例會列出指定容器中的 Blob。 此範例會使用 NewListBlobsFlatPager,其會從指定的 Marker 開始傳回 Blob 的呼叫器。 在此,我們會使用空的 Marker 從頭開始列舉,並繼續分頁,直到沒有其他結果為止。 這個方法會以字典編纂順序傳回 Blob 名稱。

下列程式碼範例會列出指定容器中的 Blob:

// List the blobs in the container
fmt.Println("Listing the blobs in the container:")

pager := client.NewListBlobsFlatPager(containerName, &azblob.ListBlobsFlatOptions{
	Include: azblob.ListBlobsInclude{Snapshots: true, Versions: true},
})

for pager.More() {
	resp, err := pager.NextPage(context.TODO())
	handleError(err)

	for _, blob := range resp.Segment.BlobItems {
		fmt.Println(*blob.Name)
	}
}

下載 blob

程式碼範例會使用 DownloadStream 方法下載 Blob,並建立讀取資料的重試讀取器。 如果讀取時連線失敗,重試讀取器就會發出重新建立連線的其他要求,並繼續讀取。 您可以使用 RetryReaderOptions 結構來指定重試讀取器選項。

下列程式碼範例會下載 Blob,並將內容寫入主控台:

// Download the blob
get, err := client.DownloadStream(ctx, containerName, blobName, nil)
handleError(err)

downloadedData := bytes.Buffer{}
retryReader := get.NewRetryReader(ctx, &azblob.RetryReaderOptions{})
_, err = downloadedData.ReadFrom(retryReader)
handleError(err)

err = retryReader.Close()
handleError(err)

// Print the contents of the blob we created
fmt.Println("Blob contents:")
fmt.Println(downloadedData.String())

清除資源

如果不再需要本快速入門中上傳的 Blob,可以使用 DeleteBlob 方法刪除個別 Blob,或使用 DeleteContainer 方法刪除整個容器及其內容。

// Delete the blob
fmt.Printf("Deleting the blob " + blobName + "\n")

_, err = client.DeleteBlob(ctx, containerName, blobName, nil)
handleError(err)

// Delete the container
fmt.Printf("Deleting the container " + containerName + "\n")
_, err = client.DeleteContainer(ctx, containerName, nil)
handleError(err)

下一步

在本快速入門中,您已了解如何使用 Go 上傳、下載及列出 Blob。

若要查看 Blob 儲存體範例應用程式,請繼續查看: