用于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中可用的任何其他方法列出表名? 有人可以给我解决方案.. :) 提前致谢。
答案 0 :(得分:0)
我有一个解决方案。我使用错误代码来解决这个问题。 (我把try catch块用来捕获错误)。
第1步:更改策略文档,以便用户具有两种权限。
1.使用以下资源访问某些dynamodb api调用的权限,如BatchGetItem(),DescribeTable()...等(资源名称为表'books'的arn)
“资源”:“arn:aws:dynamodb:us-east-1:468737190093:table / Books”,
使用以下资源(所有表的资源名称)访问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": "*"
}
] }
也将权限更改为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显示表名。