我有一个场景,在这个场景中,我希望在代码中从AWS中的另一个帐户访问一个帐户内的资源(跨帐户访问(。我想使用NodeJs实现这种访问,NodeJs作为lambda函数实现,也作为EC2上的长期运行代码实现。
通过在线阅读如何做到这一点,我知道我需要aws.STS
生成的临时凭据,如下所示:
const AWS = require('aws-sdk');
const sts = new AWS.STS();
const stsResults = await sts.assumeRole({
RoleArn: 'arn:aws:iam::111111111111:role/role_name',
RoleSessionName: 'STRING_VALUE',
}).promise();
const dynamodb = new AWS.DynamoDB({
region: 'us-east-1',
accessKeyId: stsResults.Credentials.AccessKeyId,
secretAccessKey:stsResults.Credentials.SecretAccessKey,
sessionToken: stsResults.Credentials.SessionToken
});
我的问题是关于RoleSessionName
属性,它是必需的。我很难理解它的作用以及我应该如何使用它。这就是AWS文档对它的描述:
RoleSessionName--(字符串(假定角色会话的标识符。
使用角色会话名称来唯一标识相同的会话角色由不同的主体承担,或者由于不同的原因。在里面跨帐户场景,角色会话名称对可见,并且可以由拥有该角色的帐户记录。角色会话名称为也用于假定角色主体的ARN。这意味着使用临时安全性的后续交叉帐户API请求凭据将向外部帐户公开角色会话名称在他们的AWS CloudTrail日志中。
用于验证此参数的正则表达式是一个字符串由大写和小写字母数字字符组成,没有空间。您还可以包括下划线或以下任何内容字符:=,.@-
就我个人而言,我并不担心安全性,因为两个帐户都归同一家公司所有,拥有多个帐户的唯一原因是在逻辑上分离资源。我想知道的是这个属性对assumeRole
函数调用性能的影响。我应该对所有lambda函数使用相同的RoleSessionName
吗?我应该在每次创建新会话时创建一个随机ID吗?
根据您引用的文档:
当不同主体或出于不同原因承担相同角色时,使用角色会话名称来唯一标识会话。
假设您有一个IAM角色,它由一个程序承担。这将返回一组可用于访问AWS服务的临时凭据。
在审计跟踪中,角色所做的任何事情都将被跟踪为已由角色完成(而不是由承担该角色的实体完成(。这使得追踪这些API调用的来源变得困难,因为该角色可能由"不同的主体或出于不同的原因"承担。例如,多个程序可能使用该角色。
为了帮助追踪此类请求的"来源",提供了RoleSessionName
来识别特定假设。它可以帮助您识别哪个应用程序正在使用凭据。