はじめに
とあるIoT機器からAWSへ送信されるデータを、AWS IoT Core経由でAmazon S3へ保存する機会に恵まれ、Amazon S3のオブジェクトキーに日本標準時の日付を使用する方法をまとめた。
条件
- AWS CLIをインストール済み
- AWS IoT CoreにアタッチするIAMロールを作成済み
- Amazon S3を作成済み
方法
ルールを記述するペイロードファイルのAmazon S3オブジェクトキー記述部分にAWS IoT SQL Functionのtimestamp()
とparse_time(String, Long[, String])
を用いる。
ペイロードファイル(JSONフォーマット)
.json
{
"awsIotSqlVersion": "2016-03-23",
"sql": "SELECT * FROM 'topic/name'",
"ruleDisabled": false,
"actions": [
{
"s3": {
"roleArn": "role_name",
"bucketName": "bucket-name",
"key": "${parse_time('yyyyMMddHHmmss', timestamp(), 'Asia/Tokyo')}"
}
}
]
}
ペイロードファイルの解説
-
sql
キー: AWS IoT Coreでの受信データをフィルターしている。topic/name
部分を各々の環境に合わせた書換えが必要。 -
"ruleDisabled"
キー: ルールの有効/無効設定。有効化する場合は値にfalse
を記述する。 -
roleArn
キー: 値にIAMロールのARNを入力する。IAMロールは各々の環境に合わせて別途作成しておく必要がある。 -
"key"
キー: 値にオブジェクトキーを記述する。"Literal"
のように固定のキーを記述することも可能だが、ここでは関数が使用できて現在日付のように動的にオブジェクトキーを生成することができる。オブジェクトキーにストアした現在日本標準時を含めたい場合は、2つの関数timestamp()
とparse_time(String, Long[, String])
を使用して日付を取得する。timestamp()
はミリ秒単位のUTC時刻を返す。parse_time(String, Long[, String])
の第一引数にjoda-Timeフォーマットで日付パターン、第二引数にミリ秒単位でUNIX時刻、第三引数にタイムゾーンを指定すると第一引数で指定したパターンに従って日付を返す。上記ペイロードファイルの例では、現在時刻が日本標準時の2021年11月1日11時11分11秒場合、Amazon S3に20211101111111
のオブジェクトキーがストアされる。オブジェクトキーを西暦、月で区切りたい場合はペイロードファイル"key"
の列を下記のように記述すればよい。
"key": "${parse_time("yyyy", timestamp(), "Asia/Tokyo")}/${parse_time("MM", timestamp(), "Asia/Tokyo")}/file_name"
ルールの生成
$ aws iot create-topic-rule --rule-name rule_name --topic-rule-payload file://file_name.json
上記のコマンドを実行するとルールが生成される。rule_name
, file_name.json
部分は各々の環境に合わせて書換えが必要。