Självstudie: Automatisera Azure Device Provisioning Service med GitHub Actions

Använd automatiseringsverktyg som GitHub Actions för att hantera IoT-enhetens livscykel. Den här självstudien visar ett GitHub Actions-arbetsflöde som ansluter en enhet till en IoT-hubb med hjälp av Azure Device Provisioning Service (DPS).

I den här tutorialen lär du dig följande:

  • Spara autentiseringsuppgifter som repository-hemligheter.
  • Skapa ett arbetsflöde för att etablera IoT Hub- och Device Provisioning Service-resurser.
  • Kör arbetsflödet och övervaka en simulerad enhet när den ansluter till IoT Hub.

Förutsättningar

  • En prenumeration på Azure

    Om du inte har en Azure-prenumeration, skapa ett gratis konto innan du börjar.

  • Azure-kommandoradsgränssnittet (CLI)

    • Använd Bash-miljön i Azure Cloud Shell.

    • Om du föredrar att köra CLI-referenskommandon lokalt installerar du Azure CLI. Om du kör i Windows eller macOS kan du överväga att köra Azure CLI i en Docker-container.

      • Om du använder en lokal installation loggar du in på Azure CLI med hjälp av kommandot az login.

      • Kör az version för att ta reda på versionen och de beroende bibliotek som är installerade. Om du vill uppgradera till den senaste versionen kör du az upgrade.

  • Ett GitHub-konto med antingen en lagringsplats som du äger eller en lagringsplats där du har administratörsåtkomst. Mer information finns i Kom igång med GitHub.

1 – Skapa lagringsplatshemligheter

Arbetsflödet som du definierar i nästa avsnitt kräver åtkomst till din Azure-prenumeration för att skapa och hantera resurser. Du vill inte placera informationen i en oskyddad fil där den kan identifieras, så i stället använder vi lagringsplatshemligheter för att lagra den här informationen, men gör den fortfarande tillgänglig som en miljövariabel i arbetsflödet. Mer information finns i Använda hemligheter i GitHub Actions.

Endast lagringsplatsägare och administratörer kan hantera lagringsplatshemligheter.

Skapa ett huvudnamn för tjänsten

I stället för att ange dina personliga åtkomstautentiseringsuppgifter skapar vi ett huvudnamn för tjänsten och lägger sedan till dessa autentiseringsuppgifter som lagringsplatshemligheter. Använd Azure CLI för att skapa ett nytt huvudnamn för tjänsten. Mer information finns i Skapa ett Huvudnamn för Azure-tjänsten med Azure CLI.

  1. Använd kommandot az ad sp create-for-rbac för att skapa ett tjänsthuvud med medverkande åtkomst till en specifik resursgrupp. Ersätt <SUBSCRIPTION_ID> och <RESOURCE_GROUP_NAME> med din egen information.

    Det här kommandot kräver rollerna ägare eller användaråtkomstadministratör i prenumerationen.

    az ad sp create-for-rbac --name github-actions-sp --role contributor --scopes /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP_NAME>
    
  2. Kopiera följande objekt från utdata från kommandot för att skapa tjänstens huvudnamn som ska användas i nästa avsnitt:

    • ClientId.
    • ClientSecret. Det här värdet är ett genererat lösenord för tjänstens huvudnamn som du inte kan komma åt igen.
    • TenantId.
  3. Använd kommandot az role assignment create för att tilldela ytterligare två åtkomstroller till tjänstens huvudnamn: Device Provisioning Service Data Contributor och IoT Hub Data Contributor. Ersätt <SP_CLIENT_ID> med värdet clientId som du kopierade från föregående kommandos utdata.

    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>"
    

