我正在使用API Gateway,lambda和cognito构建一个React应用程序(基本上从 https://serverless-stack.com 教程开始(。我想为我的 DynamoDb 设置精细的访问控制(即通过根据登录用户限制对 DynamoDb 表的访问的 IAM 策略 - 如 https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_dynamodb_rows.html(
AFAIK,lambda 函数承担 serverless.yml 文件中定义的服务角色,该角色本身与附加到登录的 cognito 用户的 AIM 策略无关。我知道使用aim_authorizer,我可以获取有关登录用户的信息。
我的问题:是否可以让 lambda 代表给定的 cognito 用户执行 AWS 调用,从而遵守附加到该用户的 IAM 策略?(有点类似于无服务器堆栈教程与 S3 的交互方式(
欢迎所有建议。
您可以向任何 AWS 客户端库显式指定用于签署请求的凭证(默认情况下,这些凭证取自运行时环境(:
import { DocumentClient } from 'aws-sdk/clients/dynamodb';
const client = new DocumentClient({
credentials: ...
});
这些安全凭据是通过 STS 获取的。有多种情况可以获取用户的身份以获取凭证,但通常,如果您有角色的 arn,则assumeRole
,如果有实际用户执行了 OpenID 连接流,则assumeRoleWithWebIdentity
import { Credentials, STS } from 'aws-sdk';
const sts = new STS();
const stsResponse = await sts.assumeRole({ RoleArn: 'can-be-cognito-group-arn' }).promise();
// or
// const stsResponse = await sts.assumeRoleWithWebIdentity({ WebIdentityToken: 'open-id-token' }).promise();
const credentials = new Credentials(
response.Credentials.AccessKeyId,
response.Credentials.SecretAccessKey,
response.Credentials.SessionToken);