Aracılığıyla paylaş


Öğretici: GitHub Actions ile Azure Cihaz Sağlama Hizmeti'ni otomatikleştirme

IoT cihaz yaşam döngünüzü yönetmek için GitHub Actions gibi otomasyon araçlarını kullanın. Bu öğreticide, Azure Cihaz Sağlama Hizmeti'ni (DPS) kullanarak bir cihazı IoT hub'ına bağlayan bir GitHub Actions iş akışı gösterilmektedir.

Bu eğitimde şunları öğreniyorsunuz:

  • Kimlik doğrulama kimlik bilgilerini depo sırları olarak kaydedin.
  • IoT Hub ve Cihaz Sağlama Hizmeti kaynaklarını sağlamak için bir iş akışı oluşturun.
  • İş akışını çalıştırın ve IoT Hub'a bağlanırken simülasyon cihazını izleyin.

Önkoşullar

  • Azure aboneliği

    Eğer bir Azure aboneliğiniz yoksa, başlamadan önce ücretsiz bir hesap oluşturun.

  • Azure CLI

  • Sahip olduğunuz depoya veya yönetici erişimine sahip olduğunuz depoya sahip bir GitHub hesabı. Daha fazla bilgi için bkz. GitHub'ı kullanmaya başlama.

1 - Depo (repository) gizli anahtarlar oluşturma

Sonraki bölümde tanımladığınız iş akışı, kaynakları oluşturmak ve yönetmek için Azure aboneliğinize erişim gerektirir. Bu bilgileri bulunabilecek korumasız bir dosyaya koymak istemezsiniz, bu nedenle bu bilgileri depolamak için depo gizli dizilerini kullanırız ancak yine de iş akışında ortam değişkeni olarak erişilebilir hale getiririz. Daha fazla bilgi için bkz. GitHub Actions'ta gizli bilgileri kullanma.

Yalnızca depo sahipleri ve yöneticileri depo gizli bilgilerini yönetebilir.

Hizmet sorumlusu oluşturma

Kişisel erişim kimlik bilgilerinizi sağlamak yerine, bir hizmet ilkesi oluşturur ve bu kimlik bilgilerini depo gizli bilgileri olarak ekleriz. Yeni bir hizmet sorumlusu oluşturmak için Azure CLI'yi kullanın. Daha fazla bilgi için bkz . Azure CLI ile Azure hizmet sorumlusu oluşturma.

  1. Bir hizmet asıl kimliği oluşturmak için az ad sp create-for-rbac komutunu kullanarak belirli bir kaynak grubuna katkıda bulunan erişim sağlayın. ve <SUBSCRIPTION_ID> öğesini kendi bilgilerinizle değiştirin<RESOURCE_GROUP_NAME>.

    Bu komut, abonelikte sahip veya kullanıcı erişim yöneticisi rolleri gerektirir.

    az ad sp create-for-rbac --name github-actions-sp --role contributor --scopes /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP_NAME>
    
  2. Sonraki bölümde kullanmak üzere hizmet sorumlusu oluşturma komutunun çıktısından aşağıdaki öğeleri kopyalayın:

    • clientId.
    • clientSecret. Bu değer, yeniden erişemediğiniz hizmet sorumlusu için oluşturulan bir paroladır.
    • TenantId.
  3. Hizmet sorumlusuna iki erişim rolü daha atamak için az role assignment create komutunu kullanın: Cihaz Sağlama Hizmeti Veri Katkıda Bulunanı ve IoT Hub Veri Katkıda Bulunanı. değerini, önceki komutun çıkışından kopyaladığınız <SP_CLIENT_ID> değeriyle değiştirin.

    az role assignment create --assignee "<SP_CLIENT_ID>" --role "Device Provisioning Service Data Contributor" --resource-group "<RESOURCE_GROUP_NAME>"
    
    az role assignment create --assignee "<SP_CLIENT_ID>" --role "IoT Hub Data Contributor" --resource-group "<RESOURCE_GROUP_NAME>"
    

