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 サービス プリンシパルを作成する」をご覧ください。
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>次のセクションで使用するために、サービス プリンシパル作成コマンドの出力から次の項目をコピーします。
- clientId。
- clientSecret。 この値は、再びアクセスできないサービス プリンシパルの生成されたパスワードです。
- tenantId。
az role assignment create コマンドを使用して、Device Provisioning Service Data Contributor と IoT 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>"
サービス プリンシパルの資格情報をシークレットとして保存する
GitHub.com で、リポジトリの設定に移動します。
ナビゲーション メニューから [シークレット ] を選択し、[ アクション] を選択します。
[ 新しいリポジトリ シークレット ] を選択します。
サービス プリンシパル ID のシークレットを作成します。
-
名前:
APP_ID - シークレット: サービス プリンシパル作成コマンドの出力からコピーした clientId を 貼り付けます。
-
名前:
[ シークレットの追加] を選択し、[ 新しいリポジトリ シークレット ] を選択して 2 つ目のシークレットを追加します。
サービス プリンシパル パスワードのシークレットを作成します。
-
名前:
SECRET - シークレット: サービス プリンシパル作成コマンドの出力からコピーした clientSecret を貼り付けます。
-
名前:
[ シークレットの追加] を選択し、[ 新しいリポジトリ シークレット ] を選択して最終的なシークレットを追加します。
Azure テナントのシークレットを作成します。
-
名前:
TENANT - シークレット: サービス プリンシパル作成コマンドの出力からコピーした tenantId を 貼り付けます。
-
名前:
[ シークレットの追加] を選択します。
2 - ワークフローを作成する
GitHub Actions ワークフローは、イベントがワークフローをトリガーした後に実行されるタスクを定義します。 ワークフローには、並列または順番に実行できる 1 つ以上の ジョブ が含まれています。 詳細については、「 GitHub Actions について」を参照してください。
このチュートリアルでは、次の各タスクのジョブを含むワークフローを 1 つ作成します。
- IoT Hub インスタンスと DPS インスタンスをプロビジョニングします。
- IoT Hub インスタンスと DPS インスタンスを相互にリンクします。
- DPS インスタンスに個別登録を作成し、DPS 登録を介して対称キー認証を使用してデバイスを IoT ハブに登録します。
- デバイスを 5 分間シミュレートし、IoT Hub イベントを監視します。
ワークフローは、リポジトリの .github/workflows/ ディレクトリにある YAML ファイルです。
GitHub リポジトリで、[ アクション] タブに移動します。
[操作] ウィンドウで、[新しいワークフロー] を選択します。
[ ワークフローの選択] ページで、使用する事前構築済みのテンプレートを選択できます。 このチュートリアルでは独自のワークフローを作成するため、[自分で ワークフローを設定する] を選択します。
GitHub によって新しいワークフロー ファイルが作成されます。
.github/workflows/ディレクトリにあることに注意してください。 新しいファイルにわかりやすい名前を付けます (例:dps-tutorial.yml)。name パラメーターを追加して、ワークフローに名前を付けます。
name: DPS Tutorialon.workflow_dispatch パラメーターを追加します。
onパラメーターは、ワークフローを実行するタイミングを定義します。workflow_dispatchパラメーターは、ワークフローを手動でトリガーすることを示します。 このパラメーターを使用すると、各実行でワークフローに渡されるinputsを定義できますが、このチュートリアルではinputsを使用しません。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ジョブと呼びます) を定義します。 このジョブは、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"このジョブで実行されるコマンドの詳細については、以下を参照してください。
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"このジョブで実行されるコマンドの詳細については、以下を参照してください。
- az iot dps linked-hub create コマンドはリンクされたハブを作成します。
個々の登録を作成し、その登録を使用してデバイスを 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はサービス プリンシパルの構成を必要としませんが、安全性は低くなります。このジョブで実行されるコマンドの詳細については、以下を参照してください。
- az iot dps enrollment create を使用して、デバイス プロビジョニング サービス(DPS)の登録を作成します。
- az iot device registration create を使用して、IoTデバイスの登録を作成する
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"このジョブで実行されるコマンドの詳細については、以下を参照してください。
- az iot device simulate コマンドを使用して、IoTデバイスをシミュレートします。
イベントの 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このジョブで実行されるコマンドの詳細については、以下を参照してください。
- az iot hub monitor-events コマンドは、IoTハブのイベントを監視するために使用します。
完全なワークフロー ファイルは次の例のようになります。そして、環境変数内のプレースホルダー値をあなたの情報に置き換えます。
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この新しいファイルを保存してコミットし、GitHub リポジトリにプッシュします。
3 - ワークフローを実行する
GitHub リポジトリの [アクション] タブに移動します。
[操作] ウィンドウで、ワークフロー ファイルで定義した名前である DPS チュートリアルを選択し、[ワークフローの実行] ドロップダウン ボックスを選択します。
メイン以外のブランチでワークフローを作成した場合は、ブランチを変更し、[ ワークフローの実行] を選択します。
新しいワークフローの実行が現在進行中です。 実行の詳細を表示する名前を選択します。
ワークフローの概要では、各ジョブの開始と完了を確認できます。 ジョブ名を選択すると、その詳細が表示されます。 シミュレートされたデバイス ジョブは 5 分間実行され、テレメトリが IoT Hub に送信されます。 この間、デバイスから送信されるメッセージを監視する シミュレート ジョブと、IoT Hub によって受信されたメッセージを監視する 監視 ジョブを選択します。
すべてのジョブが正常に完了すると、それぞれに緑色のチェックマークが表示されます。
リソースをクリーンアップする
このチュートリアルで作成したこれらのリソースを引き続き使用しない場合は、次の手順で削除します。
Azure CLI を使用します。
リソース グループ内のリソースを一覧表示します。
az resource list --resource-group <RESOURCE_GROUP_NAME>個々のリソースを削除するには、リソース ID を使用します。
az resource delete --resource-group <RESOURCE_GROUP_NAME> --ids <RESOURCE_ID>リソース グループ全体とその中のすべてのリソースを削除する場合は、次のコマンドを実行します。
az group delete --resource-group <RESOURCE_GROUP_NAME>
Azure portal を使用します。
- Azure portal で、新しいリソースを作成したリソース グループに移動します。
- リソース グループ全体を削除するか、削除する個々のリソースを選択してから、[削除] を選択 します。
次のステップ
他の自動化ツールを使用して DPS インスタンスをプロビジョニングする方法について説明します。