如何显示各个用户的dynamodb表名

时间:2017-03-10 10:40:42

标签: php amazon-web-services

用于dynamodb的php代码。我在使用ListTables()api调用显示表名时遇到问题。我这样做了。

第1步:在AWS IAM中,我在IAM中创建了两个名为“user1”和“user2”的用户。 IAM控制台为用户的user1'和'user2'创建了凭证(访问密钥和密钥)。在dynamodb中,我创建了两个表Books和Users。

第2步:对于user1,我只能访问名为“Books”的表。我写了如下的政策文件(在资源下,我提到了表名'书'的ARN。)

{
    "Version": "2012-10-17",
    "Statement": [
    {
        "Action": [                 
             "dynamodb:BatchGetItem",
             "dynamodb:DescribeTable",
             "dynamodb:GetItem",
             "dynamodb:ListTables",
             "dynamodb:Query",
             "dynamodb:Scan",
             "dynamodb:DescribeReservedCapacity",
             "dynamodb:DescribeReservedCapacityOfferings",
             "dynamodb:ListTagsOfResource"                 
         ],
         "Effect": "Allow",
         "Resource": "arn:aws:dynamodb:us-east-1:468737190093:table/Books",

     }]
}

第3步:对于user2,我只能访问名为“Users”的表。我写了如下的政策文件(在资源下,我提到了表名'用户'。)

{
    "Version": "2012-10-17",
    "Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "dynamodb:BatchGetItem",
            "dynamodb:DescribeTable",
            "dynamodb:GetItem",
            "dynamodb:ListTables",
            "dynamodb:Query",
            "dynamodb:Scan",
            "dynamodb:DescribeReservedCapacity",
            "dynamodb:DescribeReservedCapacityOfferings",
            "dynamodb:ListTagsOfResource"
        ],
        "Resource": [
            "arn:aws:dynamodb:us-east-1:468737190093:table/Users"
        ]

    }]
}

现在我的目标是显示各个用户的表名。如果我使用user1登录(使用user1的凭据accesskey和密钥),我只需要显示表名'Books'。或者,如果我使用user2登录(使用user2的凭据:accesskey和密钥),我只需要显示“用户”。 我尝试使用ListTables()api调用。但没有实现我想要的。

$sdk = new Aws\Sdk([
    'region' => 'us-east-1',
    'version' => 'latest',
    'credentials' => array(
        'key' => $userAccessKey,
        'secret' => $userSecretKey
    ),
    'http' => [
        'verify' => 'D:\xampp\htdocs\ssl\cacert.pem'
    ]
]);
$dynamodb = $sdk->createDynamoDb();
$result = $dynamodb->listTables();



 echo '<ul>';
    foreach ($result['TableNames'] as $tableName) {   
        echo '<li><a href="table.php?var1='.$tableName.'">'.$tableName.'</a>              
    </li>';
 }
echo '</ul>';

我得到以下异常: AccessDeniedException“,”Message“:”User:arn:aws:iam :: 468737190093:user / user1无权执行:dynamodb:资源上的ListTables:*

注意:如果我在策略文档中将“资源”字段更改为“*”,则它会成功显示所有表名(Books,Users)。但是我只需要显示相应用户的表名(user1 - &gt;仅显示'Books',user2 - &gt;仅显示'用户')。

如果不是ListTables(),是否有其他api调用或dynamodb中可用的任何其他方法列出表名? 有人可以给我解决方案.. :) 提前致谢。

1 个答案:

答案 0 :(得分:0)

我有一个解决方案。我使用错误代码来解决这个问题。 (我把try catch块用来捕获错误)。

第1步:更改策略文档,以便用户具有两种权限。 1.使用以下资源访问某些dynamodb api调用的权限,如BatchGetItem(),DescribeTable()...等(资源名称为表'books'的arn)
“资源”:“arn:aws:dynamodb:us-east-1:468737190093:table / Books”,

  1. 使用以下资源(所有表的资源名称)访问api调用ListTables的权限。 “资源”:“*”

    {

    “版本”:“2012-10-17”,

    "Statement": [
     {
        "Action": [                 
             "dynamodb:BatchGetItem",
             "dynamodb:DescribeTable",
             "dynamodb:GetItem",
             "dynamodb:ListTables",
             "dynamodb:Query",
             "dynamodb:Scan",
             "dynamodb:DescribeReservedCapacity",
             "dynamodb:DescribeReservedCapacityOfferings",
             "dynamodb:ListTagsOfResource"                 
         ],
         "Effect": "Allow",
         "Rsource": "arn:aws:dynamodb:us-east-1:468737190093:table/Books"
     },
     {
            "Action": [
                "dynamodb:ListTables"
            ],
            "Effect": "Allow",
            "Resource": "*"
      }
    

    ] }

  2. 也将权限更改为user2(与user1相同)。

    step2:使用listtables()api获取所有表。 $ result = $ dynamodb-&gt; listTables();

    step3:定义数组userTables。在每张桌子上扫描()。如果我们得到一个带有错误代码的异常:'AccessDeniedException',那么不要将该表名添加到数组中。将其余的表名添加到数组中。

    $userTables = array();
    foreach ($result['TableNames'] as $tableName) {         
    
    
            try
            {
                    $result1 = $dynamodb->scan([
                        'TableName' => $tableName
                    ]);
            }
            catch(\Aws\DynamoDb\Exception\DynamoDbException $e)
            {               
                    $errCode = $e->getAwsErrorCode();
                    //echo "<br>***Error Code: $errCode";
                    if($errCode == "AccessDeniedException")             
                    {
                            //echo "<br>No Permission to access the table named: <b>$tableName</b><br>";
                            continue; // Don't add this table, because the user don't have permission to this table.
    
                    }
            }
    
            // Add this table name to array userTables.
            array_push($userTables, $tableName);
    
    }
    

    步骤4:使用数组userTables显示表名。