CloudWatch Events による SSE SQS でのキューイング問題

CloudWatch Events による SSE SQS でのキューイング問題

Takahiro Iwasa
(岩佐 孝浩)
Takahiro Iwasa (岩佐 孝浩)
3 min read
CloudWatch Events 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 公式ドキュメントに関連情報を見つけることができませんでした。

Takahiro Iwasa
(岩佐 孝浩)

Takahiro Iwasa (岩佐 孝浩)

Software Developer at iret, Inc.
主に AWS を利用したクラウドネイティブアプリケーションの設計および開発をしています。 Japan AWS Top Engineers 2020-2023