是否可以在一个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。因此,我不确定如何同时建立两个连接,一个指向一个帐户,另一个指向另一个帐户!
答案 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建立信任关系。
转到IAM角色------->创建角色------>在小部件中选择*另一个AWS帐户* --->输入AWS Account A Id并创建角色
不要忘记将DynamoDBAccess策略添加到此IAM角色。
将STS假设角色策略附加到您的AWS Lambda在账户A中的角色
使用以下JSON创建新策略,并将该策略附加到您的Lambda角色。
{ “ Version”:“ 2012-10-17”, “声明”:[ { “效果”:“允许”, “ Action”:“ sts:AssumeRole”, “资源”:“ ” } ] }
使用以下代码创建一个新客户端,以访问另一个帐户中的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用户