2 つの AWS アカウント (アカウント A とアカウント B) があります。アカウント A には EC2 インスタンスがあり、そのインスタンスはアカウント B にある dynamodb にアイテムをプットしようとしています。
クロスアカウント アクセスなので、アカウント B に IAM ロールを作成してアカウント A が put_item を実行できるようにし、アカウント A に IAM ロールを作成してそのロールを引き受け、EC2 インスタンスに IAM ロールをアタッチしました。
プログラムを実行すると、引き受けロールを使用して同じアカウント内のテーブルにアイテムを配置しようとしているというエラー メッセージが表示されます。(私のコードでは、アカウント B のテーブル名を指定しただけです)
ロールを想定していても、インスタンスはテーブルがアカウント B にあることを認識していないようです。ここで何が欠けていますか?
また、AWS CLI を使用してアイテムを配置できることも確認しました (STS 呼び出しを実行した後)。
項目を配置する dynamodb arn を指定できる Java API はありますか?
エラーメッセージ:
User: arn:aws:sts::ACCOUNT_A:assumed-role/Assume-role/INSTANCE_ID is not authorized to perform: dynamodb:PutItem on resource: arn:aws:dynamodb:us-east-1:ACCOUNT_A:table/TABLE_NAME (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: AccessDeniedException)
アカウント A のポリシー:
{
"Version": "2012-10-17",
"Statement": [ {
"Effect": "Allow",
"Action": [ "sts:AssumeRole", "sts:GetFederationToken" ],
"Resource": "arn:aws:iam::AccountA:role/PutItem" },
{ "Effect": "Allow",
"Action": [ "sts:DecodeAuthorizationMessage", "sts:GetAccessKeyInfo", "sts:GetCallerIdentity" ],
"Resource": "*" } ]
}
アカウント B のポリシー:
{
"Version": "2012-10-17",
"Statement": [ {
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [ "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:UpdateTable" ],
"Resource": "arn:aws:dynamodb:region:accB:table/table name" },
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "dynamodb:*",
"Resource": "*" } ]
}