AWS Lambda跨帐户访问被拒绝

时间:2018-05-17 07:52:08

标签: amazon-web-services amazon-iam

我有2个AWS账户。帐户1有一个CloudSearch域,我需要从帐户2中的Lambda函数进行查询。我已经跟踪tutorial here在帐户1中创建了一个允许跨帐户访问的角色。

因此,在帐户1中,我的角色arn:aws:iam::111111111111:role/my_cloudsearch_query_role如下所示:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "cloudsearch:search",
            "Resource": "*"
        }
    ]
}

此角色有一个受信任的实体,帐户2,我可以在“受信任的实体”部分中看到IAM控制台中角色的正确帐户ID。

在帐户2中,我创建了一个Lambda函数,其执行角色如下所示:

{
  "roleName": "my_cloudsearch_query_role",
  "policies": [
    {
      "document": {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "logs:CreateLogGroup",
              "logs:CreateLogStream",
              "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*"
          },
          {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::111111111111:role/my_cloudsearch_query_role"
          }
        ]
      },
      "name": "oneClick_lambda_basic_execution_1526469274620",
      "type": "inline"
    }
  ]
}

我的Lambda函数(Python 3)代码尝试像这样查询CloudSearch:

client = boto3.client('cloudsearchdomain', endpoint_url=endpoint)
response = client.search(
    query="(and name:'foobar')",
    queryParser='structured',
    returnFields='curr_addr',
    size=1
)

对Lambda函数的所有调用都会失败,并显示以下错误:

  

调用搜索操作时发生错误(AccessDenied):用户:arn:aws:sts :: 222222222222:assume-role / my_cloudsearch_query_role / my_lambda_func无权执行:cloudsearch:搜索资源:myCSDomain

我很肯定我已经获得了正确的帐户ID,所以没有混淆。为了让它发挥作用,我还需要做些什么吗?

1 个答案:

答案 0 :(得分:2)

您需要在帐户111111111111中担任角色,然后使用返回的凭据创建客户端对象。使用assume_role boto3 API调用来获取凭据。这是一个示例代码:

/**
 * Get the password reset credentials from the request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return array
 */
protected function credentials(Request $request)
{
    return [
        'email_hash' => hash('sha256', $request->get('email')),
        'password' => $request->get('password'),
        'password_confirmation' => $request->get('password_confirmation'),
        'token' => $request->get('token')
    ];
}

请使用正确的详细信息更新role_arn。可以找到有关Session对象的文档here