AWS ElasticSearch 从账户“B”中的 lambda 写入账户“A”

jhi*_*den 4 lambda amazon-web-services elasticsearch

我在账户“A”中有一个 AWS ElasticSearch 集群。

我正在尝试在帐户“B”中创建一个 lambda(从 DynamoDB 流触发),它将写入帐户“A”中的 ES。

我收到以下错误:

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

我曾尝试将 STS 和 ROLE 放入 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": "*"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

jhi*_*den 5

在我上面的代码中,我添加arn:aws:sts::AccountB:assumed-role/lambdaRole1/sourceTableToSNS到 AccountA ES 访问列表中,这是错误的。而是执行以下操作:

我已经arn:aws:iam::AccountA:role/beta-na-DynamoDBStreamLambdaElasticSearch在 ES 访问列表中,我需要为该角色添加一个信任关系(从 IAM 角色屏幕),以便 AccountB 承担。我将其添加到信任关系中:

{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::AccountB:root"
  },
  "Action": "sts:AssumeRole"
}
Run Code Online (Sandbox Code Playgroud)

然后,在我的 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);
}); 
Run Code Online (Sandbox Code Playgroud)


Joh*_*ley 4

当您为另一个帐户创建“角色”时,您还需要设置“信任关系”。这是在 AWS IAM 控制台的“角色”下完成的。您的角色的第二个选项卡是“信任关系”。您需要将另一个帐户的帐户详细信息指定为受信任。

“信任关系”本身就是一份政策文件。下面是一个示例,允许您从另一个账户调用 AssumeRole 到我的 AWS 账户。

    {
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::2812XXXXYYYY:root"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

在您的角色中,只需正常指定权限,就像您为另一个 IAM 用户/服务授予权限一样(例如,删除所有这些账户类型条目)。信任关系策略文档定义谁可以调用 AssumeRole 来被授予这些权限。

创建角色以向 IAM 用户委派权限

修改角色