AWS IoTのCloudWatch Logsログ出力を新形式にアップグレードする

AWS Key Management Service (AWS KMS) カスタマーマスターキー (CMK) を利用すると、CloudWatch Logs のログデータを暗号化できます。
2018.12.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS IoTではデバイスから送信されたメッセージをCloudWatch Logsにロギング出来ます。 本機能は、2017年11月29日頃から新しいメッセージ形式でも出力できるようになりました。

本ブログでは、旧形式で出力されているログを新形式に変更する方法を紹介します。

アップグレードの狙い

新旧のログ出力の機能の違い

旧形式 新形式
フォーマット プレーンテキスト JSON
ログレベル ログ記録レベルはグローバルに1種類のみ 特定のモノのグループごとにログ記録レベルを指定可能
ログ記録のレイテンシー 高い 低い
API set-logging-options
get-logging-options
set-v2-logging-level
set-v2-logging-options
get-v2-logging-options
delete-v2-logging-level
APIコマンドの強化予定 なし あり
CloudWatch ロググループ AWSIotLogs AWSIotLogsV2

旧形式のコマンドは更新予定がなく、新形式は機能が豊富であることから、AWS管理コンソールの AWS IOTコア→設定に移動すると、次のキャプチャーのようにアップグレードを促すメッセージが表示されます。

旧形式でログ出力されるケース

新形式リリース後にログ出力を有効すると、新形式でログ出力されます。

以下の様なケースでは、ログが旧形式で出力されます。

  • 新形式リリース前にログ出力を有効化
  • 旧ログ形式向けAPI(set-logging-options)を利用してログ出力を有効化

現在のログバージョンの確認

管理コンソールから確認

管理コンソールからAWS IOTコア→設定と遷移し、ログ形式アップグレードのメッセージが表示される場合、旧形式でログ出力されています。

ダブルチェックのため、以下も確認してください。

CloudWatch Logsで

  • ロググループが AWSIotLogs
  • ログフォーマットがJSONではなくプレーンテキスト

API から確認

旧形式でログ設定されている場合、ログ設定を確認する API を投げたときに、旧形式は設定がかえり、新形式は NotConfiguredException エラーが発生します。

# 旧形式向け
$ aws iot get-logging-options
{
    "roleArn": "arn:aws:iam::205974338614:role/service-role/AWSIoTLogging",
    "logLevel": "INFO"
}

# 新形式向け
$ aws iot get-v2-logging-options

An error occurred (NotConfiguredException) when calling the GetV2LoggingOptions operation: SetV2LoggingOptions was not previously called. No logging options have been set.

ログ形式のアップグレード

管理コンソールからアップグレード

管理コンソールからAWS IOTコア→設定と遷移し、ログ形式アップグレードのメッセージが表示される場合、「アップグレード」のボタンを押すだけでアップグレード完了です。

旧形式のログレベルによらず、「警告(WARN)」レベルで有効化されるようです。 ログレベルは適宜修正してください。

API からアップグレード

iot set-v2-logging-options API を使い、

  • AWS IoTがCloudWatch Logsにログ出力するためのロールのARN(旧ログのロールを使いまわしてOK)
  • デフォルトログレベル

を指定します。

$ aws iot set-v2-logging-options \
  --role-arn arn:aws:iam::12345:role/service-role/AWSIoTLogging \
  --default-log-level WARN

アップデート後

$ aws iot get-v2-logging-options
{
    "roleArn": "arn:aws:iam::12345:role/service-role/AWSIoTLogging",
    "defaultLogLevel": "WARN",
    "disableAllLogs": false
}

ログフォーマットの違い

参考までに、ログフォーマットの違いを確認します。

旧形式のログ出力例

旧形式はプレーンテキストです

2018-12-22 15:18:06.252 TRACEID:75f582b5-7849-b94a-aea3-b11c9b15eedc PRINCIPALID:XXX [INFO] EVENT:MQTTClient Subscribe TOPICNAME:$aws/events/presence/connected/MyIoTDevice MESSAGE:Subscribe Status: SUCCESS
2018-12-22 15:18:06.252 TRACEID:75f582b5-7849-b94a-aea3-b11c9b15eedc PRINCIPALID:XXX [INFO] EVENT:MQTTClient Subscribe MESSAGE: IpAddress: 2003:45:4636:... SourcePort: 52599

新形式のログ出力例

新形式はJSONペイロードです。

{ 
 "timestamp": "2017-08-10 15:39:30.961", 
 "logLevel": "INFO", 
 "traceId": "672ec480-31ce-fd8b-b5fb-22e3ac420699", 
 "accountId": "123456789012", 
 "status": "Success", 
 "eventType": "Publish-In", 
 "protocol": "MQTT", 
 "topicName": "$aws/things/MyThing/shadow/get", 
 "clientId": "abf27092886e49a8a5c1922749736453", 
 "principalId": "145179c40e2219e18a909d896a5340b74cf97a39641beec2fc3eeafc5a932167", 
 "sourceIp": "205.251.233.181", 
 "sourcePort": 13490 
}

参考