6

目標儘管它的作用,爲什麼我的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()); 

我也曾嘗試創建從彈性魔豆內一個全新的環境。

總之

通過日誌中的錯誤,它肯定看起來像我的魔豆彈性應用是假設正確的角色。

而且,通過策略模擬器的結果,角色應該有權執行我想要做的事情。

所以...請幫助!

謝謝!

+1

如何實例化DynamoDB對象並設置爲在代碼中使用來自ec2角色的憑據? – filipebarretto

+0

更新了問題以包含這些詳細信息。謝謝你的好問題! – Dan

+0

我作爲答覆發佈了一條建議,強制根據默認憑證提供商鏈加載EC2憑證。看看是否適用於你=) – filipebarretto

回答

8

更新AWS-elasticbeanstalk-EC2角色的作用,而不是AWS-elasticbeanstalk服務角色。

salient documentation包含密鑰:

當您創建一個環境,AWS彈性魔豆提示您提供兩個AWS身份和訪問管理(IAM)的角色,一個角色服務和實例配置文件。 Elastic Beanstalk假定服務角色代表您使用其他AWS服務。實例配置文件將應用於您環境中的實例,並允許它們將日誌上傳到Amazon S3並執行根據環境類型和平臺而變化的其他任務。

換句話說,其中一個角色(-service-role)由Beanstalk服務本身使用,而另一個角色(-ec2-role)應用於實際實例。

後者涉及您在應用程序代碼中需要的任何權限。

+2

哇...這是相當明顯的...結束了俯瞰的問題=/ 偉大你想通了=) – filipebarretto

6

加載您的憑據,請嘗試:

InstanceProfileCredentialsProvider mInstanceProfileCredentialsProvider = new InstanceProfileCredentialsProvider(); 
AWSCredentials credentials = mInstanceProfileCredentialsProvider.getCredentials(); 

AmazonDynamoDBClient client = new AmazonDynamoDBClient(credentials); 

AmazonDynamoDBClient client = new AmazonDynamoDBClient(new DefaultAWSCredentialsProviderChain()); 
+0

不幸的是,沒有去這些。 – Dan

相關問題