我是新手,觉得我错过了Cognito用户池组上的IAM角色与调用lambda函数之间的联系。
使用案例:我想使用Cognito来管理没有联合身份/池的用户帐户(我不需要联合)。 Cognito的一个功能是组的概念,用户可以在同一个池中分割成具有不同关联IAM角色的不同组(即"管理员""客户"等等) 。通过浏览器应用程序和JavaScript(在S3中)用户登录并获取accessToken(也是idToken和refreshToken)。到目前为止,一切都很好。
我的问题是我想使用' lambda.invoke'来调用函数。对于各种事物(即对DynamoDB的读写)并希望避免使用API网关的额外步骤。
从browser-invoke-lambda-function-example我可以看到如何使用' AWS.CognitoIdentityCredentials',但据我所知,这需要联合身份。
Lambda class documentation还记录了如何使用IAM accessKeyId和secretAccessKey,但我想使用Cognito User Pool / Group-> Role中登录的用户凭据来调用Lambda函数。
具体 - 如果有人可以建议是否可以使用仅使用用户池和用户组的浏览器JavaScript中的lambda.invoke ,我会很感激(假设有一个与用户组关联的IAM角色) ?
如果可能,请提供一些示例代码/或方向,以便我了解具体方法。
PS:我意识到之前提出过类似的问题(即Is it possible to invoke a Lambda function with a cognito userpool identity? ),但细节上的问题很细,所以答案同样含糊不清。答案 0 :(得分:0)
我从浏览器端JavaScript调用Lambda。如果我没记错的话,您需要创建允许用户访问lambda的IAM角色。像这样完美地工作:
var lambda = new AWS.Lambda();
var params_lambda = {
FunctionName: 'your_function_name',
Payload: JSON.stringify(userPool.getCurrentUser().username) // data you want to send to lambda
};
lambda.invoke(params_lambda, function (err, data) {
if (err) {
console.log(err);
window.location.href = "login.html";
}
else{
console.log(JSON.parse(data.Payload)); // print out data you receive from lambda
}
});
实例var lambda = new AWS.Lambda();
需要
accessKeyId,
sessionToken
和
区域
答案 1 :(得分:0)
如果启用"联合身份池",则使用" Cognito提供商"仅(因为不需要联合身份),并且在提供者"身份验证角色选择"你选择"从令牌中选择角色"和#34;角色解析" DENY。
function test() { // eslint-disable-line no-unused-vars
// Prepare to call Lambda function
let pullResults;
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: <<IdentityPoolId>>,
Logins: {
"cognito-idp.<<REGION>>.amazonaws.com/<<USER POOL ID>>": <<idToken>>,
},
});
const lambda = new AWS.Lambda({
apiVersion: "2015-03-31",
});
const pullParams = {
FunctionName: "<<Lambda Function Name>>",
InvocationType: "RequestResponse",
LogType: "None",
};
// Call the Lambda Function
lambda.invoke(pullParams, function (err, data) {
if (err) {
console.log(err);
} else {
pullResults = JSON.parse(data.Payload);
console.log(pullResults);
}
});
}
虽然这会创建一个联合身份,但它不会使用Cognito Provider以外的任何内容,而是从用户所属的组中获取IAM角色。
有效:使用用户池中的Cognito用户,并根据分配给用户的用户组分配权限。