この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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ができた
バッチリですね