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.
Buka Cloud Shell di browser Anda.
Pilih tombol Cloud Shell pada menu pada bagian kanan atas di Portal Azure.
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 dayaservice
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.
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk