如何配置权限允许AWS API Gateway调用多环境下的任意Lambda函数
嘿,我来帮你搞定这两个API Gateway和Lambda的权限问题!先说说你遇到的阶段变量提示,再讲全局调用的配置(不过先提前预警:全局调用权限风险很高,谨慎使用)。
一、处理带阶段变量的Lambda调用权限
AWS的提示其实在说:你用了stageVariables.Qualifier动态指定Lambda的版本/别名,这时候不能给某个固定的Lambda版本/别名授权,必须把权限范围放宽到该函数的所有版本和别名,否则API Gateway没法根据阶段变量动态调用对应的版本。
方法1:用AWS CLI快速添加权限
直接运行下面的命令(把占位符换成你的实际信息):
aws lambda add-permission \ --function-name first \ --action lambda:InvokeFunction \ --principal apigateway.amazonaws.com \ --source-arn "arn:aws:execute-api:你的区域:你的账号ID:你的API_ID/*/*/*" \ --statement-id "AllowAPIGatewayInvokeFirst" \ --function-version "*"
--function-version "*":核心参数,允许调用这个函数的所有版本和别名,完美匹配你用阶段变量的场景--source-arn里的*:匹配API的所有阶段、HTTP方法、资源路径,如果你想更严谨,比如只允许production阶段调用,可以把第一个*换成production
对second函数执行同样的命令,只需要把--function-name改成second就行。
方法2:在Lambda控制台编辑资源策略
如果你习惯在控制台操作,进入Lambda函数的「配置」→「权限」→「资源策略」,添加以下JSON策略(替换占位符):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "apigateway.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:你的区域:你的账号ID:function:first:*", "Condition": { "ArnLike": { "AWS:SourceArn": "arn:aws:execute-api:你的区域:你的账号ID:你的API_ID/*/*/*" } } } ] }
复制一份修改函数名后,给second函数也加上这个策略。
二、允许API Gateway调用任意路径的所有Lambda函数
⚠️ 重要提醒:这种配置风险极高!任何能操作这个API Gateway的人都可以调用你AWS账号下的所有Lambda函数,可能导致意外的资源消耗甚至安全问题。除非你有非常特殊的业务需求,否则强烈建议缩小权限范围,只给需要的函数授权。
如果一定要配置全局权限,有两种方式:
CLI命令方式
aws lambda add-permission \ --function-name "*" \ --action lambda:InvokeFunction \ --principal apigateway.amazonaws.com \ --source-arn "arn:aws:execute-api:你的区域:你的账号ID:你的API_ID/*/*/*" \ --statement-id "AllowAPIGatewayInvokeAll" \ --function-version "*"
控制台资源策略方式
在任意一个Lambda函数的资源策略里添加(或者用IAM控制台创建一个全局策略):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "apigateway.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:你的区域:你的账号ID:function:*:*", "Condition": { "ArnLike": { "AWS:SourceArn": "arn:aws:execute-api:你的区域:你的账号ID:你的API_ID/*/*/*" } } } ] }
这里的Resource用*:*表示所有函数的所有版本/别名,SourceArn限制了只有你的目标API Gateway才能调用,稍微降低了一点风险。
最后记得部署API到对应的阶段,测试一下GET /first和GET /second,确认能正常触发Lambda函数哦!
内容的提问来源于stack exchange,提问作者hsz

