前言
在 Serverless 应用中,跨账户的资源访问是很常见的需求。例如,在基于微服务的架构中,我们可能需要通过 API Gateway 访问其他账号的 Lambda 函数或 DynamoDB 表。本文将介绍如何实现这样的跨账户访问,并提供示例代码。
IAM 跨账户角色
AWS Identity and Access Management (IAM) 提供了一个功能,可以在一个 AWS 账号里创建一个角色,并将该角色委托给其他账号。我们可以使用该角色来访问另一个账号里的资源。
1. 在被委托的账号中创建 IAM 角色
首先,我们需要在被委托的账号中创建一个 IAM 角色,并将该角色授予允许访问的资源权限。例如,如果我们想使用这个角色访问 DynamoDB 表,则需要将角色授权访问该表。创建 IAM 角色的过程中,需要注意以下几点:
- 当创建一个 IAM 角色时,需要选择“允许跨账户访问”选项。
- 在设置角色信任关系的过程中,需要指定信任方为委托方的账号 ID。
示例
这里以允许一个账号上的 Lambda 函数访问另一个账号上的 DynamoDB 表为例。
首先,在被委托的账号中,创建一个名为“DBAccessRole”的 IAM 角色,权限设置如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:DeleteItem", "dynamodb:UpdateItem", "dynamodb:Query", "dynamodb:Scan" ], "Resource": [ "arn:aws:dynamodb:us-east-1:123456789012:table/MyTable" ] } ] }
在委托方的账号中,创建一个名为“LambdaAccessRole”的 IAM 角色,用于允许 Lambda 函数访问外部账号中的 DynamoDB 表。在创建角色时,需要指定“信任方”为被委托的账号 ID。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:root" }, "Action": "sts:AssumeRole" } ] }
2. 获取访问证书
要使用被委托的角色来访问另一个账号中的资源,我们首先需要获取访问证书。
示例
下面是通过 AWS SDK for JavaScript(Node.js)获取访问证书的代码,我们假设委托方账号中的 Lambda 函数需要访问被委托方账号中的 DynamoDB 表。
const AWS = require('aws-sdk'); const sts = new AWS.STS({ apiVersion: '2011-06-15' }); const params = { RoleArn: 'arn:aws:iam::123456789012:role/DBAccessRole', RoleSessionName: 'WebIdentitySession' }; sts.assumeRole(params, (err, data) => { if (err) { console.log('Error', err.stack); } else { console.log('Assumed role', data); const dynamoDb = new AWS.DynamoDB({ apiVersion: '2012-08-10', credentials: data.Credentials }); // 后续逻辑 } });
3. 进行资源访问
获取访问证书之后,我们就可以使用该证书来访问被委托方的资源了。
示例
使用前面示例中获取到的访问证书,我们可以编写如下代码,访问被委托方账号中的 DynamoDB 表:
const AWS = require('aws-sdk'); const params = { TableName: 'MyTable', Item: { 'id': {N: '1'}, 'name': {S: 'Alice'}, } }; dynamoDb.putItem(params, (err, data) => { if (err) { console.log('Error', err); } else { console.log('Item added to table!', data); } });
总结
使用 IAM 跨账户角色,我们可以实现 Serverless 应用中跨账户资源的访问。本文介绍了如何创建角色、获取访问证书和进行资源访问,希望对大家有所帮助。
参考文献
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a201e6add4f0e0ffa15912