Lambda 오류 "The final policy size is bigger than the limit(최종 정책 크기가 한도보다 더 큽니다)"를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 4월 14일

AWS Lambda 함수를 호출하도록 트리거를 설정하면 "The final policy size is bigger than the limit(최종 정책 크기가 한도보다 더 큽니다)" 오류가 발생합니다. 이 오류를 해결하려면 어떻게 해야 합니까?

간략한 설명

이 오류는 Lambda 함수의 리소스 기반 정책에 정책 문을 추가하려고 할 때 발생할 수 있습니다. 추가된 정책 문이 최대 정책 크기인 20KB를 초과할 경우 오류가 발생하고 해당 문이 추가되지 않습니다. 이는 add-permission 명령을 수동으로 사용하거나 함수에 액세스할 권한이 필요한 다른 서비스에 대한 리소스를 생성할 때 발생할 수 있습니다.

반복되는 정책 문을 제거하고 와일드카드(*)를 사용하는 통합 문으로 대체하여 정책의 크기를 줄입니다.

자세한 내용은 AWS Lambda 제한리소스 기반 정책 정리를 참조하십시오.

​해결 방법

함수의 리소스 기반 정책 검토

참고: 다음 명령에서 my-function을 함수의 이름 또는 Amazon 리소스 이름(ARN)으로 바꿉니다.

1.    AWS 명령줄 인터페이스(AWS CLI)에서 get-policy 명령을 사용하여 Lambda 함수의 리소스 기반 정책을 가져오고 검토합니다.

$ aws lambda get-policy --function-name my-function

get-policy 명령에서 명령줄 JSON 프로세서 jq를 사용하여 고급 쿼리를 작성할 수도 있습니다.

참고: jq를 다운로드하고 설치하는 지침은 GitHub의 jq 웹 사이트에서 jq 다운로드를 참조하십시오.

예를 들어, jq를 사용하여 정책 형식을 지정할 수 있습니다.

$ aws lambda get-policy --function-name my-function | jq '.Policy|fromjson'

정책 크기를 보려면:

$ aws lambda get-policy --function-name my-function | jq -r '.Policy' | wc -c

참고: 이 명령의 출력 값이 20480(20KB)에 가까울 경우 정책 문을 더 추가하려고 하면 크기 오류가 발생할 수 있습니다.

특정 정책 문의 Sid(문 ID)를 가져오려면:

$ aws lambda get-policy --function-name my-function | jq '.Policy 
| fromjson 
| .Statement[] 
| select(.Principal.Service=="events.amazonaws.com") 
| .Sid'

참고: events.amazonaws.com을 함수를 호출하는 AWS 서비스로 바꿉니다.

또는, 이름이 동일한 문자열로 시작하는 리소스의 Sid를 가져오려면:

$ 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'

참고: arn: aws: events: region: account-id: rule/test-를 반복되는 여러 정책 문에서 리소스의 ARN이 공유하는 문자열로 바꿉니다.

2.    리소스 기반 정책에서 와일드카드로 바꿀 수 있는 정책 문을 식별합니다. 각 정책 문의 Sid를 기록해 둡니다.

정책 문 제거

remove-permission 명령을 사용하여 이전 단계에서 기록한 각 정책 문을 제거합니다.

$ aws lambda remove-permission --function-name my-function --statement-id sid

참고: myfunction을 함수의 이름 또는 ARN으로 바꿉니다. sid를 정책 문 Sid로 바꿉니다.

와일드카드를 사용하는 정책 문 추가

add-permission 명령을 사용하여 와일드카드(*)가 포함된 새로운 통합 정책 문을 추가합니다. 예를 들면 다음과 같습니다.

$ 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-*'

참고: myfunction을 함수의 이름 또는 ARN으로 바꿉니다. sid를 모든 값의 새 Sid로 바꿉니다. events.amazonaws.com을 함수를 호출하는 AWS 서비스 또는 계정 보안 주체로 바꿉니다. arn: aws: events: region: account-id: rule/test-*를 권한을 부여할 리소스가 공유하는 ARN 문자열(와일드카드 포함)로 바꿉니다.

추가 예제 명령 및 정보는 AWS 서비스에 함수 액세스 권한 부여를 참조하십시오.