【问题标题】:AWS Lambda cross-account access deniedAWS Lambda 跨账户访问被拒绝
【发布时间】:2018-05-17 07:52:08
【问题描述】:

我有 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:assumed-role/my_cloudsearch_query_role/my_lambda_func 无权执行:cloudsearch:search on resource:myCSDomain

我确定我的帐户 ID 正确无误,因此没有混淆。我还需要做些什么才能使其正常工作吗?

【问题讨论】:

  • 您需要承担账户 111111111111 中的角色,然后使用返回的凭据创建您的客户端对象。使用assume_role boto3 API 调用获取凭据。
  • 啊,我以为这个角色会自动承担。如果您想将其放入答案中,我会为您接受
  • 当然。我会添加一个答案。

标签: amazon-web-services amazon-iam


【解决方案1】:

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

role_arn = "arn:aws:iam::111111111111:role/my_cloudsearch_query_role"
sts = boto3.client('sts', region_name="us-east-1")
token = sts.assume_role(RoleArn=role_arn, RoleSessionName="Session1")
credentials = token['Credentials']
access_key = credentials['AccessKeyId']
secret_key = credentials['SecretAccessKey']
token = credentials['SessionToken']
session = boto3.session.Session(
    aws_access_key_id=access_key,
    aws_secret_access_key=secret_key,
    aws_session_token=token
)
client = session.client('cloudsearchdomain', endpoint_url=endpoint)
response = client.search(...)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 2023-03-27
    • 2021-06-27
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    相关资源
    最近更新 更多