ARN для запроса по индексу DynamoDB не работает - PullRequest
0 голосов
/ 31 марта 2020

Я хочу запросить индекс в таблице DynamoDB. При этом я получаю следующую ошибку:

User: arn:aws:sts::XXX:assumed-role/bifr-dev-us-east-1-lambdaRole/bifr-dev-login is not authorized to perform: dynamodb:Query on resource: arn:aws:dynamodb:us-east-1:XXX:table/customers/index/email_index

После попытки исправить ее с помощью предложенных конфигов в AccessDenied для индекса GSI DynamoDB и AWS и разрешений DynamoDB: «Пользователь не авторизован для доступа к этому ресурсу "Я пришел к следующему конфигу, который по-прежнему не работает. Та же ошибка сохраняется. Может быть, кто-то может помочь мне с решением этой проблемы.

Конфигурация таблицы:

resources: 
      Resources:
        customers: 
          Type: AWS::DynamoDB::Table
          Properties:
            TableName: customers
            AttributeDefinitions:
              - AttributeName: "id"
                AttributeType: S
              - AttributeName: "email"
                AttributeType: S
            KeySchema:
              - AttributeName: "id"
                KeyType: HASH
            BillingMode: PAY_PER_REQUEST
            GlobalSecondaryIndexes: 
            - IndexName: 'email_index'
              KeySchema:
              - AttributeName: 'email'
                KeyType: 'HASH'
              Projection: 
                ProjectionType: 'ALL'

Конфигурация роли IAM:

iamRoleStatements:
- Effect: Allow
  Action:
    - dynamodb:GetItem
    - dynamodb:UpdateItem
    - dynamodb:PutItem
    - dynamodb:Scan
  Resource: "arn:aws:dynamodb:${opt:region, self:provider.region}:*:table/*"
- Effect: Allow
  Action:
    - dynamodb:Query
  Resource: "arn:aws:dynamodb:us-east-1:250781267785:table/customers/index/email_index"

NodeJS код для запроса:

var res = await aws.QueryItems({
    TableName: tableName,

    IndexName: 'email_index',
    KeyConditionExpression: '#email = :email',
    ExpressionAttributeNames: {
        "#email": "email"
    },
    ExpressionAttributeValues: {
        ":email": email
    }
});

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Проблема была в отступе. iamRoleStatements должен быть потомком provider.

Вот мой рабочий конфиг:

provider:
  name: aws
  runtime: nodejs12.x
  region: us-east-1
  iamRoleStatements:
      - Effect: Allow
        Action:
          - dynamodb:GetItem
          - dynamodb:UpdateItem
          - dynamodb:PutItem
          - dynamodb:Scan
        Resource: "arn:aws:dynamodb:${opt:region, self:provider.region}:*:table/*"
      - Effect: Allow
        Action:
          - dynamodb:Query
        Resource: "arn:aws:dynamodb:${opt:region, self:provider.region}:*:table/customers/index/*"
0 голосов
/ 01 апреля 2020

В соответствии с https://docs.aws.amazon.com/IAM/latest/UserGuide/list_amazondynamodb.html#amazondynamodb -таблицей

необходимо добавить ARN для таблицы в оператор Dynamodb: Query IAM.

...