BLOG

AWS IoT 디바이스 관리에 연속 작업 사용하기AWS IoT 디바이스 관리에 연속 작업 사용하기
작성일: 2018-06-29

이전에 ‘AWS IoT 디바이스 관리와 함께 무선 업데이트 사용하기’에 대한 블로그 글에서 간단한 AWS IoT 스냅샷 작업을 생성하고 진행 상황을 추적하는 방법을 보여 드렸습니다. 이 글에서는 AWS IoT 연속 작업을 구성하고 생성하는 단계별 방법을 설명합니다. 연속 작업은 작업 실행을 자동으로 배포하여 배포 대상의 변경 사항에 대응하는 장시간 실행 작업입니다. 예를 들어 초기 100개 장치 그룹에 연속 작업을 배포할 수 있습니다. 새 디바이스가 배포 그룹에 추가되면 해당 새 디바이스에 연속 작업에 대한 알림이 자동으로 표시됩니다.

 

연속 작업은 다음과 같은 경우에 유용합니다.

 

  • 소프트웨어를 v1로 재설정하는 디바이스에서 데이터 초기화가 수행됩니다. 연속 작업은 디바이스의 소프트웨어를 v1로 재설정한 후 자동으로 최신 버전으로 업데이트할 수 있습니다.
  • 몇 달 동안 웨어하우스에 있으면 이전 펌웨어 버전의 디바이스가 켜집니다. 연속 작업은 디바이스 펌웨어를 최신 버전으로 업데이트할 수 있습니다.
  • 디바이스는 재활용됩니다. 연속 작업은 디바이스에서 보류 중인 모든 작업 실행을 제거할 수 있습니다.

 

다음 몇 개 섹션에서는 디바이스의 펌웨어 버전을 V1에서 V2로 업데이트하는 연속 작업 continuous-job-V1-to-V2을 생성합니다. 펌웨어 버전 V1이 있는 디바이스는 항목 그룹 FirmwareV1Group으로 그룹화되고, 펌웨어 버전 V2가 있는 디바이스는 항목 그룹 FirmwareV2Group으로 그룹화됩니다. 장치가 펌웨어 V2로 성공적으로 업데이트되면 사전 구성된 Lambda 함수가 자동으로 FirmwareV1Group에서 이 디바이스를 자동으로 제거하고 FirmwareV2Group에 추가합니다. 연속 작업 continuous-job-V1-to-V2이 실행되는 동안 FirmwareV1Group에 추가된 새 디바이스는 자동으로 V2 펌웨어 업데이트 작업을 받습니다. 단계는

 

  1. 펌웨어 배포 그룹 생성
  2. 초기 배포 그룹에 항목 추가
  3. Lambda 함수를 구성하고 테스트하여 배포 그룹 간에 디바이스 이동
  4. 펌웨어 V1에서 V2 업데이트에 대한 연속 작업 생성

 

배포 그룹 구성

 

먼저, 각각 다른 펌웨어 버전(V1, V2, V3)을 가진 세가지 그룹을 생성하겠습니다.

 

$ aws iot create-thing-group –thing-group-name “FirmwareV1Group”

$ aws iot create-thing-group –thing-group-name “FirmwareV2Group”

$ aws iot create-thing-group –thing-group-name “FirmwareV3Group”

 

이 예에서는 디바이스가 MyRaspberryPi라는 이름으로 등록됩니다. 항목 그룹 FirmwareV1GroupMyRaspberryPi를 추가합니다.

 

$ aws iot add-thing-to-thing-group \

–thing-name “MyRaspberryPi” \

–thing-group-name “FirmwareV1Group”

 

실제 시나리오에서 디바이스가 시작되면 시작 프로그램을 실행하여 장치를 온라인으로 전환하고 설정을 초기화하는 것이 좋습니다. 시작 프로그램에서 해당 배포 그룹에 디바이스를 추가할 수 있습니다. 또한 디바이스를 기본 설정으로 재설정하는 프로그램에는 해당 배포 그룹에 디바이스를 추가하는 단계가 포함되어야 합니다.

 

Lambda 함수 구성

 

펌웨어 버전 V1에서 V2로 디바이스가 성공적으로 업데이트될 때마다 트리거되는 Lambda 함수를 작성합니다. 이 Lambda 함수는 다음과 같습니다.

 

  • 항목 그룹FirmwareV1Group에서 해당 항목을 제거합니다.
  • 이 항목을 FirmwareV2Group에 추가합니다.

 

