2017-03-10 16 views
0

dynamodbのPHPコード。 ListTables()API呼び出しを使用してテーブル名を表示する際に問題に直面しています。私はこのようにした。各ユーザーのdynamodbテーブル名の表示方法

ステップ1:AWS IAMでは、IAMに「user1」と「user2」という名前の2人のユーザーを作成しました。 IAMコンソールはユーザー 'user1'と 'user2'の両方の資格情報(アクセスキーと秘密キー)を作成しました。 dynamodbでは、私は2つのテーブルの書籍とユーザーを作成しました。

STEP2: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", 

    }] 
} 

STEP3:user2のために、私は「ユーザー」という名前だけのテーブルへのアクセス権を与えられました。私は今、私の目標は、それぞれのユーザのテーブル名を表示することです

{ 
    "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でログインしている場合、テーブル名 'Books'だけを表示する必要があります。または私はuser2がでログインあれば(User2の資格情報を使用して:アクセスキーと秘密鍵)、私は唯一の「ユーザーを表示する必要が 私は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 "、"メッセージ ":"ユーザー:arn:aws:iam :: 468737190093:user/user1は実行する権限がありません:

メモ:ポリシー文書でリソースフィールドを「*」に変更した場合、すべてのテーブル名が正常に表示されています(Books、Users)。しかし、それぞれのユーザーのテーブル名のみを表示する必要があります。 user2 - >表示のみ'ユーザー')。

ListTables()でない場合、他のapi呼び出しやdynamodbでテーブル名をリストする他の方法がありますか? 誰かが私にソリューションを与えることができます.. :) ありがとうございます。

答えて

0

私は1つの解決策を得ました。私はこれを解決するためにエラーコードを使用しました。 (私はエラーをキャッチするtry catchブロックを置く)。

step1:ユーザーに2種類の権限があるようにポリシー文書を変更します。 1. BatchGetItem()、DescribeTable()...など以下のリソース(テーブル '書籍'のarnとしてのリソース名)を含むいくつかのdynamodb API呼び出しにアクセスする許可
"リソース": "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": "*" 
        } 
    

    ] }

変更許可へuser2も同様です(user1と同じ方法で)。

step2: listtables()APIを使用してすべてのテーブルを取得します。 $結果= $ dynamodb-> listTables();

step3:配列userTablesを定義します。各テーブルでscan()を実行します。エラーコード '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); 

} 

step4:配列userTablesを使用してテーブル名を表示します。

関連する問題