2017-10-09 55 views
1

我在帳戶「A」中擁有AWS ElasticSearch羣集。AWS ElasticSearch從帳戶「B」中的lambda寫入帳戶「A」

我試圖創建一個賬戶「B」中的賬戶「A」中寫入ES的lambda(由DynamoDB流觸發)。

,我發現了以下錯誤:

{ 
"Message":"User: arn:aws:sts::AccountB:assumed-role/lambdaRole1/sourceTableToES is not authorized to perform: es:ESHttpPost on resource: beta-na-lifeguard" 
} 

我試圖把STS以及作用到ES訪問策略(內帳戶「A」),沒有運氣。以下是我的政策:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Principal": { 
     "AWS": "arn:aws:iam::AccountA:user/beta-elasticsearch-admin" 
     }, 
     "Action": "es:*", 
     "Resource": "*" 
    }, 
    { 
     "Effect": "Allow", 
     "Principal": { 
     "AWS": [ 
      "arn:aws:iam::AccountA:user/beta-elasticsearch-readwrite", 
      "arn:aws:iam::AccountA:role/beta-na-DynamoDBStreamLambdaElasticSearch", 
      "arn:aws:sts::AccountB:assumed-role/lambdaRole1/sourceTableToES", 
      "arn:aws:iam::AccountB:role/service-role/lambdaRole1" 
     ] 
     }, 
     "Action": [ 
     "es:ESHttpGet", 
     "es:ESHttpPost", 
     "es:ESHttpPut" 
     ], 
     "Resource": "*" 
    } 
    ] 
} 

回答

1

當您爲另一個帳戶創建「角色」時,還需要設置「信任關係」。這是在AWS IAM控制檯的「角色」下完成的。你的角色的第二個標籤是「信任關係」。您需要將另一個帳戶的帳戶詳細信息指定爲可信。

「信任關係」本身就是一份政策文件。下面是一個示例,它允許您從其他帳戶的AssumeRole調用我的AWS賬戶。

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Principal": { 
     "AWS": "arn:aws:iam::2812XXXXYYYY:root" 
     }, 
     "Action": "sts:AssumeRole" 
    } 
    ] 
} 

在你的角色,只需指定權限正常,就像你在授予另一IAM用戶/服務的權限(例如刪除所有這些帳戶類型的條目)。信任關係策略文檔定義誰可以調用AssumeRole來授予這些權限。

Creating a Role to Delegate Permissions to an IAM User

Modifying a Role

+0

感謝約翰,這讓我走上了正確的軌道 – jhilden

1

在我上面的代碼,我加入arn:aws:sts::AccountB:assumed-role/lambdaRole1/sourceTableToSNS到AccountA ES訪問列表,這是錯誤的。相反,執行以下操作:

我已經在ES訪問列表中有arn:aws:iam::AccountA:role/beta-na-DynamoDBStreamLambdaElasticSearch,我需要爲該角色添加信任關係(來自IAM角色屏幕),AccountB可以承擔該角色。我在信任關係中加入了這一點:

{ 
    "Effect": "Allow", 
    "Principal": { 
    "AWS": "arn:aws:iam::AccountB:root" 
    }, 
    "Action": "sts:AssumeRole" 
} 

然後,在我的accountB lambda代碼中,我需要假設該角色。這是來自lambda的相關代碼。

var AWS = require('aws-sdk'); 
var sts = new AWS.STS({ region: process.env.REGION }); 
var params = { 
    RoleSessionName: "hello-cross-account-session", 
    RoleArn: "arn:aws:iam::accountA:role/beta-na-DynamoDBStreamLambdaElasticSearch", 
    DurationSeconds: 900 
}; 
sts.assumeRole(params, function (err, data) { 
    if (err) { 
     console.log(err, err.stack); // an error occurred 
     context.fail('failed to assume role ' + err); 
     return; 
    } 
    log("assumed role successfully! %j", data) 
    postToES(bulkUpdateCommand, context); 
}); 
+0

感謝您發佈您的解決方案。爲此投了贊成票。 –