먼저, 다음 정책을 사용하여 IAM 콘솔로 이동하여 LambdaRoleForV1ToV2FirmwareUpdate 역할을 생성하십시오. AWS_REGION을 AWS 리전으로 바꾸고 <AWS_ACCOUNT_ID>를 AWS 계정 ID로 바꿉니다.

 

{

“Version”: “2012-10-17”,

“Statement”: [

{

“Effect”: “Allow”,

“Action”: [

“logs:CreateLogGroup”,

“logs:CreateLogStream”,

“logs:PutLogEvents”

],

“Resource”: “arn:aws:logs:*:*:*”

},

{

“Effect”: “Allow”,

“Action”: [

“iot:RemoveThingFromThingGroup”

],

“Resource”: “arn:aws:iot:<AWS_REGION>:<AWS_ACCOUNT_ID>:thinggroup/FirmwareV1Group”

},

{

“Effect”: “Allow”,

“Action”: [

“iot:AddThingToThingGroup”

],

“Resource”: “arn:aws:iot:<AWS_REGION>:<AWS_ACCOUNT_ID>:thinggroup/FirmwareV2Group”

}

]

}

 

AWS Lambda 콘솔로 이동합니다. 함수 생성 페이지에서 Blueprints를 선택합니다. Blueprints 아래에서 hello-world를 선택한 다음 Configure(구성)를 선택합니다.

 

 

기본 정보에서 이 Lambda 함수의 이름을 입력합니다. 역할에 대해 이전 단계에서 생성한 역할(LambdaRoleForV1ToV2FirmwareUpdate)을 선택한 다음 함수 생성을 선택합니다.

 

 

다음 페이지에서 함수 코드를 다음 코드 조각으로 업데이트하고 저장(Save)을 선택합니다.

 

‘use strict’;

 

console.log(‘Loading function’);

 

// Load the AWS SDK

var AWS = require(“aws-sdk”);

 

// Set up the code to call when the Lambda function is invoked

exports.handler = (event, context, callback) => {

// Log a message to the console, you can view this text in the Monitoring tab

// in the Lambda console or in the CloudWatch Logs console

console.log(“Received event:”, event);

console.log(“Thing Arn is:”, event.thingArn);

 

var iot = new AWS.Iot();

 

// Remove the thing from V1 group

var removeParams = {

thingGroupName: “FirmwareV1Group”,

thingArn: event.thingArn

};

iot.removeThingFromThingGroup(removeParams, function(err, data) {

if (err) console.log(err, err.stack); // an error occurred

else console.log(data);               // successful response

});

 

// Add the thing to V2 Group

var addParams = {

thingGroupName: “FirmwareV2Group”,

thingArn: event.thingArn

};

iot.addThingToThingGroup(addParams, function(err, data) {

if (err) console.log(err, err.stack); // an error occurred

else console.log(data);               // successful response

});

 

};

 

Lambda 함수에 대한 트리거를 구성하려면 Designer에서 AWS IoT를 선택합니다. 트리거 구성 섹션에서는 작업 ID continuous-job-V1-to-V2을 사용하여 연속 작업에 대한 성공한 작업 실행 이벤트를 필터링 하는 사용자 정의 IoT 규칙을 생성합니다. 작업 이벤트에 대한 자세한 내용은 AWS IoT 개발자 안내서의 작업 이벤트 설명서를 참조하십시오.

 

” SucceededJobExecutionsForV1toV2Update”라는 새 규칙을 생성하고 규칙 쿼리 문장에 다음 SQL문장을 입력합니다.

 

SELECT * FROM ‘aws/events/jobExecution/continuous-job-V1-to-V2/succeeded’

 

트리거를 구성한 후 추가(Add)를 클릭하고 저장(Save)을 클릭합니다.

 

 

 

Lambda 함수 테스트

 

Lambda 함수를 테스트하려면 AWS Lambda 콘솔에서 테스트 이벤트를 구성합니다. 테스트 이벤트 선택에서 테스트 이벤트 구성을 선택합니다.

 

 

테스트 이벤트의 이름을 SucceededJobExecution으로 지정하고 테스트 이벤트 페이로드를 다음 작업 실행 이벤트 페이 로드로 바꿉니다. AWS_REGION을 AWS 리전으로 바꾸고<AWS_ACCOUNT_ID>를 AWS 계정 ID로 바꿉니다. Create(생성)을 선택하여 변경 사항을 저장합니다.

 

