DynamoDB StreamsのCloudWatch AlarmをCloudFormationで作る

ARNの時刻情報をGetします。
2022.05.30

DynamoDB StreamsのARNは、時刻情報を含んでいます。 そのため、複数のAWSアカウントでCloudWatch Alarmを作る場合は、DynamoDB StreamsのANRから時刻情報を取得する必要があります。

arn:aws:dynamodb:(略)/dynamodb-streams-sample-table/stream/2022-05-30T06:37:33.209

というわけで、やってみました。

おすすめの方

  • DynamoDB StreamsのCloudWatch AlarmをCloudFormationで作りたい方

DynamoDB StreamsとLambdaとCloudWatch Alarmをデプロイする

DynamoDB Streamsで起動するLambdaも作成していますが、動作確認としてSuccessfulRequestLatencyメトリクスを反映させるためです。

sam init

sam init \
    --runtime python3.9 \
    --name DynamoDB-Streams-Alarm-Sample \
    --app-template hello-world \
    --package-type Zip

AWS SAMテンプレート

DynamoDB StreamsのARNを/で分離し、3番目の要素を取得しています。(要素数は0始まり)

sample.yaml

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: DynamoDB-Streams-Alarm-Sample

Resources:
  SampleTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: dynamodb-streams-sample-table
      BillingMode: PAY_PER_REQUEST
      AttributeDefinitions:
        - AttributeName: todoId
          AttributeType: S
      KeySchema:
        - AttributeName: todoId
          KeyType: HASH
      StreamSpecification:
        StreamViewType: NEW_AND_OLD_IMAGES

  SampleTableSuccessfulRequestLatencyAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmName: dynamodb-streams-sample-table-successful-request-latency-alarm
      Namespace: AWS/DynamoDB
      Dimensions:
        - Name: TableName
          Value: dynamodb-streams-sample-table
        - Name: StreamLabel
          Value: !Select [3, !Split ['/', !GetAtt SampleTable.StreamArn]]
        - Name: Operation
          Value: GetRecords
      MetricName: SuccessfulRequestLatency
      ComparisonOperator: GreaterThanOrEqualToThreshold
      Period: 60
      EvaluationPeriods: 1
      Statistic: Average
      Threshold: 60000  # 60s
      TreatMissingData: notBreaching


  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.9
      Architectures:
        - x86_64
      Events:
        SampleTable:
          Type: DynamoDB
          Properties:
            BatchSize: 100
            BisectBatchOnFunctionError: true
            MaximumRetryAttempts: 3
            StartingPosition: TRIM_HORIZON
            Stream: !GetAtt SampleTable.StreamArn

  HelloWorldFunctionLogGroup:
      Type: AWS::Logs::LogGroup
      Properties:
        LogGroupName: !Sub /aws/lambda/${HelloWorldFunction}

Lambdaコード

app.py

def lambda_handler(event, context):
    for record in event['Records']:
        print(record)

デプロイ

sam build

sam deploy \
    --stack-name DynamoDB-Streams-Alarm-Sample-Stack \
    --s3-bucket cm-fujii.genki-deploy \
    --capabilities CAPABILITY_NAMED_IAM \
    --no-fail-on-empty-changeset

CloudWatch Alarmができた

バッチリですね

CloudWatch Alarmができた

参考