AWS CDK の aws-iot-alpha モジュールでロギングが簡単に設定可能になりました

AWS CDK の aws-iot-alpha モジュールでロギングが簡単に設定可能になりました

Clock Icon2024.09.15

こんにちは、製造ビジネステクノロジー部の若槻です。

AWS CDK の最新のリリースで、下記のアップデートが追加されていました。

https://github.com/aws/aws-cdk/releases/tag/v2.158.0

iot: configure IoT Logging (#31352) (6348717), closes #31357

AWS IoT ではロギングを有効化することにより AWS IoT のアクティビティを CloudWatch Logs に記録させることができます。

https://docs.aws.amazon.com/iot/latest/developerguide/configure-logging.html

今回の AWS CDK のアップデートは、aws-iot-alpha モジュールでその AWS IoT のロギング設定が簡単に行えるようになったというものです。

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-iot-alpha-readme.html

留意点として、ここで設定可能なのは AWS IoT 全体のロギング設定であり、特定のモノやグループに対する設定はできません。

試してみた

CDK パッケージのアップデート

AWS CDK モジュールを v2.158.0 以上にアップデートします。

npm i aws-cdk-lib@latest aws-cdk@latest @aws-cdk/aws-iot-alpha@latest

CDK コード

AWS IoT のロギングを設定する CDK のコードは下記のようになります。

lib/cdk-sample-stack.ts
import * as iot from '@aws-cdk/aws-iot-alpha';
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class CdkSampleStack extends cdk.Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    new iot.Logging(this, 'Logging', {
      logLevel: iot.LogLevel.INFO,
    });
  }
}

設定可能なログレベルは上から順で次のようになります。既定値は ERROR です。上記では INFO に設定しています。

  • ERROR
  • WARN
  • INFO
  • DEBUG
  • DISABLED(ロギング無効)

デプロイ前の確認

前述の CDK の更新をデプロイする前の AWS IoT のロギングの設定は無効となっています。

CDK Diff は下記のようになります。

$ npx cdk diff
Stack CdkSampleStack
Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff)
IAM Statement Changes
┌───┬────────────────────────────────────────────────────────────────────────────────────────────────────┬────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────┬───────────────────────────┬───────────┐
│   │ Resource                                                                                           │ Effect │ Action                                                                                              │ Principal                 │ Condition │
├───┼────────────────────────────────────────────────────────────────────────────────────────────────────┼────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┼───────────────────────────┼───────────┤
│ + │ ${Logging/Role.Arn}                                                                                │ Allow  │ sts:AssumeRole                                                                                      │ Service:iot.amazonaws.com │           │
├───┼────────────────────────────────────────────────────────────────────────────────────────────────────┼────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┼───────────────────────────┼───────────┤
│ + │ arn:${AWS::Partition}:logs:${AWS::Region}:${AWS::AccountId}:log-group:AWSIotLogsV2:*               │ Allow  │ iot:DeleteV2LoggingLevel                                                                            │ AWS:${Logging/Role}       │           │
│   │                                                                                                    │        │ iot:GetLoggingOptions                                                                               │                           │           │
│   │                                                                                                    │        │ iot:GetV2LoggingOptions                                                                             │                           │           │
│   │                                                                                                    │        │ iot:ListV2LoggingLevels                                                                             │                           │           │
│   │                                                                                                    │        │ iot:SetLoggingOptions                                                                               │                           │           │
│   │                                                                                                    │        │ iot:SetV2LoggingLevel                                                                               │                           │           │
│   │                                                                                                    │        │ iot:SetV2LoggingOptions                                                                             │                           │           │
│   │                                                                                                    │        │ logs:CreateLogGroup                                                                                 │                           │           │
│   │                                                                                                    │        │ logs:CreateLogStream                                                                                │                           │           │
│   │                                                                                                    │        │ logs:PutLogEvents                                                                                   │                           │           │
│   │                                                                                                    │        │ logs:PutMetricFilter                                                                                │                           │           │
│   │                                                                                                    │        │ logs:PutRetentionPolicy                                                                             │                           │           │
└───┴────────────────────────────────────────────────────────────────────────────────────────────────────┴────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────┴───────────────────────────┴───────────┘
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)

Resources
[+] AWS::IAM::Role Logging/Role LoggingRoleF8CB8FA1
[+] AWS::IoT::Logging Logging Logging019093B9

✨  Number of stacks with differences: 1

デプロイ

前述の CDK コードでスタックのデプロイを行います。

デプロイ後に再度ロギング設定を確認すると、ログレベル Info で有効化されていました。

Info ログを記録してみる

実際に AWS IoT のロギングの動作を確認してみます。ここでは Info ログを記録してみます。

MQTT test client でトピックへのパブリッシュをします。

すると AWSIotLogsV2 という名前の CloudWatch Log groups が自動で作成されました。

ログレベル Info のイベントログがちゃんと記録されていますね。

ログレベルを Error に変更してみる

ログレベルを ERROR に変更して、詳細度 Warn 以下のログが記録されないようにしてみます。開発環境以外の環境でコスト削減のためにこのように敢えて詳細度を落とす場合があります。

lib/cdk-sample-stack.ts
import * as iot from '@aws-cdk/aws-iot-alpha';
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class CdkSampleStack extends cdk.Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    // AWS IoT のロギング設定
    new iot.Logging(this, 'Logging', {
      logLevel: iot.LogLevel.ERROR, // ログレベルを ERROR に設定
    });
  }
}

CDK Diff は次のようになります。

$ npx cdk diff
Stack CdkSampleStack
Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff)
Resources
[~] AWS::IoT::Logging Logging Logging019093B9
 └─ [~] DefaultLogLevel
     ├─ [-] INFO
     └─ [+] ERROR

✨  Number of stacks with differences: 1

デプロイをして AWS IoT のロギング設定を確認すると、ログレベルが Error に変更されています。least verbosity とあるのはログの記録が最もされにくいためでしょうか。

その後は 2024-09-15T07:45:04.153Z を最後にログレベル Infor ログが記録されなくなりました。ログレベルの Error への変更が効いているようです。

Log groups を事前に CDK で作成する

出力先の CloudWatch Log groups は保持期間 1 ヶ月のものが自動作成されていましたが、CDK で指定の保持期間のものを事前に作成することもできます。参考までにその場合の CDK コードは下記のようになります。

lib/cdk-sample-stack.ts
import * as iot from '@aws-cdk/aws-iot-alpha';
import * as logs from 'aws-cdk-lib/aws-logs';
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class CdkSampleStack extends cdk.Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    // ロググループ AWSIotLogsV2 の作成
    new logs.LogGroup(this, 'AWSIotLogsV2', {
      logGroupName: 'AWSIotLogsV2',
      retention: logs.RetentionDays.TWO_WEEKS,
    });

    // AWS IoT のロギング設定
    new iot.Logging(this, 'Logging', {
      logLevel: iot.LogLevel.ERROR,
    });
  }
}

すでに同名の Log groups が作成されている場合はデプロイがエラーになるので注意してください。

おわりに

AWS IoT のロギング設定が AWS CDK で簡単に行えるようになったので試してみました。

以下の記事にある通りポリシーやアクションの不備でトピックの利用がうまく行えない場合などのデバッグに便利なので、有効化しておくことをお勧めします。

https://dev.classmethod.jp/articles/aws-iot-with-cloudwatch-logs/

以上

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.