Mulai cepat: Menyebarkan komputer virtual Azure dari templat dengan SDK Azure untuk Go

Mulai cepat ini menunjukkan kepada Anda cara menyebarkan sumber daya dari templat Azure Resource Manager, menggunakan SDK Azure untuk Go. Templat adalah snapshot dari semua sumber daya dalam grup sumber daya Azure. Sepanjang jalan, Anda akan terbiasa dengan fungsi dan konvensi SDK.

Di akhir mulai cepat ini, Anda memiliki VM yang sedang berjalan yang Anda masuki dengan nama pengguna dan kata sandi.

Catatan

Untuk melihat pembuatan VM di Go tanpa menggunakan templat Resource Manager, ada sampel penting yang menunjukkan cara membangun dan mengonfigurasi semua sumber daya VM dengan SDK. Menggunakan templat dalam sampel ini memungkinkan fokus pada konvensi SDK tanpa terlalu banyak detail tentang arsitektur layanan Azure.

Jika Anda tidak memiliki langganan Azure, buatlah akun gratis sebelum Anda memulai.

Meluncurkan Azure Cloud Shell

Azure Cloud Shell adalah shell interaktif yang berjalan di Azure. Shell tersebut memiliki alat umum yang diinstal sebelumnya dan dikonfigurasi untuk digunakan dengan akun Anda. Pilih Salin untuk menyalin blok kode, tempelkan ke Cloud Shell, lalu tekan enter untuk menjalankannya.

Ada beberapa cara untuk membuka Cloud Shell:

Pilih Coba di pojok kanan atas blok kode.

Cloud Shell in this article

Buka Cloud Shell di browser Anda.

https://shell.azure.com/bash

Pilih tombol Cloud Shell pada menu pada bagian kanan atas di Portal Azure.

Cloud Shell in the portal

Jika Anda menggunakan penginstalan lokal Azure CLI, mulai cepat ini memerlukan versi CLI 2.0.28 atau yang lebih baru. Jalankan az --version untuk memastikan penginstalan CLI Anda memenuhi persyaratan ini. Jika Anda perlu memasang atau meningkatkan, Pasang Azure CLI.

Menginstal SDK Azure untuk Go

SDK Azure untuk Go kompatibel dengan Go versi 1.8 dan yang lebih tinggi. Untuk lingkungan yang menggunakan Profil Azure Stack, Go versi 1.9 adalah persyaratan minimum. Jika Anda perlu menginstal Go, ikuti petunjuk penginstalan Go.

Anda dapat mengunduh SDK Azure untuk Go dan dependensinya melalui go get.

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

Peringatan

Pastikan Anda menggunakan huruf besar untuk Azure di URL. Bila tidak dapat menyebabkan masalah impor terkait-jenis huruf saat bekerja dengan SDK. Azure juga perlu menggunakan huruf besar di pernyataan impor Anda.

Membuat perwakilan layanan

Untuk masuk secara non-interaktif ke Azure dengan aplikasi, Anda memerlukan perwakilan layanan. Perwakilan layanan adalah bagian dari kontrol akses berbasis peran (RBAC), yang menciptakan identitas pengguna yang unik. Untuk membuat perwakilan layanan baru dengan CLI, jalankan perintah berikut:

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

Atur variabel lingkungan AZURE_AUTH_LOCATION menjadi jalur penuh ke file ini. Kemudian, SDK menempatkan dan membaca info masuk langsung dari file ini, tanpa Anda harus membuat perubahan atau merekam informasi dari perwakilan layanan.

Mendapatkan kode

Dapatkan kode mulai cepat dan semua dependensinya dengan go get.

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

Anda tidak perlu membuat modifikasi kode sumber jika variabel AZURE_AUTH_LOCATION diatur dengan benar. Saat program berjalan, itu memuat semua informasi autentikasi yang diperlukan dari sana.

Menjalankan kode

Jalankan mulai cepat dengan perintah go run.

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

Jika penyebaran berhasil, Anda melihat pesan yang memberikan nama pengguna, alamat IP, dan kata sandi untuk masuk ke mesin virtual yang baru dibuat. SSH ke dalam mesin ini untuk melihat apakah sudah aktif dan berjalan.

Membersihkan

