Эта ошибка возникает, если вы используете event.methodArn
в качестве ресурса для сгенерированной политики и совместно используете авторизатор между различными функциями из-за того, как работает кэширование политики. Для предоставленного токена он кэширует политику по всему API, это будет одна и та же запись кэша для всех методов и ресурсов в одном и том же API и этапе (если они совместно используют один и тот же авторизатор).
Например, при отправке запроса на GET /users
ARN будет выглядеть примерно так:
arn:aws:execute-api:us-1:abc:123/prod/GET/users
При следующем вызове любой конечной точки с таким же токеном аутентификации будет использоваться кэшированная политика, которая была создана при первом вызове GET /users
. Проблема с этой кэшированной политикой заключается в том, что ее ресурс допускает только один конкретный ресурс arn: ... /prod/GET/users
, любой другой ресурс будет отклонен.
В зависимости от того, насколько вы хотите ограничить разрешения политики, вы можете указать любой возможный ресурс при создании политики
{
"principalId": "user",
"policyDocument": {
"Statement": [
{
"Action": "execute-api:Invoke",
"Effect": "Allow",
"Resource": [
"arn:aws:execute-api:us-1:abc:123/prod/GET/v1/users",
"arn:aws:execute-api:us-1:abc:123/prod/POST/v1/users",
"arn:aws:execute-api:us-1:abc:123/prod/GET/v1/orders"
]
}
],
"Version": "2012-10-17"
}
}
или используйте подстановочные знаки
"Resource": "arn:aws:execute-api:us-1:abc:123/prod/*/v?/*"
или даже
"Resource": "*"
Вы можете использовать переменные политики для некоторых расширенных шаблонов.
Можно также использовать подход черного списка, разрешив все с использованием подстановочных знаков, а затем запретив определенные ресурсы в другом выражении политики.
Источники: