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 öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:

  • Kimlik doğrulama kimlik bilgilerini depo gizli dizileri 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

  • Bir Azure aboneliği

    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 gizli dizileri oluşturma

Sonraki bölümde tanımlayacağınız iş akışı, kaynakları oluşturmak ve yönetmek için Azure aboneliğinize erişim gerektirir. Bu bilgileri bulunabileceği korumasız bir dosyaya koymak istemezsiniz, bu nedenle bu bilgileri depolamak için depo gizli dizilerini kullanacağız ancak yine de iş akışında ortam değişkeni olarak erişilebilir hale getireceğiz. Daha fazla bilgi için bkz . Şifrelenmiş gizli diziler.

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

Hizmet sorumlusu oluşturma

Kişisel erişim kimlik bilgilerinizi sağlamak yerine bir hizmet sorumlusu oluşturup bu kimlik bilgilerini depo gizli dizileri olarak ekleyeceğiz. Yeni bir hizmet sorumlusu oluşturmak için Azure CLI'yi kullanın. Daha fazla bilgi için bkz . Azure hizmet sorumlusu oluşturma.

  1. Belirli bir kaynak grubuna katkıda bulunan erişimi olan bir hizmet sorumlusu oluşturmak için az ad sp create-for-rbac komutunu kullanın. ve <RESOURCE_GROUP_NAME> öğesini kendi bilgilerinizle değiştirin<SUBSCRIPTION_ID>.

    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, hizmet sorumlusu için oluşturulan ve yeniden erişemeyeceğiniz 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 clientId değeriyle değiştirin<SP_CLIENT_ID>.

    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 dizi olarak kaydetme

  1. GitHub.com deponuzun Ayarlar gidin.

  2. Gezinti menüsünden Gizli Diziler'i ve ardından Eylemler'i seçin.

  3. Yeni depo gizli dizisi'ni seçin.

  4. Hizmet sorumlusu kimliğiniz için bir gizli dizi oluşturun.

    • Ad: APP_ID
    • Gizli dizi: Hizmet sorumlusu oluşturma komutunun çıkışından kopyaladığınız clientId değerini 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 dizi oluşturun.

    • Ad: SECRET
    • Gizli dizi: Hizmet sorumlusu oluşturma komutunun çıkışından kopyaladığınız clientSecret öğesini yapıştırın.
  7. Gizli dizi ekle'yi ve ardından Son gizli diziyi eklemek için Yeni depo gizli dizisi'ni seçin.

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

    • Ad: TENANT
    • Gizli dizi: Hizmet sorumlusu oluşturma komutunun çıkışından kopyaladığınız tenantId değerini yapıştırın.
  9. Add secret (Gizli dizi ekle) öğesini seçin.

2 - İş akışı oluşturma

GitHub Actions iş akışı , bir olay tarafından tetiklendiğinde çalıştırılacak 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şturacağız:

  • IoT Hub örneği ve DPS örneği sağlama.
  • 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ışını oluşturacağız, bu nedenle İş akışını kendiniz ayarla'yı seçin.

  4. GitHub sizin için yeni bir iş akışı dosyası oluşturur. Dizininde .github/workflows/ 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. parametresi, on bir iş akışının ne zaman çalıştırılacağı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 bunları bu öğretici için kullanmayacağız.

    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 tarafından 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. İşi çağıracağımız provision iş akışımız için ilk işi tanımlayın. Bu iş IoT Hub ve DPS örneklerini sağlar:

      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 bir iş tanımlayın. Bu işin needs parametresini kullandığına dikkat edin. Bu, listelenen iş kendi çalıştırmasını başarıyla tamamlayana kadar işin çalıştırmayacağı anlamına gelirconfigure.

      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. Tek bir kayıt oluşturacak adlı register bir iş tanımlayın ve ardından cihazı IoT Hub'a kaydetmek için bu kaydı kullanı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   
    

    Not

    Bu iş ve diğerleri, işlemin geçerli Microsoft Entra oturumundaki hizmet sorumlusunu kullanması gerektiğini belirtmek için bazı komutlarda parametresini --auth-type login kullanır. Alternatif olarak hizmet --auth-type key sorumlusu yapılandırması gerekmez, 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ğlanacak ve örnek telemetri iletileri gönderecek 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. Sanal ve izleme işlerinin her ikisinin de kendi parametresinde needs yazmaç işini tanımladığına dikkat edin. Bu yapılandırma, yazmaç işi başarıyla tamamlandıktan sonra her iki işin de paralel olarak çalıştırılacağı 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.

    Screenshot of the action tab where you can select a workflow and run it.

  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ıştırması görüntülenir. Çalıştırmanın 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.

    Screenshot of a successfully completed workflow.

Kaynakları temizleme

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ı 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.