В фокусе
Читать
ГлавнаяРубрикиПрограммное обеспечениеИспользование службы заданий Amazon Web Services для обновления программного обеспечения и конфигурации на устройствах интернета вещей
21.03.2019

Использование службы заданий Amazon Web Services для обновления программного обеспечения и конфигурации на устройствах интернета вещей

С.И.Жуков, к.ф.-м.н., НИВЦ МГУ, ООО Аурига

Amazon Web Services (AWS) является одной из наиболее популярных инфраструктур для интернета вещей (IoT), наряду с Microsoft Azure и Google Cloud IoT. Интеллектуальные устройства подключаются к инфраструктуре по сети и взаимодействуют с ней по протоколу MQTT. Инфраструктура, помимо собственно взаимодействия с устройствами, обеспечивает большие возможности для хранения и обработки данных, представления данных пользователю, анализа данных (в том числе методами искусственного интеллекта), защиту от несанкционированного доступа с разветвленной системой привилегий и многое другое.

Для хранения данных инфраструктура AWS предоставляет (помимо различных реляционных и нереляционных СУБД) облачное иерархическое файлохранилище Simple Storage Service (S3).  Каждый файл в хранилище S3 может иметь доступный извне унифицированный указатель ресурса (universal resource locator – URL) и, в этом случае, к файлу можно получить доступ через Web-браузер. Если содержимым файла является HTML-страница, то через этот файл интерактивный пользователь может получить доступ к возможностям инфраструктуры AWS и к интеллектуальным устройствам, подключенным к ней. Возможности этой страницы задаются JavaScript кодом, который на ней содержится (этот код может вызывать функции прикладного программного интерфейса (API) инфраструктуры и ее отдельных компонент).

Помимо Web-страниц, программный код в инфраструктуре AWS может храниться в виде лямбда-функций. Это специальные именованные фрагменты кода, написанные на одном из следующих языков: Python, Java, C# или Node.Js. Они хранятся в облаке и вызываются по определенным событиям. Событие может быть инициировано Web-страницей (как вызов некоторого HTTP REST API на определенном URL), другой лямбда-функцией или интеллектуальным устройством (как посылка MQTT сообщения определенного вида). В каждом из этих случаев события могут иметь параметры. Лямбда-функции используются как промежуточный уровень кода для взаимодействия между интеллектуальными устройствами, ресурсами AWS (например, базами данных) и Web-страницами, непосредственно взаимодействующими с пользователем.

Рис.1. Архитектура взаимодействия программных компонент AWS

Служба заданий AWS

Одной из компонент инфраструктуры AWS является служба заданий (AWS Jobs). Она предназначена для создания и выполнения длительных действий (заданий) на одном или нескольких IoT-устройствах, подключенных к AWS, и управления заданиями. По сравнению с другими службами AWS, служба AWS Jobs появилась сравнительно недавно.

Доступ к службе AWS Jobs предоставляется как через консоль разработчика AWS, так и программно через набор функций API.

Некоторое подмножество этих функций может использоваться самим интеллектуальным устройством (вызываться путем посылки сообщений по протоколу MQTT). Функции, доступные по протоколу MQTT, выполняют действия, необходимые для доступа к заданиям и их параметрам со стороны устройства: GetPendingJobExecutions, StartNextPendingJobExecution, UpdateJobExecution, DescribeJobExecution и т.д.

Другие функции определены поверх протокола HTTPS и предназначены для вызова из JavaScript-кода на Web-страницах, из программного кода лямбда-функций и пользователями в интерактивном режиме. Эти функции в основном предназначены для создания и удаления заданий и управления их выполнением: CreateJob, DeleteJob, DescribeJob, ListJobs, ListJobExecutionsForThing и др.

В терминах AWS Jobs, основная информация о задании содержится в документе-описании задания (job document). Это документ в формате JSON, который передается инфраструктурой на конкретное устройство и описывает, что должно быть сделано. Как правило, этот документ содержит название выполняемого действия и URL (один или несколько), который указывает на местонахождение данных – параметров действия.