{

“eventType”: “JOB_EXECUTION”,

“eventId”: “ba44f124-61fd-40c8-b747-f7f00a50515c”,

“timestamp”: 1519870643,

“operation”: “succeeded”,

“jobId”: “continuous-job-V1-to-V2”,

“thingArn”: “arn:aws:iot:<AWS_REGION>:<AWS_ACCOUNT_ID>:thing/MyRaspberryPi”,

“status”: “SUCCEEDED”

}

 

테스트 이벤트를 생성한 후 AWS Lambda 콘솔로 돌아갑니다. SucceededJobExecution 테스트 이벤트를 선택하고 Test(테스트)를 선택합니다. FirmwareV1Group에서 MyRaspberryPi가 제거되고 AWS IoT 콘솔에서 FirmwareV2Group 에 추가되는 항목이 표시됩니다. Lambda 함수를 생성하는 방법과 CloudWatch를 사용하여 Lambda 함수를 모니터링하고 디버그하는 방법에 대한 자세한 내용은 AWS Lambda 개발자 안내서의 간단한 Lambda 함수 생성을 참조합니다.

 

 

 

펌웨어 업데이트를 위한 연속 작업 생성하기

 

이제 FirmwareV1Group 그룹에 연속 작업인 continuous-job-V1-to-V2를 만듭니다.

 

$ aws iot create-job \

–job-id “continuous-job-V1-to-V2” \

–targets “arn:aws:iot:<AWS_REGION>:<AWS_ACCOUNT_ID>:thinggroup/FirmwareV1Group” \

–document file://<DIRECTORY_TO_JOB_DOCUMENT>/FirmwareUpdateV1ToV2.json \

–description “Continuous job to update firmware from V1 to V2” \

–target-selection CONTINUOUS

 

continuous-job-V1-to-V2 작업을 수행하면 FirmwareV1Group 작업 그룹에 속한 모든 대상 디바이스에 작업에 대해 알립니다. 각 장치는 작업을 실행하고 작업 실행 상태를 보고합니다. 각각의 성공적인 작업 실행에 대해 작업 서비스는 작업 실행 이벤트를 전송합니다. 작업 실행 이벤트는 Lambda 함수를 트리거합니다. 이 기능은 FirmwareV1Group에서 디바이스를 제거하고 FirmwareV2Group에 추가합니다.

 

연속 배포 구성

 

디바이스의 펌웨어 버전을 V1에서 V2로 업데이트하기 위해 배포 그룹 FirmwareV1Group에서 연속 작업을 생성하는 방법을 살펴보았습니다. 디바이스를 FirmwareV1Group에서 제거하고 디바이스가 작업을 성공적으로 실행한 후 FirmwareV2Group에 추가하는 방법을 보여 주었습니다. 그렇다면 V2 디바이스를 V3으로 업데이트하는 것은 어떨까요?

 

디바이스 펌웨어를 최신 상태로 업데이트하려면 FirmwareV2Group 배포 그룹에서 다른continuous-job-V2-to-V3 연속 작업을 생성합니다. 또한 FirmwareV2Group에서 디바이스를 제거하고 FirmwareV3Group에 추가하도록 유사한 Lambda 함수를 구성합니다.

 

연속 작업은 증분 작업일 필요가 없습니다. 업데이트 모델이 증분 업데이트이든 특정 버전으로의 직접적인 업데이트이든 간에 디바이스를 원하는 상태로 만드는 연속 작업을 쉽게 생성할 수 있습니다. 예를 들어 사용할 수 있는 펌웨어 버전이 10가지(V1-V10)입니다. 일부 버전 간의 호환성 문제로 인해 V1, V2 및 V3은 V10이 아니라 V7으로만 직접 업데이트할 수 있습니다. 다른 모든 버전은 V10으로 직접 업데이트할 수 있습니다. 연속 작업을 사용하면 V1, V2 및 V3 배포 그룹에 대해 하나의 작업을 쉽게 설정하고 장치를 V7로 업데이트할 수 있습니다. V4-V9 배포 그룹에 대해 다른 작업을 설정하고 V10으로 디바이스를 업데이트할 수 있습니다. 최신 버전인 V11이 출시될 때 V10 배포 그룹에서 세 번째 연속 작업을 쉽게 생성하고 디바이스를 V11로 업데이트할 수 있습니다.

 

 

결론

 

작업에 대한 자세한 내용은 AWS IoT 개발자 안내서의 작업과 ‘AWS IoT 디바이스 관리와 함께 무선 업데이트 사용하기’ 블로그 글을 참조하십시오.

 

원문 URL: https://aws.amazon.com/ko/blogs/iot/using-continuous-jobs-with-aws-iot-device-management/

** 메가존 TechBlog는 AWS BLOG 영문 게재글중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.