2016-12-04 2 views
1

Я пытаюсь вставить в свою таблицу DynamoDB с помощью идентификатора пользователя Cognito, и я получаю всегда «AccessDeniedException». Я выполнил документацию и создал для нее таблицу и политику, как показано ниже. Что здесь отсутствует. См. Полную информацию о стеке и идентификатор запроса.AccessDeniedException с использованием идентификатора Cognito в DynamoDB

Таблица имеет UserId как Hashkey и идентификатор как rangekey

Политика:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Effect": "Allow", 
      "Action": [ 
       "dynamodb:BatchGetItem", 
       "dynamodb:BatchWriteItem", 
       "dynamodb:DeleteItem", 
       "dynamodb:GetItem", 
       "dynamodb:PutItem", 
       "dynamodb:Query", 
       "dynamodb:UpdateItem" 
      ], 
      "Resource": [ 
       "arn:aws:dynamodb:us-east-1:1828211111:table/Table" 
      ], 
      "Condition": { 
       "ForAllValues:StringEquals": { 
        "dynamodb:LeadingKeys": [ 
         "${cognito-identity.amazonaws.com:sub}" 
        ] 
       } 
      } 
     } 
    ] 
} 

Код для сохранения данных:

AWS.DynamoDBhelper.Credentials.AddLogin(Helpers.Constants.KEY_LAST_USED_PROVIDER,Helpers.Settings.LoginAccessToken); 
       var identityId = await AWS.DynamoDBhelper.Credentials.GetIdentityIdAsync(); 

       var client = new Amazon.DynamoDBv2.AmazonDynamoDBClient(AWS.DynamoDBhelper.Credentials, Amazon.RegionEndpoint.USEast1); 
       Amazon.DynamoDBv2.DataModel.DynamoDBContext context = new Amazon.DynamoDBv2.DataModel.DynamoDBContext(client); 


       AWS.Table table= new AWS.Table(); 
       table.UserId = identityId; 
       table.id = "1"; 
       await context.SaveAsync(table); 

ех = {Amazon.DynamoDBv2 .AmazonDynamoDBException: Предполагаемая роль/_auth_MOBIL EHUB/CognitoIdentityCredentials не разрешается выполнять: dynamodb: DescribeTable на ресурсе: Арн: AWS: dynamodb: мы-восток-1

Модель:

[DynamoDBTable("Table")] 
    public class Table 
    { 
     [DynamoDBHashKey] 

     public string UserId { get; set; } 

     [DynamoDBRangeKey] 

     public string id { get; set; } 
    } 

ответ

2

Сообщение об ошибке:

. .. не разрешается выполнять: dynamodb: DescribeTable на ресурсе: Арн: AWS: dynamodb: мы-восток-1 ...

Добавьте followin г к действию в вашей политике:

dynamodb:DescribeTable 

Так что ваша политика будет выглядеть следующим образом

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Effect": "Allow", 
      "Action": [ 
       "dynamodb:BatchGetItem", 
       "dynamodb:BatchWriteItem", 
       "dynamodb:DeleteItem", 
       "dynamodb:GetItem", 
       "dynamodb:PutItem", 
       "dynamodb:Query", 
       "dynamodb:UpdateItem", 
       "dynamodb:DescribeTable" 
      ], 
      "Resource": [ 
       "arn:aws:dynamodb:us-east-1:1828211111:table/Table" 
      ], 
      "Condition": { 
       "ForAllValues:StringEquals": { 
        "dynamodb:LeadingKeys": [ 
         "${cognito-identity.amazonaws.com:sub}" 
        ] 
       } 
      } 
     } 
    ] 
} 
+0

Это не стол, это действие, которое является частью IAM политики. Я отредактировал свой ответ, чтобы показать вам, как это сделать. –

+0

Да, я понял, после того, как вы ответили определенным словом. Это совершенно разумно, поскольку я пытаюсь сделать, как «первый код», создать таблицу с пользователем, не являющимся администратором. Но я этого не понимаю, после того, как я задал этот вопрос здесь, я немного поиграл, и я попробовал также «Действие»: [ «dynamodb: *» ], разве это не покрытие DescribeTable? – batmaci

+0

Да «dynamodb. *» Должен работать. Если это не работает, то что-то не так. В основном я отлаживаю такие проблемы, расслабляя политику, пока она не работает, а затем постепенно добавляет обратно удаленные части шаг за шагом. Например, в качестве запуска вы можете временно использовать «*» для ресурса и удалить часть условия из политики. –

Смежные вопросы