Share via


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 in this article

Cloud Shell’i tarayıcınızda açın.

https://shell.azure.com/bash

Azure portalının sağ üst kısmındaki menüden Cloud Shell düğmesini seçin.

Cloud Shell in the portal

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ğiniz service öğ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.