Разрешения на глобальный вторичный индекс - PullRequest
0 голосов
/ 08 ноября 2018

Я использую sam для определения таблицы dynamodb как таковой:

#DynamoTables
  DevicesTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: devices
      AttributeDefinitions:
        - 
          AttributeName: "id"
          AttributeType: "S"
        - 
          AttributeName: "customerId"
          AttributeType: "S"
      KeySchema:
        - 
          AttributeName: "id"
          KeyType: "HASH"
        -
          AttributeName: "customerId"
          KeyType: "RANGE"
      GlobalSecondaryIndexes: 
        - 
          IndexName: "customers"
          KeySchema: 
            - 
              AttributeName: "customerId"
              KeyType: "HASH"
          Projection: 
            ProjectionType: "ALL"   
          ProvisionedThroughput: 
            ReadCapacityUnits: "5"
            WriteCapacityUnits: "5"
      ProvisionedThroughput:
        ReadCapacityUnits: "5"
        WriteCapacityUnits: "5"

Я могу получить доступ к таблице с помощью лямбда-функции с Properties: Policies: AmazonDynamoDBFullAccess, определенной в sam, и определением введенных параметров с помощью TableName: 'devices' в node. Однако, когда я пытаюсь запросить индекс, определив запрос по индексу как таковой:

params = {
  TableName: 'devices',
  IndexName: 'customers'
  // ...
}

Я получаю сообщение о том, что у лямбда-функции нет прав доступа к этому индексу:

AccessDeniedException: Пользователь: Пользователь: пользователь: arn: aws: sts ::: Предполагаемая роль / CodeStarWorker-Lambda / awscodestar-lambda-DeviceFunction не авторизован для выполнить: DynamodB: запрос к ресурсу: TABLEURL / устройства / индекс / клиенты

Кто-нибудь знает, как я могу предоставить этот доступ или обойти это для запроса индекса?

UPDATE: Я не думаю, что политика AmazonDynamoDBFullAccess влияет на вещи, когда я удалил ее из template.yml, я все еще был в состоянии поместить в таблицу и все еще не мог сделать запрос по индексу. Нужно ли вручную добавлять роли?

1 Ответ

0 голосов
/ 04 июня 2019

Ваша лямбда имеет доступ к TABLEURL / устройствам, но не к TABLEURL / devices / index / клиентам. Я не использовал Сэм. Я использую безсерверный фреймворк, но все должно быть похоже. Вам необходимо добавить доступ к * / index / Customers к вашей ролевой политике. Этот раздел внутри моего файла yaml выглядит так:

Resource:
 - "Fn::GetAtt": [CfpTable, Arn]
 - "Fn::Join": ["/", [{ "Fn::GetAtt": ["CfpTable", "Arn"] }, "index", "reverse-index"]]

Вот пример из документации aws о том, как разрешить доступ ко всем индексам БД.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AccessAllIndexesOnBooks",
            "Effect": "Allow",
            "Action": [
                "dynamodb:*"
            ],
            "Resource": [
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books",
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books/index/*"
            ]
        }
    ]
}
...