Amazon SQS 구독을 통해 Amazon SNS 주제로부터 알림을 성공적으로 수신하려면 어떻게 해야 하나요?

5분 분량
0

Amazon Simple Queue Service(Amazon SQS) 구독이 Amazon Simple Notification Service(Amazon SNS) 주제로부터 알림을 수신할 수 없습니다.

간략한 설명

시작하기 전에 SNS 주제에 대한 Amazon CloudWatch 전송 상태 로깅을 구성합니다. 자세한 내용은 ](https://docs.aws.amazon.com/sns/latest/dg/sns-monitoring-using-cloudwatch.html)CloudWatch를 사용하여 Amazon SNS 주제 모니터링[을 참조합니다.

참고:

  • 임계값 위반 경고에 대한 자세한 내용은 Amazon SNS 지표에 CloudWatch 알람 설정을 참조합니다.
  • 엔드포인트로의 메시지 전송 상태에 대한 자세한 내용은 AWS Management Console을 사용하여 전송 상태 로깅 구성을 참조합니다.
  • 전송 상태를 확인하려면, CloudWatch에서 해당 주제의 전송 로그에 액세스합니다. 메시지가 대기열로 전송되었는지 확인하려면, SNS 주제의 NumberOfMessagesPublishedNumberOfNotificationsDelivered 지표를 Amazon SQS 대기열의 NumberOfMessagesSent CloudWatch 지표와 비교합니다.

해결 방법

구독 상태 확인

구독이 확인됨 상태이고 확인 보류 중 또는 삭제됨 상태가 아님을 확인합니다. 상태가 확인 보류 중인 경우, 구독을 확인합니다. 상태가 삭제됨인 경우, 삭제된 구독을 다시 생성합니다.

구독이 확인됨 상태인데 메시지가 대기열로 전송되지 않는 이유는 다음과 같습니다.

  • SQS 대기열의 액세스 정책 또는 AWS Key Management Service(KMS) 키 정책을 구성하지 않았습니다.
  • 메시지가 필터링되었습니다.
  • 선입선출(FIFO) 주제에 대한 메시지 중복이 제거되었습니다.
  • 구독에 원시 메시지 전송을 활성화했습니다.
  • 메시지가 전송되었지만, Amazon SQS에 메시지가 표시되지 않습니다.

액세스 거부 오류 발생

Amazon SNS가 메시지를 보낼 수 있도록 SQS 대기열의 액세스 정책 구성

SQS 대기열의 액세스 정책을 보려면, 액세스 정책을 구성합니다.

SQS 대기열의 액세스 정책에 SNS 주제에 대한 SendMessage API 작업이 포함되어 있지 않은 경우, 올바른 권한으로 정책을 업데이트합니다. 권한은 Amazon SNS가 SQS 대기열에 메시지를 보낼 수 있도록 허용해야 합니다.

SQS 대기열에서 SSE와 함께 작동하도록 AWS KMS 키 정책 구성

SQS 대기열에 대해 서버 측 암호화(SSE)가 설정된 경우, 다음 단계를 따릅니다.

1.    AWS KMS 키가 활성화되어 있는지 확인합니다.

2.    SQS 대기열이 고객 관리형 KMS 키를 사용하는지 확인합니다. 키 정책은 kms:Decryptkms:GenerateDataKey 권한을 SNS 주제에 부여해야 합니다.

참고: AWS 관리형 키교차 계정 구독에 사용할 수 없습니다.

3.    Amazon SNS 서비스가 kms:GenerateDataKeykms:Decrypt API 작업을 수행할 수 있게 하려면, KMS 키 정책에 다음 문을 추가합니다.

{    "Sid": "Allow Amazon SNS to use this key",
    "Effect": "Allow",
    "Principal": {
        "Service": "sns.amazonaws.com"

    },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey*"
    ],
    "Resource": "*"
}

KMS 키 정책이 Amzon SNS 보안 주체에 대한 액세스 권한을 부여하지 않는 경우, 메시지 전송 상태 로그에 KMS.AccessDeniedException 오류가 표시됩니다.

{    "notification": {
        "messageMD5Sum": "9ecb1c62c0de86ac894c5fd6c447fe1f",
        "messageId": "f762cbcb-8643-5ef3-95c8-9739fe5f07f6",
        "topicArn": "arn:aws:sns:::",
        "timestamp": "2023-06-01 10:41:32.114"
    },
    "delivery": {
        "deliveryId": "f7a48fb3-1d98-5fe8-ae45-d34165842b39",
        "destination": "arn:aws:sqs:::",
        "providerResponse": "{\"ErrorCode\":\"KMS.AccessDeniedException\",\"ErrorMessage\":\"null (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: 00df5c7d-1834-4cfb-bc05-e5a7fccfa816; Proxy: null)\",\"sqsRequestId\":\"Unrecoverable\"}",
        "dwellTimeMs": 59,
        "statusCode": 400
    },
    "status": "FAILURE"
}

