从同一lambda函数中的不同帐户访问两个表

时间:2019-02-14 14:08:35

标签: amazon-web-services amazon-dynamodb

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

我在这里{@ 3}看到过有关使用IAM角色的文章。但是我不确定代码应如何反映从另一个帐户访问资源。这通常是我访问某些DynamoDb表的方式:

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

看看cross-account access delegation,在构造函数中没有提及帐户ID。因此,我不确定如何同时建立两个连接,一个指向一个帐户,另一个指向另一个帐户!

2 个答案:

答案 0 :(得分:6)

是的,可以从同一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 -----尝试读/写-----> 使用DynamoDB的AWS帐户B

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

  1. 转到IAM角色------->创建角色------>在小部件中选择*另一个AWS帐户* --->输入AWS Account A Id并创建角色

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

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

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

    { “ Version”:“ 2012-10-17”, “声明”:[ { “效果”:“允许”, “ Action”:“ 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'])
    

答案 1 :(得分:0)

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

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

dynamodb1将使用lambda的角色权限
和dynamodb2与第二个帐户的IAM用户