Этот URL может быть «предварительно подписан» пользователем AWS. В этом случае, URL позволяет доступ к определенному ресурсу для интеллектуального устройства с правами подписавшего его пользователя (так что устройство может получить доступ к данным, к которым по умолчанию оно не имеет доступа). Предварительно подписанные URL-ы имеют ограниченное время жизни; после истечения этого времени URL прекращает свое существование и ресурс становится недоступным.

Документ-описание задания может создаваться на лету во время создания задания или храниться как файл в файловом хранилище S3 инфраструктуры AWS и указываться ссылкой на этот файл при создании задания.

Другие параметры задания включают в себя следующее.

  • Имя устройства или группы устройств, на которых будет выполняться задание. Если целью задания является группа устройств, задание выполняется на всех устройствах – членах этой группы.
  • Одноразовое (snapshot) или постоянное (continuous) задание. Одноразовое задание выполняется один раз на выбранном устройстве или группе устройств и после этого завершается. Постоянное задание всегда применяется к группе устройств и существует до тех пор, пока не будет явно удалено пользователем. После выполнения на всех устройствах-членах группы задание продолжает существовать. Если впоследствии новое устройство добавляется в группу, задание запускается на новом устройстве после его добавления в группу.

Когда задание выполняется на конкретном устройстве, оно находится в некотором состоянии. Инфраструктура определяет ограниченный набор состояний: в очереди (QUEUED), выполняется (IN_PROGRESS), неудачное завершение (FAILED), удачное завершение (SUCCESS), отменено (CANCELED), отвергнуто (REJECTED), удалено (REMOVED). Текущее состояние изменяется по запросу от устройства (вызовом функции UpdateJobExecution) или когда клиент вызывает одну из функций управления заданием (например, отменяет задание вызовом функции CancelJob). Как правило, когда задание выполняется на устройстве, оно находится в состоянии IN_PROGRESS и переходит в состояние SUCCESS или FAILED после завершения задания на устройстве.

Диаграмма состояний при выполнении задания приведена на рис.1 (здесь переходы, инициированные устройством, обозначены синими стрелками, а переходы, инициированные другими компонентами AWS – зелеными стрелками).

Рис.2. Диаграмма состояний при выполнении задания в AWS

Реализация обновления программного обеспечения

В рамках разработки встроенного программного обеспечения для одного из IoT-устройств с подключением к инфраструктуре AWS, для обновления программного обеспечения устройства и загрузки конфигурации был разработано решение на основе службы заданий AWS.

Загрузка программного обеспечения реализована следующим образом. Загружаемые образы хранятся как файлы в хранилище S3, это позволяет хранить несколько версий программного обеспечения одновременно. Кроме того, в хранилище S3 создается специальная Web-страница, которая позволяет интерактивному пользователю выбрать параметры процедуры обновления (устройство/группу устройств и версию программного обеспечения) и вызвать определенную лямбда-функцию.

Эта лямбда-функция (написанная на языке Python) реализует взаимодействие со службой заданий AWS. Когда от интерактивного пользователя или от облачной инфраструктуры приходит запрос на обновление программного обеспечения, лямбда-функция создает задание. При этом документ-описание задания создается на лету и направляется как параметр в функцию CreateJob, наряду с именем устройства или группы устройств, подлежащих обновлению. Документ-описание задания включает в себя два текстовых поля. Одно – это требуемая операция (“install”), а другое представляет собой URL загружаемого образа программного обеспечения в хранилище S3. Этот URL соответствует выбранной пользователем версии программного обеспечения, которую нужно установить на устройстве. Еще одно поле логического типа “forced” используется для того, чтобы разрешить так называемый downgrade, то есть установку версии программного обеспечения, которая предшествует текущей версии.

