共用方式為


快速入門:使用 Azure SDK for Go 從範本部署 Azure 虛擬機

本快速入門說明如何使用 Azure SDK for Go,從 Azure Resource Manager 範本部署資源。 範本是 Azure 資源群組所有資源的快照集。 一路上,您將熟悉 SDK 的功能和慣例。

在本快速入門結束時,您有一個以使用者名稱和密碼登入的執行中 VM。

注意

若要查看在 Go 中建立 VM 而不使用 Resource Manager 範本,有一個 命令式範例 示範如何使用 SDK 建置和設定所有 VM 資源。 在此範例中使用範本可讓您專注於 SDK 慣例,而不需要取得太多有關 Azure 服務架構的詳細數據。

如果您沒有 Azure 訂用帳戶,請在開始之前建立 免費帳戶

啟動 Azure Cloud Shell

Azure Cloud Shell 是在 Azure 上執行的互動式殼層。 其已預安裝並設定為搭配您的帳戶使用通用工具。 選取 [複製 ] 以複製程序代碼,將它貼到 Cloud Shell,然後按 Enter 鍵以執行程式碼。

有幾種方式可以啟動 Cloud Shell:

選取程式代碼區塊右上角的 [試用]。

Cloud Shell in this article

在瀏覽器中開啟 Cloud Shell。

https://shell.azure.com/bash

選取 Azure 入口網站 右上方功能表中的 Cloud Shell 按鈕。

Cloud Shell in the portal

如果您使用 Azure CLI 的本機安裝,本快速入門需要 CLI 2.0.28 版或更新版本。 執行 az --version 以確定您的 CLI 安裝符合此需求。 如果您需要安裝或升級,請參閱安裝 Azure CLI 模組

安裝 Azure SDK for Go

Azure SDK for Go 與 Go 1.8 版和更新版本相容。 對於使用 Azure Stack 配置文件的環境,Go 1.9 版是最低需求。 如果您需要安裝 Go,請遵循 Go 安裝指示

您可以透過 go get下載 Azure SDK for Go 及其相依性。

go get -u -d github.com/Azure/azure-sdk-for-go/...

警告

請確定您在 URL 中大寫 Azure 。 否則,在使用 SDK 時,可能會導致與案例相關的匯入問題。 您也需要在匯入語句中大寫 Azure

建立服務主體

若要使用應用程式以非互動方式登入 Azure,您需要服務主體。 服務主體是角色型訪問控制 (RBAC) 的一部分,它會建立唯一的使用者身分識別。 若要使用 CLI 建立新的服務主體,請執行下列命令:

az ad sp create-for-rbac --role Contributor \
    --scopes /subscriptions/<subscription_id> \
    --sdk-auth > quickstart.auth

將環境變數 AZURE_AUTH_LOCATION 設定為此檔案的完整路徑。 然後,SDK 會直接從這個檔案找出並讀取認證,而不需要從服務主體進行任何變更或記錄資訊。

取得程式碼

使用取得快速入門程序代碼及其所有相依性 go get

go get -u -d github.com/Azure-Samples/azure-sdk-for-go-samples/quickstarts/deploy-vm/...

如果已正確設定變數, AZURE_AUTH_LOCATION 則不需要進行任何原始程式碼修改。 當程式執行時,它會從該處載入所有必要的驗證資訊。

執行程序代碼

使用 go run 命令執行快速入門。

cd $GOPATH/src/github.com/Azure-Samples/azure-sdk-for-go-samples/quickstarts/deploy-vm
go run main.go

如果部署成功,您會看到一則訊息,提供用戶名稱、IP 位址和密碼,以登入新建立的虛擬機。 透過 SSH 連線到這部電腦,以查看電腦是否已啟動並執行。

清除

使用 CLI 刪除資源群組,以清除在本快速入門期間建立的資源。

az group delete -n GoVMQuickstart

同時刪除已建立的服務主體。 在 檔案中quickstart.auth,有 JSON 金鑰。clientId 將此值複製到環境變數, CLIENT_ID_VALUE 然後執行下列 Azure CLI 命令:

az ad sp delete --id ${CLIENT_ID_VALUE}

其中您提供 CLIENT_ID_VALUE 的值來自 quickstart.auth

警告

無法刪除此應用程式的服務主體,使其在 Microsoft Entra 租使用者中處於作用中狀態。 雖然服務主體的名稱和密碼都會產生為 UUID,但請刪除任何未使用的服務主體和 Microsoft Entra Applications,確定您遵循良好的安全性做法。

深入程序代碼

快速入門程序代碼的功能分成一組變數和數個小型函式,其中每一個函式都會在這裡討論。

