LoginSignup
0
2

More than 3 years have passed since last update.

AWS IoT Core Job 基本操作

Last updated at Posted at 2021-02-20

Job基本動作

image-20210220112425258.png

1.Job document を格納

Job documentは、以下のようなJSON形式のファイルで、デバイスに対する指示内容を記載したもの

   {
     "operation": "update"
   }

2.デバイスでダウンロードしたいファイルを格納

デバイスでダウンロードしたいファイルがない場合は本手順不要
デバイスでダウンロードしたいファイルがある場合はS3にファイルを格納すると共に、
S3のURLをJob documentに記載する、URLは以下の形式で記載する

   ${aws:iot:s3-presigned-url:https://s3.amazonaws.com/bucket/key} # bucket,keyは置き換える

この形式で記載することでJobが実行されたタイミング(デバイスに対してJob documentの内容が通知されるタイミング)で署名付きURLに変換される
以下Job document

   {
     "operation": "update",
     "url": "${aws:iot:s3-presigned-url:https://s3.amazonaws.com/test-bucket/folder/job.zip}"
   }

3.Job を作成

Jobの作成は、Job IDJobの対象Jobのタイプを指定する

  • Job ID:Jobを識別するもの、値は任意、デバイスにも通知される
  • Jobの対象:Jobを実行する対象、モノまたはグループを選択可能
  • Jobのタイプsnapshotまたはcontinuous
    • snapshot:Job作成時に指定したJobの対象にJobが実行される
    • continuous:Job作成時に指定したJobの対象(グループ)と、Job作成後に指定したJobの対象(グループ)に追加されたモノに対してJobが実行される

4.Job document の内容を通知

Jobを作成するとデバイスに対してJob IDJob documentの内容が通知される

5.Job document の内容に応じた処理を実行

6.ファイルダウンロード等

デバイスはJob documentの内容に応じてファイルダウンロード等の処理を実行する

7.Job 状態の通知

デバイスはJobの実行結果をIoT Coreに対して通知する

Job状態

Jobの状態はマネジメントコンソール上で以下のように表示される

image-20210220145019980.png

Job生成時は、Jobの対象モノ数分キュー状態となる
デバイスがJobを開始すると進行中となり、
デバイスからの状態更新によって各状態のモノ数が変化する

デバイス側のJob操作

ジョブデバイス MQTT および HTTPS APIs
デバイスでJob関連の通知を受けるために各種TopicのSubscribe、Jobの開始、状態更新を行うために各種TopicのPublishが必要となる
※TOPICに含まれるthingNamejobIdは適切なものに置き換える

Job追加等の変化検出

Pub/Sub:Subscribe
コマンド:NextJobExecutionChanged
TOPIC:$aws/things/thingName/jobs/notify-next

保留中Job開始

Pub/Sub:Publish
コマンド:StartNextPendingJobExecution
TOPIC:$aws/things/thingName/jobs/start-next

デバイスがオンライン時にJobが追加された場合は、NextJobExecutionChangedでJobの追加を検出し保留中Job開始を行う
デバイスがオフライン時にJobが追加された場合は、デバイス起動時に保留中Job開始を行う

$aws/things/thingName/jobs/start-nextPublish専用Topicのため、ルールを使用してLambda等で受けることはできない(予約済みトピック

保留中Job開始結果の取得

Pub/Sub:Subscribe
コマンド:StartNextPendingJobExecution
TOPIC(成功時):$aws/things/thingName/jobs/start-next/accepted
TOPIC(失敗時):$aws/things/thingName/jobs/start-next/rejected

$aws/things/thingName/jobs/start-next/acceptedに以下のようにjobIdjobDocumentが通知される

{
  "execution" : {
    "jobId" : "022",
    "thingName" : "MyThing",
    "jobDocument" : "< contents of job document >",
    "status" : "IN_PROGRESS",
    "queuedAt" : 1489096123309,
    "lastUpdatedAt" : 1489096123309,
    "versionNumber" : 1,
    "executionNumber" : 1234567890
},
  "clientToken" : "client-1",
  "timestamp" : 1489088524284,
}

Job状態更新

Pub/Sub:Publish
コマンド:UpdateJobExecution
TOPIC:$aws/things/thingName/jobs/jobId/update

TopicでJobIdを指定し、ペイロードのstatusにIN_PROGRESS、FAILED、SUCCEEDED、または REJECTEDを指定しJob状態の更新を行う

$aws/things/thingName/jobs/jobId/updatePublish専用Topicのため、ルールを使用してLambda等で受けることはできない(予約済みトピック

Job状態更新結果の取得

Pub/Sub:Subscribe
コマンド:UpdateJobExecution
TOPIC(成功時):$aws/things/thingName/jobs/jobId/update/accepted
TOPIC(失敗時):$aws/things/thingName/jobs/jobId/update/rejected

AWS側のJob操作

ジョブ管理と制御の API
Boto3 API

Job作成(create_job

パラメータdocumentを指定することで、事前にJob documentを作成してS3に格納する必要はない
以下コード例

document = {
  'operation': 'update',
  'version': version,
  'url': '${aws:iot:s3-presigned-url:https://s3.amazonaws.com/%s/%s}' % (FirmwareBucketName, S3key)
}
target = f'arn:aws:iot:{REGION}:{ACCOUNT_ID}:thing/{thingName}'
iotClient.create_job(
  jobId = jobId,
  targets = [target],
  document = json.dumps(document),
  targetSelection = 'SNAPSHOT',
  presignedUrlConfig={
      'roleArn': RoleArn,
      'expiresInSec': 3600
  }

Job状態の取得(describe_job_execution

thingNameまで限定したJob状態の取得
以下コード例

response = iotClient.describe_job_execution(
  jobId = jobId,
  thingName = thingName
)
status = response['execution']['status']
0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2