Cuando configuro un desencadenador para invocar mi función de AWS Lambda, aparece el error «The final policy size is bigger than the limit».
Descripción corta
Si la política basada en recursos de la función de Lambda supera los 20 KB, Lambda devuelve el error «The final policy size is bigger than the limit».
Este error puede producirse al crear recursos para otros servicios de AWS que necesitan permiso para acceder a tu función.
Nota: El límite de cuota de la política basada en recursos de la función de Lambda es de 20 KB y no se puede ajustar.
Resolución
Para solucionar este error, elimina las instrucciones de política repetitivas y sustitúyelas por instrucciones consolidadas que usen caracteres comodín (*) para reducir el tamaño de la política de la función.
Nota: Si se muestran errores al ejecutar comandos de la AWS CLI, consulta Solución de errores de la AWS CLI. Además, asegúrate de utilizar la versión más reciente de la AWS CLI.
Revisión de las políticas basadas en recursos de la función
-
Para buscar y revisar la política basada en recursos de tu función de Lambda, ejecuta el siguiente comando get-policy:
aws lambda get-policy --function-name your-function
Nota: Sustituye your-function por el nombre de tu función o el nombre de recurso de Amazon (ARN).
También puedes utilizar el procesador JSON de la línea de comandos, jq, en el comando get-policy para escribir consultas avanzadas. Para obtener información sobre cómo descargar e instalar jq, consulta Download jq (Descargar jq) en el sitio web de jq.
Ejemplo de comando get-policy que usa jq para formatear la política de una función de Lambda como un archivo JSON
aws lambda get-policy --function-name your-function | jq '.Policy|fromjson'
Ejemplo de comando get-policy que usa jq para encontrar el tamaño de la política de una función de Lambda
aws lambda get-policy --function-name your-function | jq -r '.Policy' | wc -c
Ejemplo de comando get-policy que usa jq para buscar el ID de la instrucción (Sid) de determinadas instrucciones de política
aws lambda get-policy --function-name your-function | jq '.Policy | fromjson
| .Statement[]
| select(.Principal.Service=="events.amazonaws.com")
| .Sid'
Nota: Sustituye events.amazonaws.com por el servicio de AWS que invoca la función.
Ejemplo de comando get-policy que usa jq para obtener el Sid de los recursos cuyo nombre comienza con la misma cadena
aws lambda get-policy --function-name your-function | jq '.Policy| fromjson
| .Statement[]
| select(.Condition.ArnLike."AWS:SourceArn" | startswith("arn:aws:events:region:account-id:rule/test-"))
| .Sid'
Nota: Sustituye arn:aws:events:region:account-id:rule/test- por una cadena compartida por los ARN de los recursos en varias instrucciones de política repetitivas.
-
En la política basada en recursos, identifica las instrucciones de política que puedas reemplazar por un comodín. Anota el Sid de cada instrucción de política.
Eliminación de instrucciones de política repetitivas
Para eliminar cada instrucción de política repetitiva, ejecuta el siguiente comando remove-permission:
aws lambda remove-permission --function-name your-function --statement-id sid
Nota: Sustituye your-function por el nombre o el ARN de tu función. Sustituye sid por el Sid de la instrucción de política que desees eliminar.
Agregación de instrucciones de política que usen un comodín (*)
Para agregar declaraciones de política nuevas y consolidadas que incluyan un comodín (*), ejecuta el siguiente comando add-permission:
aws lambda add-permission --function-name your-function \--statement-id 'sid' \
--action 'lambda:InvokeFunction' \
--principal 'events.amazonaws.com' \
--source-arn 'arn:aws:events:region:account-id:rule/test-*'
**Nota:**Sustituye my-function por el nombre o el ARN de tu función. Sustituye sid por un nuevo Sid con cualquier valor. Sustituye events.amazonaws.com por la entidad principal del servicio o la cuenta de AWS que invoca tu función. Sustituye arn:aws:events:region:account-id:rule/test-* por una cadena de ARN (más un comodín) compartida por los recursos a los que estás concediendo permisos.
Para obtener más información, consulta ¿Cómo puedo usar políticas basadas en recursos con Lambda para conceder permisos a los servicios de AWS?