AWS Lambda 함수를 호출하도록 트리거를 설정하면 ‘The final policy size is bigger than the limit’(최종 정책 크기가 한도보다 더 큽니다) 오류가 발생합니다. 이 오류를 해결하려면 어떻게 해야 합니까?
간략한 설명
Lambda 함수의 리소스 기반 정책이 20KB를 초과하면 Lambda가 최종 정책 크기가 한도보다 더 큽니다(The final policy size is bigger than the limit) 오류를 반환합니다.
이 오류는 다음 중 하나를 수행하여 함수의 리소스 기반 정책에 정책 설명을 추가할 때 발생할 수 있습니다.
오류를 해결하려면 반복되는 정책 문을 제거하고 와일드카드(*)를 사용하는 통합 문으로 대체하여 함수의 정책 크기를 줄입니다. 자세한 내용은 Lambda 할당량 및 리소스 기반 정책 정리를 참조하세요.
해결 방법
참고: AWS CLI 명령을 실행할 때 오류가 발생하는 경우 최신 버전의 AWS CLI를 사용하고 있는지 확인하세요.
함수의 리소스 기반 정책 검토
참고: 다음 명령에서 my-function을 함수의 이름 또는 Amazon 리소스 이름(ARN)으로 바꿉니다.
1. 다음 get-policy AWS CLI 명령을 실행하여 Lambda 함수의 리소스 기반 정책을 찾아서 검토합니다.
$ aws lambda get-policy --function-name my-function
참고: get-policy 명령에서 명령줄 JSON 프로세서 jq를 사용하여 고급 쿼리를 작성할 수도 있습니다. jq를 다운로드하고 설치하는 방법에 대한 자세한 내용은 GitHub의 jq 웹 사이트에서 jq 다운로드를 참조하세요.
jq를 사용하여 Lambda 함수의 정책을 JSON 파일로 포맷하는 예제 get-policy 명령
$ aws lambda get-policy --function-name my-function | jq '.Policy|fromjson'
jq를 사용하여 Lambda 함수의 정책 크기를 찾는 예제 get-policy 명령
$ aws lambda get-policy --function-name my-function | jq -r '.Policy' | wc -c
jq를 사용하여 특정 정책 문의 명령문 ID(Sid)를 찾는 예제 get-policy 명령
events.amazonaws.com을 함수를 호출하는 AWS 서비스로 바꿉니다.
$ aws lambda get-policy --function-name my-function | jq '.Policy
| fromjson
| .Statement[]
| select(.Principal.Service=="events.amazonaws.com")
| .Sid'
jq를 사용하여 이름이 동일한 문자열로 시작하는 리소스의 Sid를 가져오는 예제 get-policy 명령
**arn:aws:events:region:account-id:rule/test-**를 반복되는 여러 정책 문에서 리소스의 ARN이 공유하는 문자열로 바꿉니다.
$ aws lambda get-policy --function-name my-function | jq '.Policy
| fromjson
| .Statement[]
| select(.Condition.ArnLike."AWS:SourceArn" | startswith("arn:aws:events:region:account-id:rule/test-"))
| .Sid'
2. 리소스 기반 정책에서 와일드카드로 바꿀 수 있는 정책 문을 식별합니다. 각 정책 설명서의 Sid를 적어 둡니다.
반복적인 정책 문 제거
다음 remove-permission AWS CLI 명령을 실행하여 각 반복 정책 문을 제거합니다. my-function을 함수의 이름 또는 ARN으로 바꿉니다. sid를 제거하려는 정책 문의 Sid로 바꿉니다.
$ aws lambda remove-permission --function-name my-function --statement-id sid
와일드카드(*)를 사용하는 정책 문 추가
다음 add-permission AWS CLI 명령을 사용하여 와일드카드(*)가 포함된 새로운 통합 정책 문을 추가합니다. my-function을 해당하는 함수의 이름 또는 ARN으로 바꿉니다. sid를 모든 값의 새 Sid로 바꿉니다. events.amazonaws.com을 함수를 호출하는 AWS 서비스 또는 계정 보안 주체로 바꿉니다. arn:aws:events:region:account-id:rule/test-*를 권한을 부여할 리소스가 공유하는 ARN 문자열(와일드카드 포함)로 바꿉니다.
$ aws lambda add-permission --function-name my-function \
--statement-id 'sid' \
--action 'lambda:InvokeFunction' \
--principal 'events.amazonaws.com' \
--source-arn 'arn:aws:events:region:account-id:rule/test-*'
참고: 리소스 기반 정책에 와일드카드가 있는 트리거는 Lambda 콘솔에 표시되지 않을 수 있습니다. 자세한 내용은 이벤트 기반 호출을 참조하세요.
자세한 내용은 AWS 서비스에 함수 액세스 권한 부여를 참조하세요.
관련 정보
IAM JSON 정책 요소: 리소스
AWS CLI의 명령 출력 제어(AWS CLI 사용 설명서)
Amazon S3 이벤트 알림이 내 Lambda 함수를 호출하지 않는 이유는 무엇입니까?
Lambda를 사용하여 Amazon EC2 인스턴스를 정기적인 간격으로 중지하고 시작하려면 어떻게 해야 합니까?