Udostępnij za pomocą


Samouczek: automatyzowanie usługi Azure Device Provisioning Przy użyciu funkcji GitHub Actions

Użyj narzędzi automatyzacji, takich jak GitHub Actions, aby zarządzać cyklem życia urządzenia IoT. W tym samouczku przedstawiono przepływ pracy funkcji GitHub Actions, który łączy urządzenie z centrum IoT Hub przy użyciu usługi Azure Device Provisioning Service (DPS).

W tym poradniku nauczysz się, jak:

  • Zapisz poświadczenia jako sekrety repozytorium.
  • Utwórz przepływ pracy, aby aprowizować zasoby usługi IoT Hub i Device Provisioning Service.
  • Uruchom przepływ pracy i monitoruj symulowane urządzenie podczas nawiązywania połączenia z usługą IoT Hub.

Wymagania wstępne

1 - Utwórz sekrety repozytorium

Przepływ pracy zdefiniowany w następnej sekcji wymaga dostępu do subskrypcji platformy Azure w celu tworzenia zasobów i zarządzania nimi. Nie chcesz umieszczać tych informacji w niechronionym pliku, w którym można je odnaleźć, więc zamiast tego używamy tajemnic repozytorium do przechowywania tych informacji, ale nadal udostępniamy je jako zmienną środowiskową w przepływie pracy. Aby uzyskać więcej informacji, zobacz Używanie tajemnic w GitHub Actions.

Tylko właściciele i administratorzy repozytorium mogą zarządzać sekretami repozytorium.

Utwórz kierownika usługi

Zamiast podawać swoje osobiste dane dostępowe, tworzymy jednostkę usługi (ang. service principal), a następnie dodajemy te dane jako tajne wpisy w repozytorium. Aby utworzyć nową główną jednostkę usługi, użyj Azure CLI. Aby uzyskać więcej informacji, zobacz Tworzenie jednostki usługi platformy Azure przy użyciu interfejsu wiersza polecenia platformy Azure.

  1. Użyj polecenia az ad sp create-for-rbac , aby utworzyć jednostkę usługi z dostępem współautora do określonej grupy zasobów. Zastąp <SUBSCRIPTION_ID> wartości i <RESOURCE_GROUP_NAME> własnymi informacjami.

    To polecenie wymaga ról właściciela lub administratora dostępu użytkownika w subskrypcji.

    az ad sp create-for-rbac --name github-actions-sp --role contributor --scopes /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP_NAME>
    
  2. Skopiuj następujące elementy z wyjścia polecenia tworzenia jednostki usługi, aby użyć ich w następnej sekcji.

    • ClientId.
    • ClientSecret. Ta wartość to wygenerowane hasło dla jednostki usługi, do której nie można uzyskać dostępu ponownie.
    • TenantId.
  3. Użyj polecenia az role assignment create, aby przypisać dwie kolejne role dostępu do głównej jednostki usługi: Współautor danych usługi Device Provisioning Service oraz Współautor danych usługi IoT Hub. Zastąp <SP_CLIENT_ID> wartością clientId skopiowaną z wyników poprzedniego polecenia.

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

Zapisywanie danych uwierzytelniających jednostki usługi jako tajnych danych

  1. W GitHub.com przejdź do obszaru Ustawienia repozytorium.

  2. Wybierz pozycję Wpisy tajne z menu nawigacji, a następnie wybierz pozycję Akcje.

  3. Wybierz Nowy sekret repozytorium.

  4. Utwórz tajemnicę dla głównego identyfikatora jednostki usługi.

    • Nazwa: APP_ID
    • Klucz tajny: wklej clientId skopiowany z danych wyjściowych polecenia tworzenia jednostki usługi.
  5. Wybierz Dodaj sekret, a następnie wybierz Nowy sekret repozytorium, aby dodać drugi sekret.

  6. Utwórz tajny kod dla hasła aplikacji usługi.

    • Nazwa: SECRET
    • Wpis tajny: wklej element clientSecret skopiowany z danych wyjściowych polecenia tworzenia jednostki usługi.
  7. Wybierz Dodaj sekret, a następnie wybierz Nowy sekret repozytorium, aby dodać ostatni sekret.

  8. Utwórz tajemnicę dla dzierżawy Azure.

    • Nazwa: TENANT
    • Wpis tajny: wklej identyfikator tenantId skopiowany z danych wyjściowych polecenia tworzenia jednostki usługi.
  9. Wybierz przycisk Add secret (Dodaj wpis tajny).

2 — Tworzenie przepływu pracy

Przepływ pracy funkcji GitHub Actions definiuje zadania uruchamiane po wyzwoleniu przepływu pracy przez zdarzenie. Przepływ pracy zawiera jedno lub więcej zadań , które mogą być uruchamiane równolegle lub sekwencyjnie. Aby uzyskać więcej informacji, zobacz Omówienie funkcji GitHub Actions.

W tym samouczku utworzymy jeden przepływ pracy zawierający zadania dla każdego z następujących zadań:

  • Aprowizuj wystąpienie usługi IoT Hub i wystąpienie usługi DPS.
  • Połącz wystąpienia usługi IoT Hub i DPS ze sobą.
  • Utwórz rejestrację indywidualną w wystąpieniu usługi DPS i zarejestruj urządzenie w centrum IoT przy użyciu uwierzytelniania klucza symetrycznego za pośrednictwem rejestracji w usłudze DPS.
  • Zasymuluj urządzenie przez pięć minut i monitoruj zdarzenia IoT Hub.

Przepływy pracy to pliki YAML znajdujące się w .github/workflows/ katalogu repozytorium.

  1. W repozytorium GitHub przejdź do karty Akcje .

  2. W okienku Akcje wybierz pozycję Nowy przepływ pracy.

  3. Na stronie Wybieranie przepływu pracy możesz wybrać wstępnie utworzone szablony do użycia. Na potrzeby tego samouczka utworzymy własny przepływ pracy, więc wybierz pozycję Skonfiguruj przepływ pracy samodzielnie.

  4. Usługa GitHub tworzy nowy plik przepływu pracy. Zwróć uwagę, że znajduje się on w .github/workflows/ katalogu . Nadaj nowemu plikowi zrozumiałą nazwę, na przykład dps-tutorial.yml.

  5. Dodaj parametr name , aby nadać przepływowi pracy nazwę.

    name: DPS Tutorial
    
  6. Dodaj parametr on.workflow_dispatch . Parametr on określa, kiedy jest uruchamiany przepływ pracy. Parametr workflow_dispatch wskazuje, że chcemy ręcznie wyzwolić przepływ pracy. Za pomocą tego parametru możemy zdefiniować inputs, który będzie przekazywany do przepływu pracy przy każdym uruchomieniu, ale nie używamy inputs w tym samouczku.

    on: workflow_dispatch
    
  7. Zdefiniuj zmienne środowiskowe dla zasobów tworzonych w przepływie pracy. Te zmienne są dostępne dla wszystkich zadań w przepływie pracy. Można również zdefiniować zmienne środowiskowe dla poszczególnych zadań lub poszczególnych kroków w ramach zadań.

    Zastąp wartości zastępcze własnymi wartościami. Upewnij się, że określono tę samą grupę zasobów, do której jednostka usługi ma dostęp.

    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. Zdefiniuj zmienne środowiskowe dla sekretów utworzonych w poprzedniej sekcji.

      SP_USER: ${{ secrets.APP_ID }}
      SP_SECRET: ${{ secrets.SECRET }}
      SP_TENANT: ${{ secrets.TENANT }}
    
  9. Dodaj parametr zadania do pliku przepływu pracy.

    jobs:
    
  10. Zdefiniuj pierwsze zadanie dla naszego przepływu pracy, które nazywamy provision zadaniem. To zadanie aprowizuje instancje IoT Hub i DPS.

      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"
    

    Aby uzyskać więcej informacji na temat poleceń uruchamianych w tym zadaniu, zobacz:

  11. Zdefiniuj zadanie configure dla wystąpień usług DPS i IoT Hub. Zwróć uwagę, że to zadanie używa parametru needs, co oznacza, że configure zadanie nie jest uruchamiane, dopóki wymienione zadanie nie zakończy pomyślnie swojego własnego uruchomienia.

      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"   
    

    Aby uzyskać więcej informacji na temat poleceń uruchamianych w tym zadaniu, zobacz:

  12. Zdefiniuj zadanie o nazwie register , które tworzy rejestrację indywidualną, a następnie użyj tej rejestracji, aby zarejestrować urządzenie w usłudze 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   
    

    Uwaga / Notatka

    To zadanie i inne używają parametru --auth-type login w niektórych poleceniach, aby wskazać, że operacja powinna używać jednostki usługi z bieżącej sesji firmy Microsoft Entra. Alternatywa --auth-type key nie wymaga konfiguracji jednostki usługi, ale jest mniej bezpieczna.

    Aby uzyskać więcej informacji na temat poleceń uruchamianych w tym zadaniu, zobacz:

  13. Zdefiniuj zadanie dla simulate urządzenia IoT, które łączy się z centrum IoT Hub i wysyła przykładowe komunikaty telemetryczne.

      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"
    

    Aby uzyskać więcej informacji na temat poleceń uruchamianych w tym zadaniu, zobacz:

  14. Zdefiniuj zadanie punktu monitor końcowego centrum IoT dla zdarzeń i obserwuj komunikaty pochodzące z symulowanego urządzenia. Zwróć uwagę, że zadania symulowania i monitorowania definiują zadanie rejestrowania w parametrze needs . Ta konfiguracja oznacza, że po pomyślnym zakończeniu zadania rejestrowania oba te zadania są uruchamiane równolegle.

      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   
    

    Aby uzyskać więcej informacji na temat poleceń uruchamianych w tym zadaniu, zobacz:

  15. Pełny plik przepływu pracy powinien wyglądać tak jak ten przykład, a Twoje informacje powinny zastąpić wartości symboli zastępczych w zmiennych środowiskowych.

    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. Zapisz, zatwierdź i wypchnij ten nowy plik do repozytorium GitHub.

3 — Uruchamianie przepływu pracy

  1. Należy przejść do karty Akcje w repozytorium GitHub.

  2. W okienku Akcje wybierz Samouczek DPS, czyli nazwę, którą zdefiniowaliśmy w pliku przepływu pracy, a następnie wybierz z listy rozwijanej opcję Uruchom przepływ pracy.

    Zrzut ekranu przedstawiający kartę akcji, na której można wybrać przepływ pracy i uruchomić go.

  3. Zmień gałąź, jeśli przepływ pracy został utworzony w gałęzi innej niż główna, a następnie wybierz pozycję Uruchom przepływ pracy.

  4. Zostanie wyświetlone nowe uruchomienie przepływu pracy. Wybierz nazwę, aby wyświetlić szczegóły przebiegu.

  5. W podsumowaniu przepływu pracy można obserwować, jak każde zadanie rozpoczyna się i kończy. Wybierz dowolną nazwę zadania, aby wyświetlić jego szczegóły. Symulowane zadanie urządzenia jest uruchamiane przez pięć minut i wysyła dane telemetryczne do usługi IoT Hub. W tym czasie wybierz zadanie symulowania , aby obserwować wysyłanie komunikatów z urządzenia, a zadanie monitorowania , aby obserwować odbieranie tych komunikatów przez usługę IoT Hub.

  6. Po pomyślnym zakończeniu wszystkich zadań powinny zostać wyświetlone zielone znaczniki wyboru przy każdym z nich.

    Zrzut ekranu przedstawiający pomyślnie ukończony przepływ pracy.

Uprzątnij zasoby

Jeśli nie zamierzasz nadal korzystać z tych zasobów utworzonych w tym samouczku, usuń je, wykonując następujące kroki.

Użyj interfejsu wiersza polecenia platformy Azure:

  1. Wyświetl listę zasobów w grupie zasobów.

    az resource list --resource-group <RESOURCE_GROUP_NAME>
    
  2. Aby usunąć poszczególne zasoby, użyj identyfikatora zasobu.

    az resource delete --resource-group <RESOURCE_GROUP_NAME> --ids <RESOURCE_ID>
    
  3. Jeśli chcesz usunąć całą grupę zasobów i wszystkie zasoby w niej, uruchom następujące polecenie:

    az group delete --resource-group <RESOURCE_GROUP_NAME>
    

Użyj witryny Azure Portal:

  1. W witrynie Azure Portal przejdź do grupy zasobów, w której utworzono nowe zasoby.
  2. Możesz usunąć całą grupę zasobów lub wybrać poszczególne zasoby, które chcesz usunąć, a następnie wybrać pozycję Usuń.

Dalsze kroki

Dowiedz się, jak implementować wystąpienia usługi DPS przy użyciu innych narzędzi automatyzacji.