【问题标题】:Accessing two tables from different accounts within the same lambda function在同一个 lambda 函数中从不同帐户访问两个表
【发布时间】:2020-04-27 22:54:15
【问题描述】:

是否可以在一个 lambda 函数中访问两个表,而其中一个表与 lambda 函数在同一个帐户中,而另一个表在另一个帐户中?

我在 cross-account access delegation 上看到过使用 IAM 角色的文章。但我不确定代码应该如何反映从另一个帐户访问资源。这就是我通常访问一些 DynamoDb 表的方式:

const dynamodb = new AWS.DynamoDB();
const docClient = new AWS.DynamoDB.DocumentClient({ service: dynamodb });
docClient
  .get({
    TableName: 'SomeTable',
    Key: { id }
  });

查看documentation,构造函数中没有提及帐户ID。所以我不确定如何同时拥有两个连接,一个指向一个帐户,另一个指向另一个帐户!?

【问题讨论】:

标签: amazon-web-services amazon-dynamodb


【解决方案1】:

是的,可以从同一个 lambda 函数访问 2 个 dynamoDb 表(1 个在另一个 AWS 账户中)。

访问同一个帐户的 DynamoDB 表非常简单。

dynamodb_client_of_same_account = boto3.client('dynamodb', region_name='us-east-1')

要访问另一个 AWS 账户的表,需要创建一个新的 dynamoDb 客户端。您需要创建跨账户 IAM 角色并使用 STS 获取临时凭证。按照以下步骤创建跨账户角色。

AWS 账户 A 有 Lambda-----尝试读/写-----> AWS 账户 B 有 DynamoDB

在账户 B 中创建 IAM 角色以与账户 A 建立信任关系。

  1. 转到 IAM 角色 -------> 创建角色 ------> 在小部件中选择 *另一个 AWS 账户 *-----> 键入 AWS 账户 A ID 并创建角色

  2. 不要忘记将 DynamoDBAccess 策略添加到此 IAM 角色。

将 STS Assume Role 策略附加到您的 AWS Lambda 在账户 A 中的角色

  1. 使用以下 JSON 创建新策略并将此策略附加到您的 Lambda 角色。

    { “版本”:“2012-10-17”, “陈述”: [ { “效果”:“允许”, "动作": "sts:AssumeRole", “资源”:“” } ] }

  2. 使用以下代码创建一个新客户端以访问另一个帐户中的 DynamoDB 表。

    roleARN = '*<ARN of the role created in Step-1>*'
    client = boto3.client('sts')
    response = client.assume_role(RoleArn=roleARN, 
                                  RoleSessionName='RoleSessionName', 
                                  DurationSeconds=900)
    
    dynamodb_client_for_other_account = boto3.client('dynamodb', region_name='us-east-1',
                aws_access_key_id=response['Credentials']['AccessKeyId'],
                aws_secret_access_key=response['Credentials']['SecretAccessKey'],
                aws_session_token = response['Credentials']['SessionToken'])
    

【讨论】:

    【解决方案2】:

    您可以在第二个帐户上创建一个 IAM 用户,
    添加 DynamoDB 权限并为其获取访问/密钥
    然后:

    const dynamodb1 = new AWS.DynamoDB();
    const dynamodb2 = new AWS.DynamoDB({
        accessKeyId:     'x',
        secretAccessKey: 'y',
        region: 'z',
    })
    

    dynamodb1 将使用来自 lambda 的角色权限
    以及来自第二个账户的 IAM 用户的 dynamodb2

    【讨论】:

    • 你可以这样做,它会起作用,但这不是最佳做法。解决方案是使用 IAM 角色跨 AWS 账户委派访问权限。
    猜你喜欢
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    相关资源
    最近更新 更多