{

  "operation": "install",

  "url": "https://s3-us-west-2.amazonaws.com/smrc-www/ipdu-images/ipdu-latest.dat",

  "forced":  true

}

 

Рис.3. Документ-описание задания для обновления программного обеспечения

Когда создается новое задание, инфраструктура посылает оповещение соответствующему устройству (или всем устройствам в группе в случае группы устройств). Если какое-либо из устройств в данное время недоступно, инфраструктура сохраняет оповещение и передает его устройству, когда устройство становится доступным.

Когда устройство получает оповещение «доступно новое задание» (“next job available”) и соглашается принять новое задание, оно получает документ-описание задания. Задание переходит в состояние IN_PROGRESS. Если документ задает операцию «install», устройство загружает образ обновляемого программного обеспечения, используя URL, содержащийся в документе-описании задания. Для загрузки данных на устройство с заданного URL используется библиотека libcurl. Если образ доступен, не поврежден и содержит приемлемую версию программного обеспечения, то устройство выполняет обновление программного обеспечения и перезагружается, чтобы активировать его. При этом устройство не сообщает инфраструктуре о завершении задания, и задание остается активным (в состоянии IN_PROGRESS). Если какая-то из проверок завершилась неудачно, устройство завершает задание с переводом его в состояние FAILED (и сообщает об этом инфраструктуре). После перезагрузки устройство снова получает от инфраструктуры оповещение «доступно новое задание» на то самое задание, которое оно уже выполняет. В этот момент устройство понимает, что оно находится в процессе обновления программного обеспечения, и вместо того, чтобы начать задание снова, оно успешно завершает задание (с переводом в состояние SUCCESS). Однако, если обновление оказывается неудачным и новая версия программного обеспечения не может запуститься, происходит автоматический откат к предыдущей версии программного обеспечения и устройство после перезагрузки завершает текущее задание с переводом в состояние FAILED.

Загрузка и получение конфигурации

Конфигурация устройства представляет собой набор именованных параметров, значения которых представлены структурами данных в формате JSON.

Для конфигурации определены операции загрузки на устройство и получения с устройства. Это позволяет как загружать предопределенную конфигурацию на устройство, так и копировать конфигурацию между устройствами через инфраструктуру AWS (путем получения конфигурации с одного устройства и загрузки полученной конфигурации на одно или несколько устройств).

Для получения конфигурации с устройства также создается задание; документ-описание задания содержит операцию “config-upload” и URL файла в хранилище S3, в который конфигурация будет записана. По получении задания устройство передает свою конфигурацию на заданный URL по сети с использованием библиотеки libcurl. Для предотвращения несанкционированного доступа к хранилищу S3 со стороны IoT-устройств этот URL должен быть предварительно подписан легальным пользователем AWS.

Загрузка конфигурации выполняется аналогично загрузке программного обеспечения. Новая конфигурация также хранится как файл в хранилище S3, и документ-описание задания содержит ссылку на этот файл в виде URL. Отличается только название операции в документе описания задания (“config-download” вместо “install”).

При копировании конфигурация получается с одного устройства и записывается в некоторый файл, URL которого затем передается в задание загрузки конфигурации на другое устройство (устройства).

 Использование постоянных заданий

Постоянные задания могут использоваться для автоматической загрузки программного обеспечения и конфигурации на большое число устройств в течение длительного времени, например, при промышленном изготовлении устройств.

Для этого в инфраструктуре AWS создается группа устройств, создаются постоянные задания для загрузки определенных версий программного обеспечения и конфигурации и применяются к этой группе устройств. Если используются несколько различных типов устройств, создается несколько групп и несколько наборов постоянных заданий.

После изготовления каждое новое устройство подключается к инфраструктуре AWS и добавляется к соответствующей группе устройств. Соответствующее постоянное задание автоматически применяется к новому устройству и обеспечивает загрузку на него правильных версий программного обеспечения и конфигурации.

Версия для печати193 просмотра.
Оцените статью по: