Lambda 함수가 EventBridge 규칙에 따라 트리거되지 않은 이유는 무엇인가요?

3분 분량
0

AWS Command Line(AWS CLI)을 사용해 생성한 Amazon EventBridge 규칙이 AWS Lambda 함수를 간접 호출하지 않는 문제를 해결하고 싶습니다.

간략한 설명


문제를 확인하려면 다음 단계를 따르세요.

  1. 이벤트 소스가 이벤트를 게시하고 관련 Amazon EventBridge 규칙을 트리거했는지 확인합니다.
  2. EventBridge 규칙에 따라 구성된 대상이 간접적으로 호출되었는지 확인합니다.
  3. 대상을 간접적으로 호출하는 것에 실패한 경우 AWS Lambda 함수 리소스 정책에 적절한 권한이 있는지 확인합니다.

해결 방법

참고: AWS CLI 명령을 실행할 때 오류가 발생하면 최신 AWS CLI 버전을 사용하고 있는지 확인하세요.

CloudWatch 지표에서 EventBridge 규칙 검토

  1. Amazon CloudWatch 콘솔을 엽니다.
  2. 왼쪽 탐색 창의 지표 아래에서 모든 지표를 선택합니다.
  3. AWS/Events 네임스페이스를 선택합니다.
  4. 해당 규칙의 TriggerRules, Invocations, FailedInvocations(사용 가능한 경우) 지표를 선택합니다. 필요한 경우 SUM 통계를 통해 이 지표를 확인합니다.
    참고: TriggerRules 데이터포인트를 통해 이벤트가 EventBridge 규칙을 트리거했는지 확인할 수 있습니다. Invocation 데이터포인트를 통해 EventBridge 규칙으로 해당하는 대상이 간접 호출되었는지 확인할 수 있습니다. 지표에 FailedInvocations 데이터 포인트가 포함되어 있으면 규칙이 대상 간접 호출에 실패했을 수 있습니다. FailedInvocations은 영구적인 실패를 뜻하며 권한이나 잘못되었거나 구성이 올바르지 않아 발생할 수 있습니다.

Lambda 함수 리소스 정책에 적절한 권한이 있는지 확인

Lambda 함수를 대상으로 하는 EventBridge 규칙을 생성할 때는 다음 사항에 유의하세요.

  • Amazon EventBridge 콘솔을 사용해 규칙을 생성하면 콘솔이 함수 리소스 정책에 자동으로 적절한 권한을 추가합니다.
  • AWS CLI, SDK, AWS CloudFormation을 사용해 규칙을 생성할 때는 리소스 정책에서 권한을 수동으로 적용해야 합니다.

권한을 부여하면 Amazon EventBridge 서비스가 Lambda 함수를 간접적으로 호출할 수 있습니다.

대상 Lambda 함수와 관련된 권한 검토

다음 단계를 따르세요.

  1. AWS Lambda 콘솔을 엽니다.
  2. 대상 Lambda 함수를 선택합니다.
  3. 구성 탭을 선택하고 권한을 선택합니다.
  4. 리소스 기반 정책 섹션에서 정책 문서를 검토합니다.

또는 GetPolicy API나 적절한 get-policy AWS CLI 명령을 사용해 Lambda 함수 리소스 정책을 검색합니다.

다음은 EventBridge가 Lambda 함수를 호출하도록 허용하는 리소스 정책 예시입니다.

{
  "Effect": "Allow",
  "Action": "lambda:InvokeFunction",
  "Resource": "arn:aws:lambda:region:account-id:function:function-name",
  "Principal": {
    "Service": "events.amazonaws.com"
  },
  "Condition": {
    "ArnLike": {
      "AWS:SourceArn": "arn:aws:events:region:account-id:rule/rule-name"
    }
  },
  "Sid": "InvokeLambdaFunction"
}

참고: ARN을 적절한 리전, 계정 ID, 리소스 이름으로 바꾸세요.

리소스 정책 업데이트

리소스 정책을 업데이트하려면 다음 단계를 따르세요.

  1. AWS Lambda 콘솔을 엽니다.
  2. 대상 Lambda 함수를 선택합니다.
  3. 구성 탭을 선택하고 권한을 선택합니다.
  4. 리소스 기반 정책 섹션에서 권한 추가를 선택합니다.
  5. **AWS Service - EventBridge(CloudWatch Events)**를 선택합니다.
  6. 정책 설명에 사용할 수 있는 식별자 옵션으로 문 ID(Sid)를 입력합니다.
  7. 주요에는 events.amazonaws.com을 입력합니다.
    참고: 보통은 이 부분은 자동으로 채워집니다.
  8. 소스 ARN에 EventBridge 규칙 ARN을 사용하세요.
  9. 작업에는 드롭다운 목록에서 lambda:InvokeFunction를 선택합니다.
  10. 저장을 선택합니다.

AddPermission API나 AWS Lambda add-permission AWS CLI 명령을 사용해 정책을 업데이트할 수도 있습니다.

다음 예를 참고하세요.

aws lambda add-permission \--function-name MyFunction \
--statement-id MyId \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn:aws:events:us-east-1:123456789012:rule/MyRule

대상에 Amazon SQS DLQ(Dead Letter Queue) 추가

EventBridge에서는 Amazon Simple Queue Service(Amazon SQS) DLQ를 사용해 대상으로 전송 못한 이벤트를 저장합니다. FailedInvocations를 보고하는 대상에 Amazon SQS DLQ를 첨부하세요. DLQ에서 이벤트를 검색해 문제를 분석하고 추가적인 컨텍스트를 얻을 수 있습니다. 수정 후 실패한 이벤트는 대상으로 재전송해 처리할 수 있습니다.

  1. EventBridge 콘솔에서 관련 규칙을 엽니다.
  2. 대상에서 편집을 선택하고 추가 설정 섹션을 확장합니다.
  3. **DLQ(Dead Letter Queue)**에서 현재 AWS 계정에서 DLQ(Dead Letter Queue)로 사용할 Amazon SQS 대기열 선택을 클릭합니다.
  4. DLQ로 사용할 SQS 대기열을 선택합니다.
  5. DLQ를 할당한 후 규칙 편집 섹션에서 나머지 단계를 완료하고 변경 내용을 저장합니다.

관련 정보

규칙은 실행되었는데 Lambda 함수가 호출되지 않았습니다.

Amazon EventBridge에 리소스 기반 정책 사용: AWS Lambda 사용 권한

이벤트 재시도 정책 및 DLQ(Dead Letter Queue) 사용

Amazon EventBridge의 장애 복구 개선