Hapus sumber daya yang dibuat selama mulai cepat ini dengan menghapus grup sumber daya dengan CLI.

az group delete -n GoVMQuickstart

Hapus juga perwakilan layanan yang dibuat. Di file quickstart.auth, ada kunci JSON untuk clientId. Salin nilai ini ke variabel lingkungan CLIENT_ID_VALUE dan jalankan perintah Azure CLI berikut:

az ad sp delete --id ${CLIENT_ID_VALUE}

Tempat Anda memberikan nilai untuk CLIENT_ID_VALUE dari quickstart.auth.

Peringatan

Gagal menghapus perwakilan layanan untuk aplikasi ini membuatnya aktif di penyewa Microsoft Entra Anda. Meskipun nama dan kata sandi untuk perwakilan layanan dihasilkan sebagai UUID, pastikan Anda mengikuti praktik keamanan yang baik dengan menghapus perwakilan layanan yang tidak digunakan dan Aplikasi Microsoft Entra.

Kode secara mendalam

Apa yang dilakukan kode mulai cepat dipecah menjadi blok variabel dan beberapa fungsi kecil, yang masing-masing dibahas di sini.

Variabel, konstanta, dan jenis

Karena mulai cepat mandiri, ia menggunakan konstanta dan variabel global.

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
)

Nilai dideklarasikan yang memberikan nama sumber daya yang dibuat. Lokasi juga ditentukan di sini, yang dapat Anda ubah untuk melihat cara penerapan berperilaku di pusat data lainnya. Tidak setiap pusat data memiliki semua sumber daya yang diperlukan yang tersedia.

Jenis clientInfo ini menyimpan informasi yang dimuat dari file autentikasi untuk menyiapkan klien di SDK dan mengatur kata sandi VM.

Konstanta templateFile dan parametersFile mengarah ke file yang diperlukan untuk penyebaran. authorizer akan dikonfigurasi oleh Go SDK untuk autentikasi, dan variabel ctx adalah konteks Go untuk operasi jaringan.

Autentikasi dan inisialisasi

Fungsi init menyiapkan autentikasi. Karena autentikasi adalah prasyarat untuk segala sesuatu dalam mulai cepat, masuk akal untuk memilikinya sebagai bagian dari inisialisasi. Ini juga memuat beberapa informasi yang diperlukan dari file autentikasi untuk mengonfigurasi klien dan 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)
}

Pertama-tama, auth.NewAuthorizerFromFile dipanggil untuk memuat informasi autentikasi dari file yang terletak di AZURE_AUTH_LOCATION. Selanjutnya, file ini dimuat secara manual oleh fungsi readJSON (dihilangkan di sini) untuk menarik dua nilai yang diperlukan untuk menjalankan sisa program: ID berlangganan klien, dan rahasia perwakilan layanan, yang juga digunakan untuk kata sandi VM.

Peringatan

Agar mulai cepat tetap sederhana, kata sandi perwakilan layanan digunakan kembali. Dalam produksi, berhati-hatilah untuk tidak pernah menggunakan kembali kata sandi yang memberikan akses ke sumber daya Azure Anda.

Alur operasi di main()

Fungsi main bersifat sederhana, hanya menunjukkan alur operasi dan melakukan pengecekan kesalahan.

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()
}

Langkah-langkah yang dijalankan kode adalah, secara berurutan:

  • Membuat grup sumber daya untuk disebarkan ke (createGroup)
  • Membuat penyebaran dalam grup ini (createDeployment)
  • Dapatkan dan tampilkan informasi login untuk VM yang disebarkan (getLogin)

Membuat grup sumber daya

Fungsi createGroup membuat grup sumber daya. Melihat alur panggilan dan argumen menunjukkan cara interaksi layanan terstruktur di 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)})
}

Alur umum berinteraksi dengan layanan Azure adalah:

  • Buat klien menggunakan metode service.New*Client(), dengan * adalah jenis sumber daya service yang Anda ajak berinteraksi. Fungsi ini selalu mengambil ID berlangganan.
  • Atur metode otorisasi untuk klien, memungkinkannya berinteraksi dengan API jarak jauh.
  • Buat panggilan metode pada klien yang sesuai dengan API jarak jauh. Metode klien layanan biasanya mengambil nama sumber daya dan objek metadata.

