AWS ElasticSearch从帐户“B”中的lambda写入帐户“A”
我在帐户“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": "*"
}
]
}
当您为另一个帐户创建“角色”时,还需要设置“信任关系”。这是在AWS IAM控制台的“角色”下完成的。你的角色的第二个标签是“信任关系”。您需要将另一个帐户的帐户详细信息指定为可信。
“信任关系”本身就是一份政策文件。下面是一个示例,它允许您从其他帐户的AssumeRole调用我的AWS账户。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::2812XXXXYYYY:root"
},
"Action": "sts:AssumeRole"
}
]
}
在你的角色,只需指定权限正常,就像你在授予另一IAM用户/服务的权限(例如删除所有这些帐户类型的条目)。信任关系策略文档定义谁可以调用AssumeRole来授予这些权限。
在我上面的代码,我加入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);
});
感谢您发布您的解决方案。为此投了赞成票。 –
感谢约翰,这让我走上了正确的轨道 – jhilden