Hizmet sorumlusu kimlik bilgilerini gizli olarak kaydetme

  1. GitHub.com'da deponuzun Ayarlar bölümüne gidin.

  2. Gezinme menüsünden Gizli ve ardından Eylemler seçeneğini seçin.

  3. Yeni depo gizli anahtarını seçin.

  4. Hizmet ilkesi kimliğiniz için bir gizli anahtar oluşturun.

    • İsim: APP_ID
    • Gizli: Hizmet sorumlusu oluşturma komutunun çıktısından kopyaladığınız clientId'yi yapıştırın.
  5. Gizli dizi ekle'yi ve ardından yeni depo gizli dizisi'ni seçerek ikinci bir gizli dizi ekleyin.

  6. Hizmet sorumlusu parolanız için bir gizli anahtar oluşturun.

    • İsim: SECRET
    • Gizli: Hizmet sorumlusu oluşturma komutunun çıktısından kopyaladığınız clientSecret'i yapıştırın.
  7. Gizli ekle'yi seçin, ardından son sırrı eklemek için Yeni depo sırrı seçin.

  8. Azure kiracınız için bir gizli anahtar oluşturun.

    • İsim: TENANT
    • Gizli: Hizmet sorumlusu oluşturma komutunun çıktısından kopyaladığınız tenantId değerini yapıştırın.
  9. Add secret öğesini seçin.

2 - İş akışı oluşturma

GitHub Actions iş akışı, bir olay iş akışını tetikledikten sonra çalışan görevleri tanımlar. İş akışı, paralel veya sıralı olarak çalışabilen bir veya daha fazla içerir. Daha fazla bilgi için bkz. GitHub Actions'ı anlama.

Bu öğreticide, aşağıdaki görevlerin her biri için işleri içeren bir iş akışı oluştururuz:

  • IoT Hub örneği ve DPS örneği oluşturun.
  • IoT Hub ve DPS örneklerini birbirine bağlayın.
  • DPS örneğinde tek bir kayıt oluşturun ve DPS kaydı aracılığıyla simetrik anahtar kimlik doğrulamasını kullanarak cihazı IoT hub'ına kaydedin.
  • Cihazın simülasyonunu beş dakika boyunca yapın ve IoT hub olaylarını izleyin.

