Я хотел бы создать собственную политику, обеспечивающую детальный доступ к таблицам DynamoDB в настраиваемом авторизаторе AWS. Это возможно?
В безсерверном режиме моя конфигурация выглядит следующим образом:
functions:
APIAuthorizer:
handler: src/services/auth/handlers.apiAuthorizer
cors: true
GraphQLAPI:
handler: src/services/graphql/handlers.apiHandler
events:
- http:
path: "/api"
method: post
cors: true
authorizer:
name: APIAuthorizer
type: request
resultTtlInSeconds: 0
Я проверил, что мой пользовательский авторизатор вызывается и что различные генерируемые им разрешения (sts:AssumeRole
, lambda:InvokeFunction
, execute-api:Invoke
и другие) необходимы для успешного вызова обработчика API. Так что мой пользовательский авторизатор работает, и результат, который он предоставляет, необходим.
Однако, когда авторизатор включает в себя разрешения DynamodB, например, такой оператор, как
{Эффект: «Разрешить», Действие: «DynamodB: », «Ресурс»: «»}
Мой обработчик API (функция GraphQLAPI) завершается ошибкой с сообщением типа
User: arn:aws:sts::<myaccountid>:assumed-role/<mydefaultrole>/myservice-mystage-GraphQLAPI is not authorized to perform: dynamodb:Query on resource: arn:aws:dynamodb:us-east-1:<myaccountId>:table/<mytable>/index/<someIndex>
(Я заметил, что жалоба касается разрешения для индекса, поэтому также попытался добавить специальные разрешения для этого индекса и / или для всех индексов, но это не имеет никакого эффекта.)
Суть в том, что после многих различных попыток, разрешения динамодаба, выданные пользовательским авторизатором, полностью игнорируются. Мой код lambda node.js использует SDK узла AWS, который должен получать разрешения из среды экземпляра. Я предполагал, что это будет включать разрешения, сгенерированные пользовательским авторизатором.
Наконец, я заметил, что в документации AWS javascript SDK о том, как загружаются учетные данные говорится только «Роль выполнения предоставляет функции Lambda учетные данные, необходимые для запуска и вызова других веб-служб». Т.е. в нем не упоминаются динамически сгенерированные учетные данные, выданные пользовательским авторизатором.
Это, кажется, объясняет поведение, которое я вижу. Мой обработчик API имеет разрешения только от статически определенной роли выполнения (сообщение об ошибке также указывает на это), и ему не предоставляются разрешения, созданные пользовательским авторизатором.
Есть ли возможность использовать разрешения, которые мой пользовательский авторизатор генерирует внутри моего обработчика API?