CloudWatch 경보로 트리거될 때 Amazon SNS가 Lambda 함수를 호출하지 않는 이유는 무엇입니까?
최종 업데이트 날짜: 2021년 6월 24일
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 알림을 받지 못한 이유는 무엇입니까?를 참조하세요. 이 활동에는 NumberOfMessagesPublished, NumberOfNotificationsDelivered 또는 NumberOfNotificationsFailed와 같은 CloudWatch 지표가 포함될 수 있습니다.
해결 방법
참고: AWS 명령줄 인터페이스(AWS CLI) 명령을 실행할 때 오류가 발생할 경우 AWS CLI의 최신 버전을 사용하고 있는지 확인하세요.
Lambda 함수에 대한 리소스 기반 정책 문서 확인
Amazon SNS에서 Lambda 함수를 비동기적으로 호출하면 Lambda는 202 HTTP 상태 코드를 다시 Amazon SNS로 반환합니다. 상태 코드는 Lambda가 나중에 처리하기 위해 메시지를 수락했음을 보여줍니다. 자세한 내용은 비동기식 호출을 참조하세요. 실패한 응답을 받으면 Amazon SNS 전송 로그에서 자세한 내용을 확인할 수 있습니다.
계정의 시나리오에 따라 해결 방법을 선택합니다.
SNS 주제와 Lambda 함수가 동일한 계정에 있는 경우:
1. Lambda 콘솔을 엽니다.
2. 탐색 창에서 [함수(Functions)]를 선택한 다음 해당 함수를 엽니다.
3. [구성(Configuration)] 탭을 선택한 다음 [사용 권한(Permissions)]을 선택합니다.
4. [리소스 기반 정책(Resource-based policy)] 섹션의 [명령문 ID(Statement 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에서 정책 문서를 보려면 [리소스 기반 정책(Resource-based policy)] 섹션에서 [정책 문서 보기(View policy document)]를 선택합니다.
함수를 호출하기 위해 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. 탐색 창에서 [함수(Functions)]를 선택한 다음 해당 함수를 엽니다.
3. [구성(Configuration)] 탭을 선택한 다음 [사용 권한(Permissions)]을 선택합니다.
4. [리소스 기반 정책(Resource-based policy)] 섹션에서 [권한 추가(Add permissions)]를 선택합니다.
5. [주요(Principal)]에 [sns.amazonaws.com]을 선택합니다.
6. [작업(Actions)]에 [Lambda:InvokeFunction]을 선택합니다.
7. [명령문 ID(Statement ID)]에 고유 ID를 입력합니다.
8. [저장(Save)]을 선택합니다.
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"
}
Amazon SNS 배송 로그 확인
Lambda 함수에 대한 SNS 주제의 전송 로그를 확인합니다. 응답이 성공하면 202 상태 코드가 표시됩니다.
SNS 주제에 대한 CloudWatch 로그를 보려면 다음을 수행합니다.
1. CloudWatch 콘솔을 엽니다.
2. 탐색 창에서 [로그(Logs)]를 확장하고 [로그 그룹(Log groups)]을 선택합니다.
3. 필터 검색 상자에 SNS 주제의 이름을 입력합니다. SNS 주제에 대한 두 개의 로그 그룹이 나타납니다. 하나는 성공, 다른 하나는 실패에 대한 것입니다.
4. 성공 로그 그룹을 선택합니다.
5. [로그 스트림(Log streams)] 섹션에서 [모두 검색(Search all)]을 선택합니다.
참고: [마지막 이벤트 시간(Last event time)] 열에서 요청의 타임스탬프를 확인할 수도 있습니다. 그런 다음 Lambda 함수의 Amazon 리소스 이름(ARN)과 이름을 검색합니다.
6. [로그 스트림(Log stream)] 열에서 로그 스트림을 선택하여 엽니다.
결과가 표시되지 않으면 다음을 수행합니다.
1. [로그 그룹(Log groups)]을 선택한 다음 실패 로그 그룹을 선택합니다.
2. [로그 스트림(Log streams)] 섹션에서 [모두 검색(Search all)]을 선택합니다.
3. [로그 스트림(Log stream)] 열에서 로그 스트림을 선택하여 엽니다.
실패한 로그 그룹 문제를 해결하려면 다음을 수행합니다.
1. Lambda 함수의 X-Ray 추적에 체류 시간이 높은지 확인합니다. 체류 시간이 높으면 CloudWatch 콘솔을 사용하여 해당 리전의 Lambda 함수에 오류 및 스로틀 수가 가장 적은지 확인합니다. 모든 함수를 선택한 다음 [오류(Errors)] 및 [스로틀(Throttles)] 지표를 선택합니다.
참고: 비동기적으로 호출되는 함수에서 수백 개의 오류 및 스로틀이 내부 Lambda 대기열을 백업하여 함수 호출이 지연될 수 있습니다. 오류 및 스로틀 속도를 최소한으로 유지하는 것이 좋습니다. 이렇게 하면 함수 호출에 원치 않는 지연을 방지할 수 있습니다. 자세한 내용은 비동기식 호출을 참조하세요.
2. 별도의 처리를 위해 대상 Amazon Simple Queue Service(Amazon SQS) 대기열 또는 Lambda 함수를 설정합니다. 이렇게 하면 Lambda 함수의 비동기 이벤트의 최대 사용 기간을 6시간이 될 수 있으므로 메시지 손실을 방지할 수 있습니다.