CloudWatch Events による SSE SQS でのキューイング問題
CloudWatch Events を使用して SSE SQS にメッセージをキューイングする際に、メッセージが正しくキューに入らないという問題が発生しました。 備忘録として残します。
AWS リソース作成
以下の CloudFormation テンプレートを使用してください。 CloudWatch Events は、 cron 式を使用して毎分実行されるようにしています(16行目)。
AWSTemplateFormatVersion: "2010-09-09"
Description: Example of CloudWatch Events not queueing to SSE SQS
Resources:
SQS:
Type: AWS::SQS::Queue
Properties:
KmsDataKeyReusePeriodSeconds: 86400
KmsMasterKeyId: alias/aws/sqs
MessageRetentionPeriod: 1209600
QueueName: sse-sqs-for-cloudwatch-events
Events:
Type: AWS::Events::Rule
Properties:
Name: cloudwatch-events-test
ScheduleExpression: 'cron(0/1 * * * ? *)'
State: ENABLED
Targets:
- Arn: !GetAtt SQS.Arn
Id: cloudwatch-events-test
QueuePolicy:
Type: AWS::SQS::QueuePolicy
Properties:
PolicyDocument:
Version: '2012-10-17'
Id: !Sub
- ${SqsArn}/SQSDefaultPolicy
- {SqsArn: !GetAtt SQS.Arn}
Statement:
- Sid: !Sub
- AWSEvents_${SqsName}_Id123456789012
- {SqsName: !GetAtt SQS.QueueName}
Effect: Allow
Principal:
Service: events.amazonaws.com
Action: sqs:SendMessage
Resource: !GetAtt SQS.Arn
Condition:
ArnEquals:
aws:SourceArn: !GetAtt Events.Arn
Queues:
- !Ref SQS
以下のコマンドを使用して CloudFormation スタックをデプロイしてください。
aws cloudformation deploy --template template.yaml --stack-name cloudwatch-events-test
テスト
CloudWatch Events
次のコマンドで CloudWatch Events ルールを確認してください。
aws events describe-rule --name cloudwatch-events-test
{
"Name": "cloudwatch-events-test",
"Arn": "arn:aws:events:<YOUR_REGION>:<YOUR_ACCOUNT_ID>:rule/cloudwatch-events-test",
"ScheduleExpression": "cron(0/1 * * * ? *)",
"State": "ENABLED",
"EventBusName": "default",
"CreatedBy": "<YOUR_ACCOUNT_ID>"
}
SQS
利用可能なメッセージ数を確認してください。ゼロが表示されるはずです。
aws sqs get-queue-url --queue-name sse-sqs-for-cloudwatch-events
{
"QueueUrl": "https://sqs.<YOUR_REGION>.amazonaws.com/<YOUR_ACCOUNT_ID>/sse-sqs-for-cloudwatch-events"
}
aws sqs get-queue-attributes \
--queue-url https://sqs.<YOUR_REGION>.amazonaws.com/<YOUR_ACCOUNT_ID>/sse-sqs-for-cloudwatch-events \
--attribute-names ApproximateNumberOfMessages
{
"Attributes": {
"ApproximateNumberOfMessages": "0"
}
}
SSE SQS を SQS に更新
CloudFormation テンプレートで KmsDataKeyReusePeriodSeconds
および KmsMasterKeyId
をコメントアウトし、スタックを更新してください。
--- Sun Oct 10 17:31:16 2021 UTC
+++ Sun Oct 10 17:31:16 2021 UTC
@@ -4,8 +4,8 @@
SQS:
Type: AWS::SQS::Queue
Properties:
- KmsDataKeyReusePeriodSeconds: 86400
- KmsMasterKeyId: alias/aws/sqs
+# KmsDataKeyReusePeriodSeconds: 86400
+# KmsMasterKeyId: alias/aws/sqs
MessageRetentionPeriod: 1209600
QueueName: sse-sqs-for-cloudwatch-events
スタックが正常に更新されたら、もう一度、利用可能なメッセージ数を確認してください。増加しているはずです。
aws sqs get-queue-url --queue-name sse-sqs-for-cloudwatch-events
{
"QueueUrl": "https://sqs.<YOUR_REGION>.amazonaws.com/<YOUR_ACCOUNT_ID>/sse-sqs-for-cloudwatch-events"
}
aws sqs get-queue-attributes \
--queue-url https://sqs.<YOUR_REGION>.amazonaws.com/<YOUR_ACCOUNT_ID>/sse-sqs-for-cloudwatch-events \
--attribute-names ApproximateNumberOfMessages
{
"Attributes": {
"ApproximateNumberOfMessages": "1"
}
}
クリーンアップ
以下のコマンドを使用して、プロビジョニングされた AWS リソースを削除してください。
aws cloudformation delete-stack --stack-name cloudwatch-events-test
まとめ
CloudWatch Events を SSE SQS をターゲットとして構成する場合、追加の設定が必要かもしれません。 残念ながら、 AWS 公式ドキュメントに関連情報を見つけることができませんでした。