【问题标题】:AWS ElasticSearch write to account "A" from lambda in account "B"AWS ElasticSearch 从账户“B”中的 lambda 写入账户“A”
【发布时间】:2017-10-09 21:14:34
【问题描述】:

我在账户“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"
}

我尝试将 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": "*"
    }
  ]
}

【问题讨论】:

    标签: amazon-web-services elasticsearch lambda


    【解决方案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);
    }); 
    

    【讨论】:

    • 感谢您发布解决方案。对此投赞成票。
    • 您的 ES 是在 VPC 中创建的?您是如何配置 ES 的安全组以便从账户 B 向您的 lambda 函数开放端口 443 的?
    • @florins 我认为这个场景基于公共 AWS 弹性搜索。如果它在 VPC 中,则表示它是私有的。如果 lambda 也在另一个帐户的 VPC 中,那么私下交谈的解决方案可能是 VPC 对等互连或 VPN,因为仍然不支持通过私有链接使用 AWS 弹性搜索..
    【解决方案2】:

    当您为另一个帐户创建“角色”时,您还需要设置“信任关系”。这是在“角色”下的 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

    【讨论】:

      猜你喜欢
      • 2020-10-22
      • 2020-09-27
      • 2020-12-08
      • 1970-01-01
      • 2021-12-07
      • 2020-09-10
      • 2019-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多