Spara autentiseringsuppgifter för tjänsthuvudkonto som hemligheter

  1. GitHub.com navigerar du till inställningarna för lagringsplatsen.

  2. Välj Hemligheter på navigeringsmenyn och välj sedan Åtgärder.

  3. Välj Ny lagringsplatshemlighet.

  4. Skapa en hemlighet för tjänstehuvudansvariges ID.

    • Namn: APP_ID
    • Hemlighet: Klistra in det clientId som du kopierade från utdata från kommandot för att skapa tjänstens huvudnamn.
  5. Välj Lägg till hemlighet och välj sedan Ny lagringsplatshemlighet för att lägga till en andra hemlighet.

  6. Skapa ett säkert lösenord för ditt service principal.

    • Namn: SECRET
    • Hemlighet: Klistra in klienthemligheten som du kopierade från utdata från kommandot för att skapa tjänsthuvudman.
  7. Välj Lägg till hemlighet och välj sedan Ny lagringsplatshemlighet för att lägga till den slutliga hemligheten.

  8. Skapa en sekretessuppgift för din Azure-klientorganisation.

    • Namn: TENANT
    • Hemlighet: Klistra in det tenantId som du kopierade från utdata från kommandot för att skapa tjänstens huvudnamn.
  9. Välj Lägg till hemlighet.

2 – Skapa ett arbetsflöde

Ett GitHub Actions-arbetsflöde definierar de uppgifter som körs när en händelse utlöser arbetsflödet. Ett arbetsflöde innehåller ett eller flera jobb som kan köras parallellt eller sekventiellt. Mer information finns i Förstå GitHub Actions.

I den här självstudien skapar vi ett arbetsflöde som innehåller jobb för var och en av följande uppgifter:

  • Etablera en IoT Hub-instans och en DPS-instans.
  • Länka IoT Hub- och DPS-instanserna till varandra.
  • Skapa en enskild registrering på DPS-instansen och registrera en enhet till IoT-hubben med hjälp av symmetrisk nyckelautentisering via DPS-registreringen.
  • Simulera enheten i fem minuter och övervaka IoT Hub-händelserna.

Arbetsflöden är YAML-filer som finns i katalogen för .github/workflows/ en lagringsplats.

  1. Gå till fliken Åtgärder på GitHub-lagringsplatsen.

  2. I fönstret Åtgärder väljer du Nytt arbetsflöde.

  3. sidan Välj ett arbetsflöde kan du välja fördefinierade mallar att använda. Vi ska skapa ett eget arbetsflöde för den här självstudien, så välj Konfigurera ett arbetsflöde själv.

  4. GitHub skapar en ny arbetsflödesfil åt dig. Observera att den finns i .github/workflows/ katalogen. Ge den nya filen ett beskrivande namn, till exempel dps-tutorial.yml.

  5. Lägg till namnparametern för att ge arbetsflödet ett namn.

    name: DPS Tutorial
    
  6. Lägg till parametern on.workflow_dispatch . Parametern on definierar när ett arbetsflöde körs. Parametern workflow_dispatch anger att vi vill utlösa arbetsflödet manuellt. Med den här parametern kan vi definiera inputs som skickas till arbetsflödet vid varje köromgång, men vi använder inte inputs för den här handledningen.

    on: workflow_dispatch
    
  7. Definiera miljövariablerna för de resurser som du skapar i arbetsflödet. Dessa variabler är tillgängliga för alla jobb i arbetsflödet. Du kan också definiera miljövariabler för enskilda jobb eller för enskilda steg i jobb.

    Ersätt platshållarvärdena med dina egna värden. Se till att du anger samma resursgrupp som tjänstehögsätet har åtkomst till.

    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. Definiera miljövariabler för hemligheterna som du skapade i föregående avsnitt.

      SP_USER: ${{ secrets.APP_ID }}
      SP_SECRET: ${{ secrets.SECRET }}
      SP_TENANT: ${{ secrets.TENANT }}
    
  9. Lägg till jobbparametern i arbetsflödesfilen.

    jobs:
    
  10. Definiera det första jobbet för vårt arbetsflöde, som vi kallar provision-jobbet. Det här jobbet etablerar IoT Hub- och DPS-instanserna:

      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"
    

    Mer information om kommandona som körs i det här jobbet finns i:

  11. Definiera ett jobb för configure DPS- och IoT Hub-instanserna. Observera att det här jobbet använder parametern needs vilket innebär att configure jobbet inte körs förrän det angivna jobbet har slutfört sin körning.

      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"   
    

    Mer information om kommandona som körs i det här jobbet finns i:

  12. Definiera ett jobb med namnet register som skapar en enskild registrering och sedan använda den registreringen för att registrera en enhet till IoT Hub.

      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   
    

    Anmärkning

    Det här jobbet och andra använder parametern --auth-type login i vissa kommandon för att ange att åtgärden ska använda tjänstens huvudnamn från den aktuella Microsoft Entra-sessionen. Alternativet kräver --auth-type key inte konfigurationen av tjänstens huvudnamn, men är mindre säker.

    Mer information om kommandona som körs i det här jobbet finns i:

  13. Definiera ett jobb till simulate en IoT-enhet som ansluter till IoT-hubben och skickar exempeltelemetrimeddelanden.

      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"
    

    Mer information om kommandona som körs i det här jobbet finns i:

  14. Definiera ett jobb till monitor IoT Hub-slutpunkten för händelser och titta på meddelanden som kommer in från den simulerade enheten. Observera att både simulera- och övervakningsjobben definierar registerjobbet i parametern .needs Den här konfigurationen innebär att när registerjobbet har slutförts körs båda dessa jobb parallellt.

      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   
    

    Mer information om kommandona som körs i det här jobbet finns i:

  15. Den fullständiga arbetsflödesfilen bör se ut så här, med din information som ersätter platshållarvärdena i miljövariablerna:

    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. Spara, checka in och skicka den här nya filen till din GitHub-lagringsplats.

3 – Kör arbetsflödet

  1. Gå till fliken Åtgärder på din GitHub-lagringsplats.

  2. I fönstret Åtgärder väljer du DPS-självstudie, vilket är det namn som vi definierade i arbetsflödesfilen och väljer sedan listrutan Kör arbetsflöde .

    Skärmbild av åtgärdsfliken där du kan välja ett arbetsflöde och köra det.

  3. Ändra grenen om du har skapat arbetsflödet i en annan gren än main och välj sedan Kör arbetsflöde.

  4. En ny arbetsflödeskörning har startat och pågår. Välj namnet för att visa detaljer om körningen.

  5. I arbetsflödessammanfattningen kan du se när varje jobb börjar och slutförs. Välj valfritt jobbnamn för att visa dess information. Det simulerade enhetsjobbet körs i fem minuter och skickar telemetri till IoT Hub. Under den här tiden väljer du det simulerade jobbet för att se meddelanden som skickas från enheten och övervakningsjobbet för att se de meddelanden som tas emot av IoT Hub.

  6. När alla jobb har slutförts bör du se gröna bockmarkeringar bredvid varje jobb.

    Skärmbild av ett arbetsflöde som har slutförts.

Rensa resurser

Om du inte kommer att fortsätta att använda de här resurserna som skapats i den här självstudien tar du bort dem med följande steg.

Använd Azure CLI:

  1. Visa en lista över resurserna i resursgruppen.

    az resource list --resource-group <RESOURCE_GROUP_NAME>
    
  2. Om du vill ta bort enskilda resurser använder du resurs-ID:t.

    az resource delete --resource-group <RESOURCE_GROUP_NAME> --ids <RESOURCE_ID>
    
  3. Om du vill ta bort hela resursgruppen och alla resurser i den kör du följande kommando:

    az group delete --resource-group <RESOURCE_GROUP_NAME>
    

Använd Azure-portalen:

  1. I Azure-portalen går du till resursgruppen där du skapade de nya resurserna.
  2. Du kan antingen ta bort hela resursgruppen eller välja de enskilda resurser som du vill ta bort och sedan välja Ta bort.

Nästa steg

Lär dig hur du etablerar DPS-instanser med andra automatiseringsverktyg.