Hızlı başlangıç: Go için Azure SDK ile bir şablondan Azure sanal makinesi dağıtma
Bu hızlı başlangıçta Go için Azure SDK'yı kullanarak Azure Resource Manager şablonundan kaynak dağıtma adımları gösterilmektedir. Şablonlar, bir Azure kaynak grubu içindeki tüm kaynakların anlık görüntüleridir. İlerledikçe SDK’nın işlevlerini ve kurallarını öğreneceksiniz.
Bu hızlı başlangıcın sonunda, bir kullanıcı adı ve parola ile oturum açtığınız çalışan bir sanal makineniz olacaktır.
Dekont
Go içinde Resource Manager şablonu kullanılmadan VM oluşturma adımlarını görmek için SDK ile VM kaynağı oluşturma ve yapılandırma süreçlerini gösteren bu kesinlik temelli örneği inceleyin. Bu örnekte şablon kullanılmasının nedeni, Azure hizmet mimarisinin ayrıntılarına fazla girmeden SDK kurallarına odaklanmaktır.
Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.
Azure Cloud Shell'i başlatma
Azure Cloud Shell, Azure'da çalışan etkileşimli bir kabuktur. Yaygın araçlar, kabuğa önceden yüklenmiş ve hesabınızla birlikte kullanılacak şekilde yapılandırılmıştır. Kodu kopyalamak için Kopyala'yı seçin, Cloud Shell'e yapıştırın ve çalıştırmak için Enter tuşuna basın.
Cloud Shell’i başlatmanın birkaç yolu vardır:
Kod bloğunun sağ üst köşesindeki Deneyin'i seçin.
Cloud Shell’i tarayıcınızda açın.
Azure portalının sağ üst kısmındaki menüden Cloud Shell düğmesini seçin.
Azure CLI’nın yerel bir yüklemesini kullanıyorsanız bu hızlı başlangıç, 2.0.28 veya sonraki CLI sürümlerini gerektirir. CLI yüklemenizin bu gereksinimi karşıladığından emin olmak için az --version
çalıştırın. Yükleme veya yükseltme yapmanız gerekirse bkz. Azure CLI'yı yükleme.
Go için Azure SDK’yı yükleme
Go için Azure SDK, Go 1.8 ve sonraki sürümlerle uyumludur. Azure Stack Profilleri kullanan ortamlar için en az Go 1.9 sürümü gerekir. Go'yu yüklemeniz gerekiyorsa Go yükleme yönergelerini izleyin.
Go için Azure SDK ve bağımlılıklarını go get
üzerinden indirebilirsiniz.
go get -u -d github.com/Azure/azure-sdk-for-go/...
Uyarı
URL’de Azure
kısmını büyük harfle yazdığınızdan emin olun. Aksi takdirde bu, SDK ile çalışırken büyük/küçük harfle ilgili içeri aktarma sorunlarına neden olabilir. İçeri aktarma deyimlerinizde de Azure
kısmını büyük harfle yazmanız gerekir.
Hizmet sorumlusu oluşturma
Bir uygulama ile Azure’da etkileşimli olmadan oturum açmak için hizmet sorumlusu gerekir. Hizmet sorumluları, benzersiz bir kullanıcı kimliği oluşturan rol tabanlı erişim denetiminin (RBAC) parçasıdır. CLI ile yeni bir hizmet sorumlusu oluşturmak için aşağıdaki komutu çalıştırın:
az ad sp create-for-rbac --role Contributor \
--scopes /subscriptions/<subscription_id> \
--sdk-auth > quickstart.auth
AZURE_AUTH_LOCATION
ortam değişkenini bu dosyaya giden tam yol olacak şekilde ayarlayın. Daha sonra hizmet sorumlusundan herhangi bir değişiklik yapmanıza veya bilgi kaydetmenize gerek kalmadan SDK kimlik bilgilerini bulur ve doğrudan bu dosyadan okur.
Kodu alma
go get
ile hızlı başlangıç kodunu ve tüm bağımlılıklarını edinin.
go get -u -d github.com/Azure-Samples/azure-sdk-for-go-samples/quickstarts/deploy-vm/...
AZURE_AUTH_LOCATION
değişkeni düzgün şekilde ayarlanmışsa kaynak kodunda herhangi bir değişiklik yapmanız gerekmez. Program çalıştığında, gerekli olan tüm kimlik doğrulama bilgilerini buradan yükler.
Kodu çalıştırma
go run
komutu ile hızlı başlangıcı çalıştırın.
cd $GOPATH/src/github.com/Azure-Samples/azure-sdk-for-go-samples/quickstarts/deploy-vm
go run main.go
Dağıtım başarılı olursa yeni oluşturulan sanal makinede oturum açmak için kullanıcı adını, IP adresini ve parolayı sunan bir ileti görürsünüz. Makineye SSH ile bağlanarak çalışır durumda olduğundan emin olun.
Temizleme
CLI ile kaynak grubunu silerek bu hızlı başlangıç sırasında oluşturulan kaynakları temizleyin.
az group delete -n GoVMQuickstart
Ayrıca oluşturulmuşsa hizmet sorumlusunu silin. quickstart.auth
dosyasında clientId
için bir JSON anahtarı bulunur. Bu değeri CLIENT_ID_VALUE
ortam değişkenine kopyalayın ve aşağıdaki Azure CLI komutunu çalıştırın:
az ad sp delete --id ${CLIENT_ID_VALUE}
Burada quickstart.auth
ile alınan CLIENT_ID_VALUE
değerini belirtmeniz gerekir.
Uyarı
Bu uygulama için hizmet sorumlusu silinemediğinde, Microsoft Entra kiracınızda etkin kalır. Hizmet sorumlusunun hem adı hem de parolası UUID olarak oluşturulurken, kullanılmayan hizmet sorumlularını ve Microsoft Entra Uygulamalarını silerek iyi güvenlik uygulamalarını izlediğinize emin olun.
Kod ayrıntıları
Hızlı başlangıç kodunun yaptığı işlem bir değişken öbeğine ve birçok küçük işleve ayrılmış ve her biri burada incelenmiştir.
Değişkenler, sabitler ve türler
Hızlı başlangıç kendi içinde olduğundan, genel sabitleri ve değişkenleri kullanır.
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
)
Oluşturulan kaynakların adlarını veren değerler bildirilir. Burada konum da belirtilir; dağıtımların diğer veri merkezlerinde nasıl davrandığını görmek için konumu değiştirebilirsiniz. Her veri merkezinde tüm gerekli kaynaklar mevcut değildir.
clientInfo
türü, SDK’da istemcileri ve VM parolasını ayarlamak üzere kimlik doğrulama dosyasından yüklenen bilgileri barındırır.
templateFile
ve parametersFile
sabitleri, dağıtım için gerekli dosyaları işaret eder. authorizer
değişkeni kimlik doğrulaması için Go SDK’sı tarafından yapılandırılır ve ctx
değişkeni ise ağ işlemleri için bir Go bağlamıdır.
Kimlik doğrulama ve başlatma
init
işlevi kimlik doğrulamayı ayarlar. Yetkilendirme, hızlı başlangıçtaki her şey için önkoşul olduğundan, başlatmanın parçası olması mantıklıdır. Ayrıca istemcileri ve VM’yi yapılandırmak için kimlik doğrulama dosyasından gerekli olan bazı bilgileri yükler.
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)
}
İlk olarak, AZURE_AUTH_LOCATION
konumunda bulunan dosyadan kimlik doğrulama bilgilerini yüklemek için auth.NewAuthorizerFromFile çağrılır. Ardından dosya readJSON
işlevi tarafından el ile yüklenerek (burada göz ardı edilir), programın geri kalanını çalıştırmak için gereken iki değerin çekilmesi sağlanır: İstemcinin abonelik kimliği ve VM’nin parolası için de kullanılan hizmet sorumlusunun gizli dizisi.
Uyarı
Hızlı başlangıcı basit tutmak için hizmet sorumlusu parolası yeniden kullanılır. Üretimdeyken Azure kaynaklarınıza erişim sağlayan bir parolayı asla yeniden kullanmamaya dikkat edin.
main() içindeki işlem akışı
main
işlevi basittir, yalnızca işlem akışını belirtir ve hata denetimi gerçekleştirir.
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()
}
Kodun çalıştırılma adımları sırayla şöyledir:
- (
createGroup
) hedefine dağıtılacak kaynak grubunu oluşturma - Bu grup (
createDeployment
) içinde dağıtımı oluşturma - Dağıtılan VM (
getLogin
) için oturum açma bilgilerini alma ve görüntüleme
Bir kaynak grubu oluştur
createGroup
işlevi, kaynak grubunu oluşturur. Çağrı akışına ve bağımsız değişkenlere bakılarak, SDK’da hizmet etkileşimlerinin yapılandırılma şekli görülebilir.
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)})
}
Bir Azure hizmetiyle etkileşim kurmanın genel akışı şöyledir:
service.New*Client()
yöntemini kullanarak istemciyi oluşturun; burada*
, etkileşim kurmak istediğinizservice
öğesinin kaynak türüdür. Bu işlev her zaman bir abonelik kimliği alır.- İstemci için yetkilendirme yöntemini ayarlayarak istemcinin uzak API ile etkileşim kurmasını sağlayın.
- Yöntem çağrısını uzak API’ye karşılık gelen istemcide yapın. Hizmet istemcisi yöntemleri genellikle kaynağın adını ve bir meta veri nesnesini alır.
to.StringPtr
işlevi burada bir tür dönüştürmesi gerçekleştirmek için kullanılır. SDK’nın yöntemleri için parametre yapıları hemen her zaman işaretçiler aldığından, bu yöntemler tür dönüştürmelerini kolaylaştırmak için sağlanır. Kolaylık dönüştürücülerinin tam listesi ve davranışları için autorest/to modülüne ilişkin belgelere bakın.
groupsClient.CreateOrUpdate
yöntemi, kaynak grubunu temsil eden bir veri türüne işaretçiyi döndürür. Bu tür bir doğrudan dönüş değeri, zaman uyumlu olacak şekilde tasarlanmış kısa süreli bir işlemi belirtir. Sonraki bölümde, uzun süreli bir işlem örneğini ve bunlarla nasıl etkileşim kurulacağını göreceksiniz.
Dağıtımı gerçekleştirme
Kaynak grubu oluşturulduktan sonra sıra dağıtımı çalıştırmaya gelir. Bu kod, mantığının farklı kısımlarını vurgulamak için daha küçük bölümlere ayrılmıştır.
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,
}
// ...
Dağıtım dosyaları readJSON
tarafından yüklenir; bunun ayrıntıları burada atlanmıştır. Bu işlev, kaynak dağıtım çağrısı için meta verilerin oluşturulmasında kullanılan *map[string]interface{}
türünü döndürür. VM’nin parolası ayrıca dağıtım parametrelerinde el ile ayarlanmıştır.
// ...
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
}
Bu kod, kaynak grubunun oluşturulmasıyla aynı deseni izler. Azure kimlik doğrulaması sayesinde yeni bir istemci oluşturulur ve sonra bir yöntem çağrılır.
Yöntemin adı (CreateOrUpdate
) bile kaynak grupları için karşılık gelen yöntemin adıyla aynıdır. Bu desen SDK boyunca görülür.
Benzer işi gerçekleştiren yöntemler normalde aynı ada sahiptir.
En büyük fark, deploymentsClient.CreateOrUpdate
yönteminin dönüş değerindedir. Bu değer, vadeli işlem tasarım desenini izleyen bir Vadeli işlem türüdür. Vadeli işlemler, tamamlanması üzerine yoklama yapabileceğiniz, iptal edeceğiniz veya engelleyebileceğiniz Azure’daki uzun süreli bir işlemi temsil eder.
//...
err = deploymentFuture.Future.WaitForCompletion(ctx, deploymentsClient.BaseClient.Client)
if err != nil {
return
}
return deploymentFuture.Result(deploymentsClient)
}
Bu örnek için yapılacak en iyi şey, işlemin tamamlanmasını beklemektir. Vadeli işlemin beklenmesi için hem bir bağlam nesnesi hem de Future
nesnesini oluşturan istemci gerekir. Burada iki olası hata kaynağı vardır: Yöntem çağrılmaya çalışılırken istemci tarafında bir hataya yol açılmıştır ve sunucudan bir hata yanıtı alınmıştır. İkinci durum, deploymentFuture.Result
çağrısının parçası olarak döndürülür.
Atanan IP adresini alma
Yeni oluşturulan VM ile herhangi bir şey yapmak için atanan IP adresi gerekir. IP adresleri, Ağ Arabirim Denetleyicisi (NIC) kaynaklarına bağlı olan kendi ayrı Azure kaynaklarıdır.
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)
}
Bu yöntem, parametreler dosyasında depolanan bilgileri kullanır. Bu kod, NIC’sini almak için doğrudan VM’yi sorgulayabilir, IP kaynağını almak için NIC’yi sorgulayabilir ve sonra doğrudan IP kaynağını sorgulayabilir. Çözümlenecek uzun bir bağımlılıklar ve işlemler zincirinin olması, bunu pahalı kılar. JSON bilgileri yerel olduğundan, bunun yerine yüklenebilir.
VM kullanıcısının değeri de ayrıca JSON’dan yüklenir. VM parolası, kimlik doğrulama dosyasından önceden yüklendi.
Sonraki adımlar
Bu hızlı başlangıçta, mevcut bir şablonu alıp Go aracılığıyla dağıttınız. Sonra, yeni oluşturulan sanal makineye SSH aracılığıyla bağlandınız.
Go ile Azure ortamında sanal makinelerle çalışma hakkında bilgi edinmeye devam etmek için Go için Azure bilgi işlem örnekleri veya Go için Azure kaynak yönetimi örnekleri bölümüne bakın.
SDK’daki kullanılabilir kimlik doğrulama yöntemleri ve destekledikleri kimlik doğrulama türleri hakkında daha fazla bilgi edinmek için bkz. Go için Azure SDK ile kimlik doğrulama.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin