次の方法で共有


チュートリアル: GitHub Actions を使用して Azure Device Provisioning Service を自動化する

GitHub Actions などの自動化ツールを使用して、IoT デバイスのライフサイクルを管理します。 このチュートリアルでは、Azure Device Provisioning Service (DPS) を使用してデバイスを IoT ハブに接続する GitHub Actions ワークフローを示します。

このチュートリアルでは、以下の内容を学習します。

  • 認証資格情報をリポジトリ シークレットとして保存します。
  • IoT Hub リソースと Device Provisioning Service リソースをプロビジョニングするワークフローを作成します。
  • ワークフローを実行し、IoT Hub に接続するシミュレートされたデバイスを監視します。

[前提条件]

  • Azure サブスクリプション

    Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。

  • Azure CLI

    • Azure Cloud Shell で Bash 環境を使用します。

    • または、CLI 参照コマンドをローカルで実行する場合は、Azure CLI を インストール します。 Windows または macOS で実行している場合は、 Docker コンテナーで Azure CLI を実行することを検討してください。

      • ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。

      • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

  • 自分が所有するリポジトリまたは管理者アクセス権を持つリポジトリを持つ GitHub アカウント。 詳細については、「 GitHub の概要」を参照してください。

1 - リポジトリ シークレットを作成する

次のセクションで定義するワークフローでは、リソースを作成および管理するために Azure サブスクリプションにアクセスする必要があります。 その情報は、検出可能な保護されていないファイルに配置したくないので、代わりにリポジトリ シークレットを使用してこの情報を格納しますが、ワークフロー内の環境変数としてアクセスできるようにします。 詳細については、「 GitHub Actions でのシークレットの使用」を参照してください。

リポジトリシークレットを管理できるのは、リポジトリの所有者と管理者だけです。

サービス プリンシパルを作成する

個人用アクセス資格情報を提供するのではなく、サービス プリンシパルを作成し、それらの資格情報をリポジトリ シークレットとして追加します。 Azure CLI を使用して新しいサービス プリンシパルを作成します。 詳細については、「Azure CLI で Azure サービス プリンシパルを作成する」をご覧ください。

  1. az ad sp create-for-rbac コマンドを使用して、特定のリソース グループへの共同作成者アクセス権を持つサービス プリンシパルを作成します。 <SUBSCRIPTION_ID><RESOURCE_GROUP_NAME> は、実際の情報に置き換えてください。

    このコマンドには、サブスクリプションの所有者またはユーザー アクセス管理者ロールが必要です。

    az ad sp create-for-rbac --name github-actions-sp --role contributor --scopes /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP_NAME>
    
  2. 次のセクションで使用するために、サービス プリンシパル作成コマンドの出力から次の項目をコピーします。

    • clientId
    • clientSecret。 この値は、再びアクセスできないサービス プリンシパルの生成されたパスワードです。
    • tenantId
  3. az role assignment create コマンドを使用して、Device Provisioning Service Data ContributorIoT Hub Data Contributor という 2 つのアクセス ロールをサービス プリンシパルに割り当てます。 <SP_CLIENT_ID>を、前のコマンドの出力からコピーした clientId 値に置き換えます。

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

サービス プリンシパルの資格情報をシークレットとして保存する

  1. GitHub.com で、リポジトリの設定に移動します。

  2. ナビゲーション メニューから [シークレット ] を選択し、[ アクション] を選択します。

  3. [ 新しいリポジトリ シークレット ] を選択します。

  4. サービス プリンシパル ID のシークレットを作成します。

    • 名前: APP_ID
    • シークレット: サービス プリンシパル作成コマンドの出力からコピーした clientId を 貼り付けます。
  5. [ シークレットの追加] を選択し、[ 新しいリポジトリ シークレット ] を選択して 2 つ目のシークレットを追加します。

  6. サービス プリンシパル パスワードのシークレットを作成します。

    • 名前: SECRET
    • シークレット: サービス プリンシパル作成コマンドの出力からコピーした clientSecret を貼り付けます。
  7. [ シークレットの追加] を選択し、[ 新しいリポジトリ シークレット ] を選択して最終的なシークレットを追加します。

  8. Azure テナントのシークレットを作成します。

    • 名前: TENANT
    • シークレット: サービス プリンシパル作成コマンドの出力からコピーした tenantId を 貼り付けます。
  9. [ シークレットの追加] を選択します

2 - ワークフローを作成する

GitHub Actions ワークフローは、イベントワークフローをトリガーした後に実行されるタスクを定義します。 ワークフローには、並列または順番に実行できる 1 つ以上の ジョブ が含まれています。 詳細については、「 GitHub Actions について」を参照してください。

このチュートリアルでは、次の各タスクのジョブを含むワークフローを 1 つ作成します。

  • IoT Hub インスタンスと DPS インスタンスをプロビジョニングします。
  • IoT Hub インスタンスと DPS インスタンスを相互にリンクします。
  • DPS インスタンスに個別登録を作成し、DPS 登録を介して対称キー認証を使用してデバイスを IoT ハブに登録します。
  • デバイスを 5 分間シミュレートし、IoT Hub イベントを監視します。

ワークフローは、リポジトリの .github/workflows/ ディレクトリにある YAML ファイルです。

  1. GitHub リポジトリで、[ アクション] タブに移動します。

  2. [操作] ウィンドウで、[新しいワークフロー] を選択します。

  3. [ ワークフローの選択] ページで、使用する事前構築済みのテンプレートを選択できます。 このチュートリアルでは独自のワークフローを作成するため、[自分で ワークフローを設定する] を選択します。

  4. GitHub によって新しいワークフロー ファイルが作成されます。 .github/workflows/ ディレクトリにあることに注意してください。 新しいファイルにわかりやすい名前を付けます (例: dps-tutorial.yml)。

  5. name パラメーターを追加して、ワークフローに名前を付けます。

    name: DPS Tutorial
    
  6. on.workflow_dispatch パラメーターを追加します。 on パラメーターは、ワークフローを実行するタイミングを定義します。 workflow_dispatch パラメーターは、ワークフローを手動でトリガーすることを示します。 このパラメーターを使用すると、各実行でワークフローに渡される inputs を定義できますが、このチュートリアルでは inputs を使用しません。

    on: workflow_dispatch
    
  7. ワークフローで作成するリソースの 環境変数 を定義します。 これらの変数は、ワークフロー内のすべてのジョブで使用できます。 また、個々のジョブまたはジョブ内の個々のステップの環境変数を定義することもできます。

    プレースホルダーの値をあなた自身の値に置き換えてください。 サービス プリンシパルがアクセスできるのと同じリソース グループを指定してください。

    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. 前のセクションで作成したシークレットの環境変数を定義します。

      SP_USER: ${{ secrets.APP_ID }}
      SP_SECRET: ${{ secrets.SECRET }}
      SP_TENANT: ${{ secrets.TENANT }}
    
  9. ジョブ パラメーターをワークフロー ファイルに追加します。

    jobs:
    
  10. ワークフローの最初のジョブ ( provision ジョブと呼びます) を定義します。 このジョブは、IoT Hub インスタンスと 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"
    

    このジョブで実行されるコマンドの詳細については、以下を参照してください。

  11. DPS インスタンスと IoT Hub インスタンスを configure するジョブを定義します。 このジョブでは needs パラメーターが使用されていることに注意してください。つまり、一覧に示されているジョブが正常に実行されるまで、 configure ジョブは実行されません。

      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"   
    

    このジョブで実行されるコマンドの詳細については、以下を参照してください。

  12. 個々の登録を作成し、その登録を使用してデバイスを IoT Hub に登録する register というジョブを定義します。

      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   
    

    このジョブと他のジョブでは、一部のコマンドでパラメーター --auth-type login を使用して、操作で現在の Microsoft Entra セッションのサービス プリンシパルを使用する必要があることを示します。 代わりに、 --auth-type key はサービス プリンシパルの構成を必要としませんが、安全性は低くなります。

    このジョブで実行されるコマンドの詳細については、以下を参照してください。

  13. IoT ハブに接続し、サンプルテレメトリ メッセージを送信する IoT デバイスを simulate するジョブを定義します。

      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"
    

    このジョブで実行されるコマンドの詳細については、以下を参照してください。

  14. イベントの IoT ハブ エンドポイントを monitor するジョブを定義し、シミュレートされたデバイスから受信したメッセージを監視します。 シミュレート ジョブとモニター ジョブの両方で、 パラメーターにneedsジョブが定義されていることに注意してください。 この構成は、 登録 ジョブが正常に完了すると、両方のジョブが並列で実行されることを意味します。

      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   
    

    このジョブで実行されるコマンドの詳細については、以下を参照してください。

  15. 完全なワークフロー ファイルは次の例のようになります。そして、環境変数内のプレースホルダー値をあなたの情報に置き換えます。

    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. この新しいファイルを保存してコミットし、GitHub リポジトリにプッシュします。

3 - ワークフローを実行する

  1. GitHub リポジトリの [アクション] タブに移動します。

  2. [操作] ウィンドウで、ワークフロー ファイルで定義した名前である DPS チュートリアルを選択し、[ワークフローの実行] ドロップダウン ボックスを選択します。

    ワークフローを選択して実行できるアクション タブのスクリーンショット。

  3. メイン以外のブランチでワークフローを作成した場合は、ブランチを変更し、[ ワークフローの実行] を選択します。

  4. 新しいワークフローの実行が現在進行中です。 実行の詳細を表示する名前を選択します。

  5. ワークフローの概要では、各ジョブの開始と完了を確認できます。 ジョブ名を選択すると、その詳細が表示されます。 シミュレートされたデバイス ジョブは 5 分間実行され、テレメトリが IoT Hub に送信されます。 この間、デバイスから送信されるメッセージを監視する シミュレート ジョブと、IoT Hub によって受信されたメッセージを監視する 監視 ジョブを選択します。

  6. すべてのジョブが正常に完了すると、それぞれに緑色のチェックマークが表示されます。

    正常に完了したワークフローのスクリーンショット。

リソースをクリーンアップする

このチュートリアルで作成したこれらのリソースを引き続き使用しない場合は、次の手順で削除します。

Azure CLI を使用します。

  1. リソース グループ内のリソースを一覧表示します。

    az resource list --resource-group <RESOURCE_GROUP_NAME>
    
  2. 個々のリソースを削除するには、リソース ID を使用します。

    az resource delete --resource-group <RESOURCE_GROUP_NAME> --ids <RESOURCE_ID>
    
  3. リソース グループ全体とその中のすべてのリソースを削除する場合は、次のコマンドを実行します。

    az group delete --resource-group <RESOURCE_GROUP_NAME>
    

Azure portal を使用します。

  1. Azure portal で、新しいリソースを作成したリソース グループに移動します。
  2. リソース グループ全体を削除するか、削除する個々のリソースを選択してから、[削除] を選択 します

次のステップ

他の自動化ツールを使用して DPS インスタンスをプロビジョニングする方法について説明します。