자세한 내용은 Amazon SNS 주제에 게시한 메시지가 서버 측 암호화가 활성화된 구독 Amazon SQS 대기열로 전송되지 않는 이유는 무엇인가요?를 참조합니다.

메시지가 필터링됨

CloudWatch 콘솔에서 Amazon SNS의 CloudWatch 지표를 확인합니다. 메시지가 필터링되었는지 확인하려면, NumberOfNotificationsFilteredOut 지표를 확인합니다. 메시지가 필터링된 경우, SQS 대기열의 SNS 주제 구독 필터 정책을 확인합니다.

SNS 주제 구독 정책을 확인하려면, 다음 단계를 완료합니다.

1.    Amazon SNS 콘솔을 엽니다.

2.    탐색 창에서 구독을 선택합니다.

3.    구독을 선택한 후 편집을 선택합니다.

4.    구독 필터 정책 섹션을 확장합니다. 메시지 속성 또는 메시지 본문SNS 구독 필터 정책 범위와 일치하는지 확인합니다. 속성 또는 본문이 일치하지 않는 경우, 필터 정책을 업데이트합니다.

5.    변경 사항 저장을 선택합니다.

자세한 내용은 Amazon SNS 메시지 필터링을 참조합니다.

메시지 중복 제거됨

Amazon SNS FIFO 주제 및 Amazon SQS FIFO 대기열은 메시지 내용 또는 중복 제거 ID를 기반으로 메시지 중복 제거를 지원합니다. 주제에 ContentBasedDeduplication이 설정된 경우, 시스템은 메시지 내용을 기반으로 MessageDeduplicationId를 생성합니다. 주제에 ContentBasedDeduplication이 설정되어 있지 않은 경우, 주제에 게시된 모든 메시지에는 고유한 MessageDeduplicationId가 있어야 합니다.

5분 중복 제거 간격 내에 SNS 주제에 게시된 메시지의 중복을 제거하려면, MessageDeduplicationId 파라미터를 사용합니다. 자세한 내용은 FIFO 주제에 대한 메시지 중복 제거를 참조합니다.

구독에 원시 메시지 전송 활성화

원시 메시지 전송을 사용하는 경우, 게시된 알림에서 보내는 메시지 속성이 10개 이하인지 확인합니다. 원시 메시지 전송이 활성화된 메시지의 경우, Amazon SNS가 메시지 속성을 SQS 메시지 속성에 매핑합니다.

다음은 10개 이상의 메시지 속성이 있는 전송 상태 로그의 예입니다.

{    "notification": {
        "messageMD5Sum": "8fa14cdd754f91cc6554c9e71929cce7",
        "messageId": "22540375-973d-5c6d-8d9e-5f870de34c49",
        "topicArn": "arn:aws:sns:<region>:<account>:<topic name>",
        "timestamp": "2023-06-01 13:09:50.947"
    },
    "delivery": {
        "deliveryId": "9ccf7066-19e5-5bbb-a973-2c94833bc5fc",
        "destination": "arn:aws:sqs:<region>:<account>:<queue name>",
        "providerResponse": "{\\"ErrorCode\\":\\"InvalidParameterValue\\",\\"ErrorMessage\\":\\"Number of message attributes \[13\] exceeds the allowed maximum \[10\].\\",\\"sqsRequestId\\":\\"Unrecoverable\\"}",
        "dwellTimeMs": 31,
        "statusCode": 400
    },
    "status": "FAILURE"
}

메시지가 전송되었지만, Amazon SQS에 메시지가 표시되지 않음

메시지가 대기열에 전송되었지만, 다음과 같은 이유로 인해 폴링에 사용할 수 없을 수 있습니다.

SQS 콘솔에서 SNS 구독이 보이지 않음

SNS 주제 계정에서 SQS 구독을 생성한 경우, SQS 콘솔에서 구독을 볼 수 없습니다. SNS 계정이 구독을 소유하므로 SNS 콘솔에서만 구독을 볼 수 있기 때문입니다.

Amazon SQS 콘솔에서 SNS 구독을 생성한 경우, SQS 주제 계정이 구독을 소유합니다. 그러면 SNS 콘솔과 SQS 콘솔에서 SNS 구독을 확인할 수 있습니다.

SNS 주제 구독에서 SQS 구독이 보이지 않음

이 문제는 동일한 이름의 SNS 주제를 삭제하고 다시 생성한 후, SQS 구독을 삭제하지 않을 경우에 발생합니다. 구독 목록 또는 SNS ListSubscriptions API 호출에서 SNS 콘솔의 SQS 구독을 확인할 수 있습니다. 작업이 수행된 타임스탬프를 확인하려면, DeleteTopicCreateTopic SNS API 호출에 대한 AWS CloudTrail 이벤트를 검토하세요.

관련 정보

교차 계정 Amazon SQS 엔드포인트를 Amazon SNS 주제에 맞게 구성하려면 어떻게 해야 하나요?

AWS 공식
AWS 공식업데이트됨 6달 전