我在AWS中创建了一个lambda函数,用于根据查询访问资源。
例如:我想通过API网关为客户FOO查询dynamoDB表FOO_BAR。
请求进来,我确定了其所需的表FOO,我希望能够将策略应用于我当前的lambda函数/会话,该函数/会话将授予对FOO_BAR表的访问权。
我的问题是:为了使lambda函数能够查询表FOO_BAR,在创建lambda函数时配置的执行角色需要具有读访问权限,并且我不想授予对此角色的任何通配符访问权限
使用的API通过自定义授权程序,我在这里应用了一个访问API的策略;我也希望我能让我的lambda函数继承自定义Authorizer生成的策略。
您是否可以动态授予lambda函数访问资源的权限?
谢谢!
答案 0 :(得分:0)
您的Lambda函数无法继承自定义授权程序的权限。
您可以在Lambda函数中授予权限或生成新的IAM凭据,并通过单独的客户端实例将其用于DynamoDB调用。
我不确定您的方法是否比通配符提供任何安全优势。授予自身权限的功能具有完全相同的安全级别。
答案 1 :(得分:0)
您可以使用AWS.STS承担角色功能
/**
* Assume Role for cross account operations
*/
assumeRole() {
let policy = {
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::356035958081:role/xyzRole"
}
};
let params = {
RoleArn: 'arn:aws:iam::356035958081:role/xyzRole',
RoleSessionName: 'awssdk',
Policy: JSON.stringify(policy)
};
console.info("Assuming Role with params:", params);
let sts = new AWS.STS();
return new Promise((resolve, reject) => {
sts.assumeRole(params, (error, data) => {
if (error) {
console.log(`Could not assume role, error : ${JSON.stringify(error)}`);
reject({
statusCode: 400,
message: error["message"]
});
} else {
console.log(`Successfully Assumed Role details data=${JSON.stringify(data)}`);
resolve({
statusCode: 200,
body: data
});
}
})
});
}
这将返回凭据
Credentials.AccessKeyId,
Credentials.SecretAccessKey,
Credentials.SessionToken