Руководство. Автоматизация службы подготовки устройств Azure с помощью GitHub Actions
Используйте средства автоматизации, такие как GitHub Actions, для управления жизненным циклом устройств Интернета вещей. В этом руководстве демонстрируется рабочий процесс GitHub Actions, который подключает устройство к Центру Интернета вещей с помощью службы подготовки устройств Azure (DPS).
В этом руководстве описано следующее:
- Сохраните учетные данные проверки подлинности в качестве секретов репозитория.
- Создайте рабочий процесс для подготовки Центр Интернета вещей и ресурсов службы подготовки устройств.
- Запустите рабочий процесс и отслеживайте имитированное устройство при подключении к Центр Интернета вещей.
Необходимые компоненты
Подписка Azure
Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе.
Azure CLI
Используйте среду Bash в Azure Cloud Shell.
Или, если вы предпочитаете локально запускать справочные команды CLI, установите Azure CLI. Если вы работаете в Windows или macOS, попробуйте запустить Azure CLI в контейнере Docker.
Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login.
Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.
Учетная запись GitHub с собственным репозиторием или репозиторием, к которому у вас есть доступ администратора. Дополнительные сведения см. в статье "Начало работы с GitHub".
1. Создание секретов репозитория
Рабочий процесс, который вы определите в следующем разделе, требует доступа к подписке Azure для создания ресурсов и управления ими. Вы не хотите поместить эти сведения в незащищенный файл, где его можно обнаружить, поэтому вместо этого мы будем использовать секреты репозитория для хранения этих сведений, но по-прежнему сделать его доступным в качестве переменной среды в рабочем процессе. Дополнительные сведения см. в разделе "Зашифрованные секреты".
Только владельцы репозитория и администраторы могут управлять секретами репозитория.
Создание субъекта-службы
Вместо предоставления учетных данных личного доступа мы создадим субъект-службу, а затем добавим эти учетные данные в качестве секретов репозитория. Используйте 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>
Скопируйте следующие элементы из выходных данных команды создания субъекта-службы, чтобы использовать в следующем разделе:
- Идентификатор клиента.
- ClientSecret. Это созданный пароль для субъекта-службы, к которому вы еще не сможете получить доступ.
- Идентификатор клиента.
Используйте команду az role assignment create, чтобы назначить двум дополнительным ролям доступа субъекту-службе: участнику данных службы подготовки устройств и участнику данных Центр Интернета вещей. Замените
<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 перейдите к Параметры репозитория.
Выберите секреты в меню навигации, а затем выберите "Действия".
Нажмите Создать секрет репозитория.
Создайте секрет для идентификатора субъекта-службы.
- Имя:
APP_ID
- Секрет. Вставьте идентификатор клиента , скопированный из выходных данных команды создания субъекта-службы.
- Имя:
Выберите " Добавить секрет", а затем выберите новый секрет репозитория, чтобы добавить второй секрет.
Создайте секрет для пароля субъекта-службы.
- Имя:
SECRET
- Секрет. Вставьте clientSecret , скопированный из выходных данных команды создания субъекта-службы.
- Имя:
Выберите " Добавить секрет", а затем выберите новый секрет репозитория, чтобы добавить окончательный секрет.
Создайте секрет для клиента Azure.
- Имя:
TENANT
- Секрет. Вставьте идентификатор клиента, скопированный из выходных данных команды создания субъекта-службы.
- Имя:
Выберите Добавить секрет.
2. Создание рабочего процесса
Рабочий процесс GitHub Actions определяет задачи, которые будут выполняться после активации события. Рабочий процесс содержит одно или несколько заданий , которые могут выполняться параллельно или последовательно. Дополнительные сведения см. в разделе "Общие сведения о действиях GitHub".
В этом руководстве мы создадим один рабочий процесс, содержащий задания для каждой из следующих задач:
- Подготовка экземпляра Центр Интернета вещей и экземпляра DPS.
- Свяжите экземпляры Центр Интернета вещей и DPS друг с другом.
- Создайте отдельную регистрацию в экземпляре DPS и зарегистрируйте устройство в Центре Интернета вещей с помощью проверки подлинности симметричного ключа через регистрацию DPS.
- Имитируйте устройство в течение пяти минут и отслеживайте события Центра Интернета вещей.
Рабочие процессы — это файлы YAML, расположенные в .github/workflows/
каталоге репозитория.
В репозитории GitHub перейдите на вкладку Actions .
В области "Действия" выберите новый рабочий процесс.
На странице "Выбор рабочего процесса" можно выбрать готовые шаблоны для использования. Мы создадим собственный рабочий процесс для этого руководства, поэтому выберите " Настроить рабочий процесс самостоятельно".
GitHub создает новый файл рабочего процесса для вас. Обратите внимание, что он находится в каталоге
.github/workflows/
. Присвойте новому файлу понятное имя, напримерdps-tutorial.yml
.Добавьте параметр имени, чтобы дать рабочему процессу имя.
name: DPS Tutorial
Добавьте параметр on.workflow_dispatch. Параметр
on
определяет, когда будет выполняться рабочий процесс. Параметрworkflow_dispatch
указывает, что нужно вручную активировать рабочий процесс. С помощью этого параметра мы могли бы определить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
задание. Это задание подготавливает экземпляры Центр Интернета вещей и 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"
Дополнительные сведения о командах, выполняемых в этом задании, см. в следующих статье:
Определите задание для
configure
экземпляров DPS и Центр Интернета вещей. Обратите внимание, что это задание использует параметр потребностей , что означает, что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"
Дополнительные сведения о командах, выполняемых в этом задании, см. в следующих статье:
Определите задание, которое
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
Альтернатива не требует настройки субъекта-службы, но менее безопасна.Дополнительные сведения о командах, выполняемых в этом задании, см. в следующих статье:
Определите задание на
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"
Дополнительные сведения о командах, выполняемых в этом задании, см. в следующих статье:
Определите задание в
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
Дополнительные сведения о командах, выполняемых в этом задании, см. в следующих статье:
Полный файл рабочего процесса должен выглядеть следующим образом: сведения заменяют значения заполнителей в переменных среды:
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. Запуск рабочего процесса
Перейдите на вкладку Actions репозитория GitHub.
В области "Действия" выберите "Руководство по DPS", имя которого мы определили в файле рабочего процесса, а затем в раскрывающемся списке "Запуск рабочего процесса".
Измените ветвь, если вы создали рабочий процесс в ветви, отличной от основной, а затем нажмите кнопку "Выполнить рабочий процесс".
Выполняется новый запуск рабочего процесса. Выберите имя для просмотра сведений о выполнении.
В сводке рабочего процесса можно наблюдать за началом и завершением каждого задания. Выберите любое имя задания, чтобы просмотреть его сведения. Задание имитированного устройства выполняется в течение пяти минут и отправляет данные телеметрии в Центр Интернета вещей. В течение этого времени выберите имитированное задание для просмотра сообщений, отправляемых с устройства, и задание монитора для просмотра этих сообщений, полученных Центр Интернета вещей.
После успешного завершения всех заданий вы увидите зеленые проверка по каждому из них.
Очистка ресурсов
Если вы не собираетесь продолжать использовать эти ресурсы, созданные в этом руководстве, удалите их с помощью следующих действий.
С помощью Azure CLI:
Вывод списка ресурсов в группе ресурсов.
az resource list --resource-group <RESOURCE_GROUP_NAME>
Чтобы удалить отдельные ресурсы, используйте идентификатор ресурса.
az resource delete --resource-group <RESOURCE_GROUP_NAME> --ids <RESOURCE_ID>
Если вы хотите удалить всю группу ресурсов и все ресурсы в ней, выполните следующую команду:
az group delete --resource-group <RESOURCE_GROUP_NAME>
Использование портала Azure
- В портал Azure перейдите в группу ресурсов, в которой вы создали новые ресурсы.
- Можно удалить всю группу ресурсов или выбрать отдельные ресурсы, которые требуется удалить, а затем нажмите кнопку "Удалить".
Следующие шаги
Узнайте, как подготовить экземпляры DPS с помощью других средств автоматизации.