Fungsi to.StringPtr digunakan untuk melakukan konversi tipe di sini. Parameter untuk metode SDK hampir secara eksklusif mengambil petunjuk, sehingga metode kenyamanan disediakan untuk memudahkan konversi jenis. Lihat dokumentasi untuk modul autorest/to untuk daftar lengkap konverter kenyamanan dan perilakunya.

Metode groupsClient.CreateOrUpdate mengembalikan penunjuk ke tipe data yang mewakili grup sumber daya. Nilai pengembalian langsung semacam ini menunjukkan operasi jangka pendek yang dimaksudkan untuk menjadi sinkron. Di bagian berikutnya, Anda akan melihat contoh operasi yang sudah berjalan lama dan cara berinteraksi dengannya.

Melakukan penyebaran

Setelah grup sumber daya dibuat, saatnya untuk menjalankan penyebaran. Kode ini dipecah menjadi bagian yang lebih kecil untuk menekankan berbagai bagian logikanya.

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,
    }
        // ...

File penyebaran dimuat oleh readJSON, detailnya dilewati di sini. Fungsi ini mengembalikan *map[string]interface{}, jenis yang digunakan dalam membangun metadata untuk panggilan penyebaran sumber daya. Kata sandi VM juga diatur secara manual pada parameter penyebaran.

        // ...

    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
    }

Kode ini mengikuti pola yang sama dengan membuat grup sumber daya. Klien baru dibuat, mengingat kemampuan untuk mengautentikasi dengan Azure, dan kemudian metode dipanggil. Metode ini bahkan memiliki nama yang sama (CreateOrUpdate) sebagai metode yang sesuai untuk grup sumber daya. Pola ini terlihat di seluruh SDK. Metode yang melakukan pekerjaan serupa biasanya memiliki nama yang sama.

Perbedaan terbesar datang dalam nilai pengembalian metode deploymentsClient.CreateOrUpdate. Nilai ini adalah tipe Masa Depan, yang mengikuti pola desain masa depan. Masa depan mewakili operasi yang sudah berjalan lama di Azure yang dapat Anda jajak pendapat, batalkan, atau blokir setelah selesai.

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

Untuk contoh ini, hal terbaik yang harus dilakukan adalah menunggu operasi selesai. Menunggu masa depan membutuhkan objek konteks dan klien yang membuat Future. Ada dua kemungkinan sumber kesalahan di sini: Kesalahan yang disebabkan di sisi klien ketika mencoba memanggil metode, dan respons kesalahan dari server. Yang terakhir dikembalikan sebagai bagian dari panggilan deploymentFuture.Result.

Mendapatkan alamat IP yang ditetapkan

Untuk melakukan apa saja dengan VM yang baru dibuat, Anda memerlukan alamat IP yang ditetapkan. Alamat IP adalah sumber daya Azure terpisah mereka sendiri, terikat pada sumber daya Network Interface Controller (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)
}

Metode ini bergantung pada informasi yang disimpan dalam file parameter. Kode dapat meminta VM secara langsung untuk mendapatkan NIC-nya, meminta NIC untuk mendapatkan sumber daya IP-nya, dan kemudian meminta sumber daya IP secara langsung. Itu adalah rantai panjang ketergantungan dan operasi untuk diselesaikan, membuatnya mahal. Karena informasi JSON bersifat lokal, informasi tersebut dapat dimuat sebagai gantinya.

Nilai untuk pengguna VM juga dimuat dari JSON. Kata sandi VM dimuat lebih awal dari file autentikasi.

Langkah berikutnya

Dalam mulai cepat ini, Anda mengambil templat yang ada dan menyebarkannya melalui Go. Kemudian, Anda terhubung ke VM yang baru dibuat melalui SSH.

Untuk terus mempelajari tentang bekerja dengan mesin virtual di lingkungan Azure dengan Go, lihat sampel komputasi Azure untuk Go atau sampel manajemen sumber daya Go atau Azure untuk Go.

Untuk mempelajari lebih lanjut tentang metode autentikasi yang tersedia di SDK, dan jenis autentikasi mana yang mereka dukung, lihat Autentikasi dengan Azure SDK untuk Go.