CloudWatch 경보가 트리거될 때 Amazon SNS가 내 Lambda 함수를 호출하지 않는 이유는 무엇인가요?

4분 분량
0

Amazon CloudWatch 경보가 트리거될 때 Amazon Simple Notification Service(Amazon SNS)에서 AWS Lambda 함수를 호출하도록 하려고 합니다.

간략한 설명

다음 시나리오에서는 Lambda 함수를 호출할 수 없습니다.

  • Lambda 함수의 리소스 정책이 SNS 주제에서 함수를 호출할 수 있는 액세스 권한을 부여하지 않았습니다. 이 시나리오에서는 Lambda 함수의 리소스 기반 정책 문서 확인 섹션의 단계를 완료하세요.
  • Lambda 함수 호출이 지연되었습니다. 이 시나리오에서는 Amazon SNS 전송 로그 확인 섹션의 단계를 완료하세요.

참고: 이 해결 방법은 사용자가 SNS 주제에 대해 Publish API를 호출할 수 있다고 가정하지만 Amazon SNS와 Lambda 통합 간에 오류가 발생합니다. SNS 주제에서 어떤 활동도 볼 수 없다면, CloudWatch 경보 트리거에 대한 SNS 알림을 받지 못한 이유는 무엇인가요?를 참조하세요. 이 활동에는 다음과 같은 CloudWatch 지표가 포함될 수 있습니다. NumberOfMessagesPublished, NumberOfNotificationsDelivered, 또는 NumberOfNotificationsFailed

해결 방법

참고: AWS Command Line Interface(AWS CLI) 명령 실행 시 오류가 발생하는 경우, AWS CLI 오류 문제 해결을 참고하세요. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하세요.

Lambda 함수의 리소스 기반 정책 문서를 확인하세요.

Amazon SNS가 Lambda 함수를 비동기적으로 호출하면, Lambda는 202 HTTP 상태 코드를 다시 Amazon SNS에 반환합니다. 상태 코드는 Lambda가 이후 처리를 위해 메시지를 수락했음을 보여줍니다. 자세한 내용을 보려면 비동기 호출을 참조하세요. 응답이 실패하면 Amazon SNS 전송 로그에서 자세한 내용을 확인하세요.

계정의 시나리오를 기반으로 해상도를 선택합니다.

SNS 주제와 Lambda 함수가 동일한 계정에 있는 경우:

1.    Lambda 콘솔을 엽니다.

2.    탐색 창에서 함수를 선택한 다음 함수를 선택합니다.

3.    구성 탭을 선택하고 권한을 선택합니다.

4.    리소스 기반 정책 섹션의 명세서 ID 열에서 정책 설명을 선택하여 정책 문서를 확인합니다. 다음과 같은 정책 문서를 볼 수 있습니다.

statement id
your-statement-id

principal:
sns.amazonaws.com

effect
allow

action
Lambda:InvokeFunction

