目標儘管它的作用,爲什麼我的Elastic Beanstalk應用程序拒絕PutItem訪問我的DynamoDB?
我想從我的彈性青苗應用我DynamoDB項目編程添加到表,使用類似的代碼:
Item item = new Item()
.withPrimaryKey(UserIdAttributeName, userId)
.withString(UserNameAttributeName, userName);
table.putItem(item);
意想不到的結果
日誌顯示以下錯誤消息,[粗體部分]是我的編輯:
用戶:阿爾恩:AWS:STS :: [IAM ID?]:假設角色/ AWS-elasticbeanstalk-EC2角色/ I-[一定數量]沒有被授權執行:dynamodb:PutItem on資源:arn:aws:dynamodb:us-west-2:[iam id?]:table/PiggyBanks(Service:AmazonDynamoDBv2;狀態碼:400;錯誤代碼:AccessDeniedException;請求ID:[請求ID])
我能夠拿到表就好了,但事情出差錯去當PutItem被調用。
配置
我創建了一個新的彈性豆莖應用。按照documentation,這會自動將該應用程序分配一個新的角色,叫做:
aws-elasticbeanstalk-service-role
這同一文件表明,我可以按如下添加到我的數據庫訪問:
的附加服務添加權限IAM控制檯中的默認服務角色。
因此,我找到了aws-elasticbeanstalk-service-role
角色,並將其添加到託管策略AmazonDynamoDBFullAccess
。此政策如下所示,爲簡潔起見刪除了其他操作:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"dynamodb:*",
[removed for brevity]
"lambda:DeleteFunction"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
這看起來確實應該授予我所需的訪問權限。而且,的確,policy simulator驗證了這一點。用下面的參數,該動作被允許:
- 角色:AWS-elasticbeanstalk服務角色
- 服務:DynamoDB
- 行動:PutItem
- 仿真資源 :[從上面的日誌中拉出] arn:aws:dynamodb:us-west-2:[iam id?]:表/ PiggyBanks
更新
在通過filipebarretto
回答這個問題很好,我實例化DynamoDB對象如下:
private static DynamoDB createDynamoDB() {
AmazonDynamoDBClient client = new AmazonDynamoDBClient();
client.setRegion(Region.getRegion(Regions.US_WEST_2));
DynamoDB result = new DynamoDB(client);
return result;
}
根據this documentation,這應該是該怎麼辦,因爲它使用的是default credentials provider chain
,並且依次是instance profile credentials
,
其存在於與用於EC2實例的IAM角色 相關聯的實例元數據內。
默認供應鏈中的[此選項]僅在 在EC2實例上運行應用程序時可用,但在使用EC2實例時提供最大的易用性和最佳安全性。
其他的事情我想
這related Stack Overflow question有這樣的指示區域可能是這個問題的答案。我試圖調整該地區,沒有額外的成功。
我試圖迫使使用下列正確的憑據的使用:
AmazonDynamoDBClient client = new AmazonDynamoDBClient(new InstanceProfileCredentialsProvider());
我也曾嘗試創建從彈性魔豆內一個全新的環境。
總之
通過日誌中的錯誤,它肯定看起來像我的魔豆彈性應用是假設正確的角色。
而且,通過策略模擬器的結果,角色應該有權執行我想要做的事情。
所以...請幫助!
謝謝!
如何實例化DynamoDB對象並設置爲在代碼中使用來自ec2角色的憑據? – filipebarretto
更新了問題以包含這些詳細信息。謝謝你的好問題! – Dan
我作爲答覆發佈了一條建議,強制根據默認憑證提供商鏈加載EC2憑證。看看是否適用於你=) – filipebarretto