變數、常數和類型

由於快速入門是獨立式,因此會使用全域常數和變數。

const (
    resourceGroupName     = "GoVMQuickstart"
    resourceGroupLocation = "eastus"

    deploymentName = "VMDeployQuickstart"
    templateFile   = "vm-quickstart-template.json"
    parametersFile = "vm-quickstart-params.json"
)

// Information loaded from the authorization file to identify the client
type clientInfo struct {
    SubscriptionID string
    VMPassword     string
}

var (
    ctx        = context.Background()
    clientData clientInfo
    authorizer autorest.Authorizer
)

會宣告值,以提供所建立資源的名稱。 這裡也會指定位置,您可以變更此位置,以查看部署在其他數據中心的運作方式。 並非所有數據中心都有所有可用的必要資源。

clientInfo 類型會保存從驗證檔案載入的資訊,以在 SDK 中設定用戶端,並設定 VM 密碼。

templateFileparametersFile 常數會指向部署所需的檔案。 將由 authorizer Go SDK 設定以進行驗證,而 ctx 變數是 網路作業的 Go 內容

驗證和初始化

init 式會設定驗證。 由於驗證是快速入門中所有專案的先決條件,因此在初始化時,將它作為初始化的一部分是合理的。 它也會從驗證檔案載入一些所需的資訊,以設定用戶端和 VM。

func init() {
    var err error
    authorizer, err = auth.NewAuthorizerFromFile(azure.PublicCloud.ResourceManagerEndpoint)
    if err != nil {
        log.Fatalf("Failed to get OAuth config: %v", err)
    }

    authInfo, err := readJSON(os.Getenv("AZURE_AUTH_LOCATION"))
    clientData.SubscriptionID = (*authInfo)["subscriptionId"].(string)
    clientData.VMPassword = (*authInfo)["clientSecret"].(string)
}

首先, 驗證。呼叫 NewAuthorizerFromFile ,以從位於 AZURE_AUTH_LOCATION的檔案載入驗證資訊。 接下來,此檔案會由 readJSON 函式手動載入(在此省略),以提取執行程式其餘部分所需的兩個值:客戶端的訂用帳戶標識元,以及服務主體的密碼,這也適用於 VM 的密碼。

警告

為了保持快速入門簡單,會重複使用服務主體密碼。 在生產環境中,請小心 不要 重複使用可存取 Azure 資源的密碼。

main() 中的作業流程

main 式很簡單,只會指出作業流程並執行錯誤檢查。

func main() {
    group, err := createGroup()
    if err != nil {
        log.Fatalf("failed to create group: %v", err)
    }
    log.Printf("Created group: %v", *group.Name)

    log.Printf("Starting deployment: %s", deploymentName)
    result, err := createDeployment()
    if err != nil {
        log.Fatalf("Failed to deploy: %v", err)
    }
    if result.Name != nil {
        log.Printf("Completed deployment %v: %v", deploymentName, *result.Properties.ProvisioningState)
    } else {
        log.Printf("Completed deployment %v (no data returned to SDK)", deploymentName)
    }
    getLogin()
}

