Job基本動作
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 ID、Jobの対象、Jobのタイプを指定する
-
Job ID:Jobを識別するもの、値は任意、デバイスにも通知される -
Jobの対象:Jobを実行する対象、モノまたはグループを選択可能 -
Jobのタイプ:snapshotまたはcontinuous-
snapshot:Job作成時に指定したJobの対象にJobが実行される -
continuous:Job作成時に指定したJobの対象(グループ)と、Job作成後に指定したJobの対象(グループ)に追加されたモノに対してJobが実行される
-
4.Job document の内容を通知
Jobを作成するとデバイスに対してJob ID、Job documentの内容が通知される
5.Job document の内容に応じた処理を実行
6.ファイルダウンロード等
デバイスはJob documentの内容に応じてファイルダウンロード等の処理を実行する
7.Job 状態の通知
デバイスはJobの実行結果をIoT Coreに対して通知する
Job状態
Jobの状態はマネジメントコンソール上で以下のように表示される
Job生成時は、Jobの対象モノ数分キュー状態となる
デバイスがJobを開始すると進行中となり、
デバイスからの状態更新によって各状態のモノ数が変化する
デバイス側のJob操作
ジョブデバイス MQTT および HTTPS APIs
デバイスでJob関連の通知を受けるために各種TopicのSubscribe、Jobの開始、状態更新を行うために各種TopicのPublishが必要となる
※TOPICに含まれるthingName、jobIdは適切なものに置き換える
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-nextはPublish専用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に以下のようにjobId、jobDocumentが通知される
{
"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/updateはPublish専用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操作
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']