İş akışları, bir deponun .github/workflows/ dizininde bulunan YAML dosyalarıdır.

  1. GitHub deponuzda Eylemler sekmesine gidin.

  2. Eylemler bölmesinde Yeni iş akışı'nı seçin.

  3. İş akışı seçin sayfasında, kullanılacak önceden oluşturulmuş şablonları seçebilirsiniz. Bu öğretici için kendi iş akışımızı oluşturacağız, bu nedenle Kendiniz iş akışını ayarlayın'ı seçin.

  4. GitHub sizin için yeni bir iş akışı dosyası oluşturur. .github/workflows/ dizininde olduğuna dikkat edin. Yeni dosyaya gibi dps-tutorial.ymlanlamlı bir ad verin.

  5. İş akışınıza bir ad vermek için name parametresini ekleyin.

    name: DPS Tutorial
    
  6. on.workflow_dispatch parametresini ekleyin. on parametresi, bir iş akışının ne zaman çalıştığını tanımlar. parametresi, workflow_dispatch iş akışını el ile tetiklemek istediğimizi gösterir. Bu parametreyle, her çalıştırmada iş akışına geçirilecek bir parametre tanımlayabiliriz inputs , ancak bu öğreticide kullanmayız inputs .

    on: workflow_dispatch
    
  7. İş akışında oluşturduğunuz kaynakların ortam değişkenlerini tanımlayın. Bu değişkenler iş akışındaki tüm işler için kullanılabilir. Ayrıca, tek tek işler için veya işler içindeki tek tek adımlar için ortam değişkenleri tanımlayabilirsiniz.

    Yer tutucu değerlerini kendi değerlerinizle değiştirin. Hizmet sorumlusunun erişimi olan kaynak grubunu belirttiğinizden emin olun.

    env:
      HUB_NAME: <Globally unique IoT hub name>
      DPS_NAME: <Desired Device Provisioning Service name>
      DEVICE_NAME: <Desired device name>
      RESOURCE_GROUP: <Solution resource group where resources will be created>
    
  8. Önceki bölümde oluşturduğunuz gizli diziler için ortam değişkenlerini tanımlayın.

      SP_USER: ${{ secrets.APP_ID }}
      SP_SECRET: ${{ secrets.SECRET }}
      SP_TENANT: ${{ secrets.TENANT }}
    
  9. jobs parametresini iş akışı dosyasına ekleyin.

    jobs:
    
  10. İş akışımız için provision işi olarak adlandırdığımız ilk işi tanımlayın. Bu görev IoT Hub ve DPS örneklerini hazırlar.

      provision:
        runs-on: ubuntu-latest
        steps:
          - name: Provision Infra
            run: |
              az --version
              az login --service-principal -u "$SP_USER" -p "$SP_SECRET" --tenant "$SP_TENANT"
              az iot hub create -n "$HUB_NAME" -g "$RESOURCE_GROUP"
              az iot dps create -n "$DPS_NAME" -g "$RESOURCE_GROUP"
    

    Bu işte çalıştırılacak komutlar hakkında daha fazla bilgi için bkz:

  11. DPS ve IoT Hub örneklerine configure yönelik bir iş tanımlayın. Bu işin needs parametresini kullandığına dikkat edin, bu da listelenen iş kendi çalışmasını başarıyla tamamlayana kadar configure işin çalışmayacağı anlamına gelir.

      configure:
        runs-on: ubuntu-latest
        needs: provision
        steps:
          - name: Configure Infra
            run: |
              az login --service-principal -u "$SP_USER" -p "$SP_SECRET" --tenant "$SP_TENANT"
              az iot dps linked-hub create --dps-name "$DPS_NAME" --hub-name "$HUB_NAME"   
    

    Bu işte çalıştırılacak komutlar hakkında daha fazla bilgi için bkz:

  12. register adlı, tek bir kayıt oluşturan ve bu kaydı cihazı IoT Hub'a kaydetmek için kullanan bir iş tanımlayın.

      register:
        runs-on: ubuntu-latest
        needs: configure
        steps:
          - name: Create enrollment
            run: |
              az login --service-principal -u "$SP_USER" -p "$SP_SECRET" --tenant "$SP_TENANT"
              az extension add --name azure-iot
              az iot dps enrollment create -n "$DPS_NAME" --eid "$DEVICE_NAME" --attestation-type symmetrickey --auth-type login
          - name: Register device
            run: |
              az iot device registration create -n "$DPS_NAME" --rid "$DEVICE_NAME" --auth-type login   
    

    Uyarı

    Bu iş ve diğer işler, işlemin geçerli Microsoft Entra oturumundaki hizmet sorumlusunu kullanması gerektiğini belirtmek için bazı komutlarda --auth-type login parametresini kullanır. Alternatifi --auth-type key, hizmet sorumlusu yapılandırması gerektirmez, ancak daha az güvenlidir.

    Bu işte çalıştırılacak komutlar hakkında daha fazla bilgi için bkz:

  13. IoT hub'ına simulate bağlanan ve örnek telemetri iletileri gönderen bir IoT cihazına iş tanımlayın.

      simulate:
        runs-on: ubuntu-latest
        needs: register
        steps:
          - name: Simulate device
            run: |
              az login --service-principal -u "$SP_USER" -p "$SP_SECRET" --tenant "$SP_TENANT"
              az extension add --name azure-iot
              az iot device simulate -n "$HUB_NAME" -d "$DEVICE_NAME"
    

    Bu işte çalıştırılacak komutlar hakkında daha fazla bilgi için bkz:

  14. Olaylar için IoT hub uç noktasına bir iş monitor tanımlayın ve simülasyon cihazından gelen iletileri izleyin. Simülasyon ve izleme işlerinin her ikisinin de kendi parametresinde kayıt işini tanımladığına dikkat edin. Bu yapılandırma, kayıt işi başarıyla tamamlandıktan sonra her iki işin de paralel olarak çalıştığı anlamına gelir.

      monitor:
        runs-on: ubuntu-latest
        needs: register
        steps:
          - name: Monitor d2c telemetry
            run: |
              az login --service-principal -u "$SP_USER" -p "$SP_SECRET" --tenant "$SP_TENANT"
              az extension add --name azure-iot
              az iot hub monitor-events -n "$HUB_NAME" -y   
    

    Bu işte çalıştırılacak komutlar hakkında daha fazla bilgi için bkz:

  15. İş akışı dosyasının tamamı aşağıdaki örnekteki gibi görünmelidir ve bilgileriniz ortam değişkenlerindeki yer tutucu değerlerin yerini almalıdır:

    name: DPS Tutorial
    
    on: workflow_dispatch
    
    env:
      HUB_NAME: <Globally unique IoT hub name>
      DPS_NAME: <Desired Device Provisioning Service name>
      DEVICE_NAME: <Desired device name>
      RESOURCE_GROUP: <Solution resource group where resources will be created>
      SP_USER: ${{ secrets.APP_ID }}
      SP_SECRET: ${{ secrets.SECRET }}
      SP_TENANT: ${{ secrets.TENANT }}
    
    jobs:
      provision:
        runs-on: ubuntu-latest
        steps:
          - name: Provision Infra
            run: |
              az --version
              az login --service-principal -u "$SP_USER" -p "$SP_SECRET" --tenant "$SP_TENANT"
              az iot hub create -n "$HUB_NAME" -g "$RESOURCE_GROUP"
              az iot dps create -n "$DPS_NAME" -g "$RESOURCE_GROUP"
      configure:
        runs-on: ubuntu-latest
        needs: provision
        steps:
          - name: Configure Infra
            run: |
              az login --service-principal -u "$SP_USER" -p "$SP_SECRET" --tenant "$SP_TENANT"
              az iot dps linked-hub create --dps-name "$DPS_NAME" --hub-name "$HUB_NAME"
      register:
        runs-on: ubuntu-latest
        needs: configure
        steps:
          - name: Create enrollment
            run: |
              az login --service-principal -u "$SP_USER" -p "$SP_SECRET" --tenant "$SP_TENANT"
              az extension add --name azure-iot
              az iot dps enrollment create -n "$DPS_NAME" --eid "$DEVICE_NAME" --attestation-type symmetrickey --auth-type login
          - name: Register device
            run: |
              az iot device registration create -n "$DPS_NAME" --rid "$DEVICE_NAME" --auth-type login
      simulate:
        runs-on: ubuntu-latest
        needs: register
        steps:
          - name: Simulate device
            run: |
              az login --service-principal -u "$SP_USER" -p "$SP_SECRET" --tenant "$SP_TENANT"
              az extension add --name azure-iot
              az iot device simulate -n "$HUB_NAME" -d "$DEVICE_NAME"
      monitor:
        runs-on: ubuntu-latest
        needs: register
        steps:
          - name: Monitor d2c telemetry
            run: |
              az login --service-principal -u "$SP_USER" -p "$SP_SECRET" --tenant "$SP_TENANT"
              az extension add --name azure-iot
              az iot hub monitor-events -n "$HUB_NAME" -y
    
  16. Bu yeni dosyayı kaydedin, işleyin ve GitHub deponuza gönderin.

3 - İş akışını çalıştırma

  1. GitHub deponuzun Eylemler sekmesine gidin.

  2. Eylemler bölmesinde, iş akışı dosyasında tanımladığımız ad olan DPS Öğreticisi'ni seçin ve ardından İş akışı çalıştır açılan kutusunu seçin.

    bir iş akışı seçip çalıştırabileceğiniz eylem sekmesinin ekran görüntüsü.

  3. İş akışınızı main dışında bir dalda oluşturduysanız dalı değiştirin ve ardından İş akışını çalıştır'ı seçin.

  4. Devam eden yeni bir iş akışı çalışması görünür. Çalıştırma oturumunun ayrıntılarını görüntülemek için adı seçin.

  5. İş akışı özetinde, her işin başlayıp tamamlanmasını izleyebilirsiniz. Ayrıntılarını görüntülemek için herhangi bir iş adını seçin. Simülasyon cihazı işi beş dakika boyunca çalışır ve IoT Hub'a telemetri gönderir. Bu süre boyunca, cihazdan gönderilen iletileri izlemek için simülasyon işini ve IoT Hub tarafından alınan iletileri izlemek için izleme işini seçin.

  6. Tüm işler başarıyla tamamlandığında, her birinin yeşil onay işaretlerini görmeniz gerekir.

    Başarıyla tamamlanan bir iş akışının ekran görüntüsü.

Kaynakları temizle

Bu öğreticide oluşturulan bu kaynakları kullanmaya devam etmeyecekseniz, aşağıdaki adımlarla bunları silin.

Azure CLI'yi kullanın:

  1. Kaynak grubunuzdaki kaynakları listeleyin.

    az resource list --resource-group <RESOURCE_GROUP_NAME>
    
  2. Tek tek kaynakları silmek için kaynak kimliğini kullanın.

    az resource delete --resource-group <RESOURCE_GROUP_NAME> --ids <RESOURCE_ID>
    
  3. Kaynak grubunun tamamını ve içindeki tüm kaynakları silmek istiyorsanız aşağıdaki komutu çalıştırın:

    az group delete --resource-group <RESOURCE_GROUP_NAME>
    

Azure portalını kullanın:

  1. Azure portalında yeni kaynakları oluşturduğunuz kaynak grubuna gidin.
  2. Kaynak grubunun tamamını silebilir veya kaldırmak istediğiniz kaynakları tek tek seçip Sil'i seçebilirsiniz.

Sonraki Adımlar

Diğer otomasyon araçlarıyla DPS örneklerini sağlamayı öğrenin.