【问题标题】:How to access aws resources created in other account如何访问在其他帐户中创建的 aws 资源
【发布时间】:2020-05-11 17:01:10
【问题描述】:

在我的用例中,我想访问在 AWS 账户 A 中创建的 DynamoDB 表和在账户 B 中创建的 Lambda。为此,我在 Internet 上关注了许多建议我使用 AWS 承担角色功能的参考资料。 我在 Lambda 执行角色中添加了以下权限

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::aws-account-A-number:role/test-db-access"
   }
}

以下是Lambda的信任关系

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
           "Service": "lambda.amazonaws.com"
       },
      "Action": "sts:AssumeRole"
    },
    {
      "Effect": "Allow",
      "Principal": {
      "AWS": "arn:aws:iam::aws-account-A-number:root"
       },
     "Action": "sts:AssumeRole"
    }
  ]
}

在帐户 A 中,我创建了角色 (test-db-access) 以允许其他人访问此帐户,并添加了 AmazonDynamoDBFullAccess 和 AdministratorAccess 策略。以下是我在这个账号中添加的信任关系

{
  "Version": "2012-10-17",
   "Statement": [
     {
        "Effect": "Allow",
        "Principal": {
        "AWS": "arn:aws:iam::aws-account-B-number:role/sam-dev-test- 
            TestLambda-LambdaRole-1FH5IC18J0MYT"
         },
       "Action": "sts:AssumeRole"
     },
     {
       "Effect": "Allow",
       "Principal": {
           "Service": "lambda.amazonaws.com"
         },
       "Action": "sts:AssumeRole"
     }
  ]
}

以下是我添加的用于访问 Dynamo 数据库实例的 Java 代码

AssumeRoleRequest assumeRequest = new AssumeRoleRequest()
            .withRoleArn("arn:aws:iam::aws-account-A-number:role/test-db-access").withRoleSessionName("cross_acct_lambda").withDurationSeconds(900);
final AWSSecurityTokenService sts = AWSSecurityTokenServiceClientBuilder.standard().withRegion("eu-west-1").build();
final Credentials credentials = sts.assumeRole(assumeRequest).getCredentials();

以下是执行 lambda 时出现的崩溃日志

{ "errorMessage": "User: arn:aws:sts::aws-account-B-number:assumed-role/sam-dev-test-TestLambda-LambdaRole-1FH5IC18J0MYT/sam-dev-test-TestLambda-LambdaFunction-73TVOBN6VXXX is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::aws-account-A-number:role/test-db-access (Service: AWSSecurityTokenService; Status Code: 403; Error Code: AccessDenied; Request ID: 100bd3a3-3f9c-11ea-b642-d3b4d9ff35de)", "errorType": "com.amazonaws.services.securitytoken.model.AWSSecurityTokenServiceException" }

【问题讨论】:

  • 能否请您澄清一下:哪个账户拥有 IAM 用户凭证,您正在使用该账户服务?另外,您能否澄清一下您希望在账户 B 中使用 Lambda 做什么?您只想调用 Lambda 函数吗?
  • @JohnRotenstein 我希望在账户 B 中调用 lambda。此 lambda 正在尝试访问账户 A 中存在的 Dynamo DB 表。
  • @JohnRotenstein 您能否澄清一下:哪个账户拥有 IAM 用户凭证,您正在使用该账户的服务?我无法理解这个问题。我在具有 adminAccess policy 的 Account A 中创建了一个角色。我试图在我的 lambda 代码中扮演这个角色,但它抛出了 unauth 异常

标签: aws-lambda amazon-dynamodb amazon-iam aws-access-policy assume-role


【解决方案1】:

看来您的要求是:

  • Account-B 中的AWS Lambda 函数,访问Account-A 中的DynamoDB 表

为了重现您的情况,我做了以下操作:

  • Account-A 中创建了一个 DynamoDB 表
  • 使用以下策略在 Account-A 中创建了一个 IAM 角色 (Role-A):
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "dynamodb:*",
            "Resource": "arn:aws:dynamodb:ap-southeast-2:<Account-A>:table/Inventory"
        }
    ]
}

还有这个信任关系(指向下一步创建的角色):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<Account-B>:role/role-b"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
  • Account-B 中创建了一个 IAM 角色 (Role-B) 以用于 Lambda 函数,使用此策略:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::<Account-A>:role/role-a"
        }
    ]
}

有了这种信任关系:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
  • Account-B 中创建了一个 AWS Lambda 函数,它将:
    • 假设Role-AAccount-A
    • 访问Account-A中的DynamoDB表

我是 Python 人,所以我的功能是:

import boto3

def lambda_handler(event, context):

    # Assume Role
    sts_client = boto3.client('sts')

    response = sts_client.assume_role(
        RoleArn='arn:aws:iam::<Account-A>:role/stack-role-a', 
        RoleSessionName='bar')

    session = boto3.Session(
        aws_access_key_id=response['Credentials']['AccessKeyId'],
        aws_secret_access_key=response['Credentials']['SecretAccessKey'],
        aws_session_token=response['Credentials']['SessionToken']
    )

    # Update DynamoDB
    dynamodb_client = session.client('dynamodb')

    dynamodb_client.update_item(
        TableName='Inventory',
        Key={'Item': {'S': 'foo'}},
        UpdateExpression="ADD #count :increment",
        ExpressionAttributeNames = {
            '#count': 'count'
        },
        ExpressionAttributeValues = {
            ':increment': {'N': '1'},
        }
    ) 

我通过在Account-B 的 Lambda 函数上单击 Test 对此进行了测试。它成功更新了Account-A 中的 DynamoDB 表。

我怀疑不同之处在于您的信任政策,这似乎有点不同。

【讨论】:

    猜你喜欢
    • 2021-09-28
    • 2022-11-11
    • 2020-12-19
    • 2019-10-14
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多