本地运行Lex机器人报错:调用Lambda函数遭权限拒绝,请排查策略
解决AWS Lex调用Lambda时的权限拒绝问题
嘿,我来帮你排查这个Lex调用Lambda的权限错误~咱们一步步来:
1. 先修复角色信任关系的语法bug
你给的信任关系JSON有个明显的语法问题:里面重复写了"Service"字段,还留了个空的"Service" : ,这会让AWS没法正确解析这个策略,先把这个问题修好。
修正后的信任关系JSON(我保留了你需要的Cognito和Lex主体,删掉了无效的空条目):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "cognito-identity.amazonaws.com", "Service": "lex.amazonaws.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "us-east-1:*****-*****-*****" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "unauthenticated" } } } ] }
另外,如果这个角色是Lambda的执行角色(也就是Lambda运行时用的角色),那你还得把lambda.amazonaws.com加到Principal的Service列表里,因为Lambda本身需要扮演这个角色才能执行函数,修改后是这样:
"Service": ["lex.amazonaws.com", "lambda.amazonaws.com"]
2. 给Lambda配置允许Lex调用的资源策略(这是关键!)
错误提示的核心是Lex没有权限调用你的Lambda函数,这可不是角色信任关系的问题,而是Lambda函数本身的资源策略没开权限。咱们得给Lambda加个权限,允许Lex服务触发它:
用AWS CLI的方式
运行下面的命令,记得把占位符换成你自己的信息:
aws lambda add-permission \ --function-name dataCodeHook \ --statement-id lex-access \ --action lambda:InvokeFunction \ --principal lex.amazonaws.com \ --source-arn arn:aws:lex:us-east-1:***********:intent:DataProcess:4
用AWS控制台的方式
- 打开Lambda控制台,找到你的
dataCodeHook函数 - 切到配置标签,选权限
- 在资源策略那块,点添加权限
- 受信实体类型选AWS服务,然后选Lex作为服务
- 来源ARN里填你的Intent ARN:
arn:aws:lex:us-east-1:***********:intent:DataProcess:4 - 操作选
lambda:InvokeFunction,给这个权限起个ID(比如lex-intent-access),最后保存就行
3. 最后确认Lambda执行角色的权限
确保你的Lambda执行角色有函数运行需要的所有权限(比如如果函数要访问S3或者DynamoDB,得给对应权限),不过这不是当前报错的直接原因,但也得检查下避免后续问题。
做完这些步骤后,再测试你的Lex机器人,应该就能解决这个访问被拒绝的问题啦~
内容的提问来源于stack exchange,提问作者Dileephell
相关产品推荐
相关产品推荐