程式代碼執行的步驟如下:

  • 建立要部署至的資源群組(createGroup
  • 在這裡群組內建立部署 (createDeployment
  • 取得並顯示已部署 VM 的登入資訊 (getLogin

建立資源群組

createGroup 式會建立資源群組。 查看呼叫流程和自變數會示範服務互動在 SDK 中結構化的方式。

func createGroup() (group resources.Group, err error) {
    groupsClient := resources.NewGroupsClient(clientData.SubscriptionID)
    groupsClient.Authorizer = authorizer

        return groupsClient.CreateOrUpdate(
                ctx,
                resourceGroupName,
                resources.Group{
                        Location: to.StringPtr(resourceGroupLocation)})
}

與 Azure 服務互動的一般流程如下:

  • 使用 service.New*Client() 方法建立用戶端,其中 * 是您想要與其互動之 service 的資源類型。 此函式一律會採用訂用帳戶標識碼。
  • 設定客戶端的授權方法,讓它能夠與遠端 API 互動。
  • 在對應至遠端 API 的用戶端上呼叫 方法。 服務用戶端方法通常會取得資源名稱和元數據物件的名稱。

to.StringPtr 式是用來在這裡執行類型轉換。 SDK 方法的參數幾乎完全採用指標,因此會提供方便的方法,讓類型轉換變得簡單。 如需便利轉換器及其行為的完整清單,請參閱 autorest/to 模組的檔

方法 groupsClient.CreateOrUpdate 會傳回代表資源群組之數據類型的指標。 這類的直接傳回值表示短期執行作業,其目的為同步。 在下一節中,您會看到長時間執行的作業範例,以及如何與其互動。

執行部署

建立資源群組之後,是時候執行部署了。 此程式代碼分成較小的區段,以強調其邏輯的不同部分。

func createDeployment() (deployment resources.DeploymentExtended, err error) {
    template, err := readJSON(templateFile)
    if err != nil {
        return
    }
    params, err := readJSON(parametersFile)
    if err != nil {
        return
    }
    (*params)["vm_password"] = map[string]string{
        "value": clientData.VMPassword,
    }
        // ...

部署檔案會由 載入 readJSON,此處會略過其詳細數據。 此函式會傳 *map[string]interface{}回 ,此類型用於建構資源部署呼叫的元數據。 VM 的密碼也會在部署參數上手動設定。

        // ...

    deploymentsClient := resources.NewDeploymentsClient(clientData.SubscriptionID)
    deploymentsClient.Authorizer = authorizer

    deploymentFuture, err := deploymentsClient.CreateOrUpdate(
        ctx,
        resourceGroupName,
        deploymentName,
        resources.Deployment{
            Properties: &resources.DeploymentProperties{
                Template:   template,
                Parameters: params,
                Mode:       resources.Incremental,
            },
        },
    )
    if err != nil {
        return
    }

此程式代碼遵循與建立資源群組相同的模式。 建立新的客戶端,因為能夠向 Azure 進行驗證,然後呼叫 方法。 方法甚至具有相同的名稱 (CreateOrUpdate) 與資源群組的對應方法。 整個 SDK 都會看到此模式。 執行類似工作的方法通常具有相同的名稱。

方法的 deploymentsClient.CreateOrUpdate 傳回值最大的差異。 此值屬於 Future 類型,其遵循 未來的設計模式。 Futures 代表 Azure 中長時間執行的作業,您可以在完成時輪詢、取消或封鎖。

        //...
    err = deploymentFuture.Future.WaitForCompletion(ctx, deploymentsClient.BaseClient.Client)
    if err != nil {
        return
    }
    return deploymentFuture.Result(deploymentsClient)
}

在此範例中,最好的作法是等候作業完成。 等候未來需要 內容物件 和建立的 Future用戶端。 這裡有兩個可能的錯誤來源:嘗試叫用 方法時,用戶端上所造成的錯誤,以及來自伺服器的錯誤回應。 後者會當做呼叫的 deploymentFuture.Result 一部分傳回。

取得指派的IP位址

若要對新建立的 VM 執行任何動作,您需要指派的 IP 位址。 IP 位址是各自獨立的 Azure 資源,系結至網路介面控制器 (NIC) 資源。

func getLogin() {
    params, err := readJSON(parametersFile)
    if err != nil {
        log.Fatalf("Unable to read parameters. Get login information with `az network public-ip list -g %s", resourceGroupName)
    }

    addressClient := network.NewPublicIPAddressesClient(clientData.SubscriptionID)
    addressClient.Authorizer = authorizer
    ipName := (*params)["publicIPAddresses_QuickstartVM_ip_name"].(map[string]interface{})
    ipAddress, err := addressClient.Get(ctx, resourceGroupName, ipName["value"].(string), "")
    if err != nil {
        log.Fatalf("Unable to get IP information. Try using `az network public-ip list -g %s", resourceGroupName)
    }

    vmUser := (*params)["vm_user"].(map[string]interface{})

    log.Printf("Log in with ssh: %s@%s, password: %s",
        vmUser["value"].(string),
        *ipAddress.PublicIPAddressPropertiesFormat.IPAddress,
        clientData.VMPassword)
}

此方法依賴儲存在參數檔案中的資訊。 程式代碼可以直接查詢 VM 以取得其 NIC、查詢 NIC 以取得其 IP 資源,然後直接查詢 IP 資源。 這是要解決的長鏈相依性和作業,因此成本高昂。 因為 JSON 資訊是本機的,所以可以改為載入。

VM 使用者的值也會從 JSON 載入。 先前已從驗證檔案載入 VM 密碼。

下一步

在本快速入門中,您已取得現有的範本,並透過 Go 加以部署。 然後,您透過 SSH 連線到新建立的 VM。

若要繼續瞭解如何使用 Go 在 Azure 環境中使用虛擬機,請參閱適用於 Go 的 Azure 計算範例或適用於 Go 的 Azure 資源管理範例。

若要深入瞭解 SDK 中可用的驗證方法,以及其支援的驗證類型,請參閱 使用 Azure SDK for Go 進行驗證。