conditions
{ "arnlike": { "aws:sourcearn": "arn:aws:sns:your-aws-region:your-aws-account-id:your-sns-topic-name" }

참고: JSON에서 정책 문서를 보려면, 리소스 기반 정책 섹션에서 정책 문서 보기를 선택합니다.

Amazon SNS에 함수를 호출할 수 있는 액세스 권한을 부여하는 Lambda 리소스 정책이 없는 경우 정책 문서에 다음 함수를 추가하세요. Lambda 콘솔, AWS CLI 또는 AWS CloudShell을 사용하세요.

아래와 같이 명령줄을 사용합니다.

aws lambda add-permission \
--function-name your-lambda-function-name \
--statement-id triggerfromsns-statement-id \
--action lambda:invokefunction \
--principal sns.amazonaws.com \
--source-arn arn:aws:sns:your-aws-region:your-aws-account-id:your-sns-topic-name

참고: your-lambda-function-name, your-aws-region, your-aws-account-id, your-sns-topic-name을 해당 값으로 바꾸세요. AWS CLI 명령은 기본 AWS 지역을 사용합니다. Lambda 함수가 다른 지역에 있는 경우, --region 플래그를 사용하여 기본 지역을 재정의할 수 있습니다.

아래와 같이 Lambda 콘솔을 사용하세요.

1.    Lambda 콘솔을 엽니다.

2.    탐색 창에서 함수를 선택한 다음 함수를 선택합니다.

3.    구성 탭을 선택하고 권한을 선택합니다.

4.    리소스 기반 정책 섹션에서 권한 추가를 선택합니다.

5.    보안 주체에서 sns.amazonaws.com을 선택합니다.

6.    작업에서 Lambda:InvokeFunction을 선택합니다.

7.    명령문 ID에서 고유 ID를 입력합니다.

8.    저장을 선택합니다.

SNS 주제와 Lambda 함수가 다른 계정에 있는 경우:

1.    크로스 계정 권한을 설정합니다.

2.    CloudWatch 로그에서 전송 상태 로깅을 사용하여 Amazon SNS가 Lambda에 메시지를 성공적으로 전송했는지 또는 NumberOfNotificationsDelivered CloudWatch 지표를 확인할 수 있습니다.

Amazon SNS와 Lambda 간의 성공적인 응답의 예:

{
    "notification": {
        "messagemd5sum": "your-md5-sum",
        "messageid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "topicarn": "arn:aws:sns:your-aws-region:your-aws-account-id:your-sns-topic",
        "timestamp": "2021-04-04 14:08:48.083"
    },
    "delivery": {
        "deliveryid": "your-sns-delivery-id",
        "destination": "arn:aws:lambda:your-aws-region:your-aws-account-id:function:your-function-name",
        "providerresponse": "{\ "lambdarequestid\":\ "your-lambda-request-id\"}",
        "dwelltimems": 92,
        "attempts": 1,
        "statuscode": 202
    },
        "status": "success"
}

아마존 SNS 전송 로그 확인

Lambda 함수에 대한 SNS 주제의 전송 로그를 확인하세요. 응답이 성공하면 202 상태 코드가 표시됩니다.

SNS 주제에 대한 CloudWatch 로그를 보려면 다음과 같이 하세요.

1.    CloudWatch 콘솔을 엽니다.

2.    탐색 창에서,로그를 선택한 다음, 로그 그룹를 선택합니다.

3.    필터 검색 상자에 SNS 주제의 이름을 입력합니다. SNS 주제에 대한 두 개의 로그 그룹, 즉 성공과 실패에 대한 로그 그룹이 나타납니다.

4.    성공 로그 그룹을 선택합니다.

5.    로그 스트림 섹션에서 모두 검색을 선택합니다.

참고: 마지막 이벤트 시간 열에서 요청의 타임스탬프를 확인할 수도 있습니다. 그런 다음, Lambda 함수의 Amazon 리소스 이름(ARN)과 이름을 검색합니다.

6.    로그 스트림 열에서 열려는 로그 스트림을 선택합니다.

결과가 표시되지 않으면, 다음과 같이 하세요.

1.    로그 그룹을 선택한 다음, 실패 로그 그룹을 선택합니다.

2.    로그 스트림 섹션에서 모두 검색을 선택합니다.

3.    로그 스트림 열에서 열려는 로그 스트림을 선택합니다.

실패한 로그 그룹 문제를 해결하려면, 다음을 실행합니다.

1.    Lambda 함수의 X-Ray 추적체류 시간이 길지 확인하세요. 문제가 발생한 경우, CloudWatch 콘솔을 사용하여 해당 지역의 Lambda 함수가 오류 및 병목 수가 가장 적은지 확인하세요. 모든 함수를 선택한 다음, 오류스로틀 지표를 선택해야 합니다.

참고: 함수 전반에서 수백 개의 오류와 병목 현상이 비동기적으로 호출되면 내부 Lambda 대기열이 백업될 수 있습니다.  이 백업은 함수 호출을 지연시킬 수 있습니다. 오류와 스로틀 속도를 최소로 유지하여 원치 않는 지연을 방지하는 것이 가장 좋습니다. 자세한 내용을 보려면 비동기 호출을 참조하세요.

2.    별도의 처리를 위해 대상 Amazon Simple Queue Service(Amazon SQS) 대기열 또는 Lambda 함수를 설정합니다. 이렇게 하면 Lambda 함수의 경우 비동기 이벤트의 최대 기간이 6시간일 수 있기 때문에 메시지 손실을 방지할 수 있습니다.

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