我正在通过Visual Studio使用AWS Lambda和API网关构建无服务器应用程序。我正在C#中工作,并使用无服务器应用程序模型(SAM)来部署我的API。我在Visual Studio中构建代码,然后通过发布到Lambda进行部署。这是可行的,除了每次我进行新的构建并尝试执行API调用时,都会收到此错误:
由于配置错误,执行失败:Lambda函数的权限无效
做一些研究后,我发现此修复已在其他地方提到(通过AWS控制台完成):
修复:转到“ API网关”>“ API名称”>“资源”>“资源名称”>“方法”>“集成请求”>“ Lambda函数”并重新选择我现有的函数,然后用小勾号“保存”。 >
现在这对我有用,但是它破坏了使用serverless.template(JSON)来构建我的API的自动化。有谁知道如何在serverless.template文件中解决此问题?这样我就无需在控制台中采取任何措施来解决?这是来自serverless.template文件的我的一种方法的示例
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Transform" : "AWS::Serverless-2016-10-31",
"Description" : "An AWS Serverless Application.",
"Resources" : {
"Get" : {
"Type" : "AWS::Serverless::Function",
"Properties": {
"VpcConfig":{
"SecurityGroupIds" : ["sg-111a1476"],
"SubnetIds" : [ "subnet-3029a769","subnet-5ec0b928"]
},
"Handler": "AWSServerlessInSiteDataGw::AWSServerlessInSiteDataGw.Functions::Get",
"Runtime": "dotnetcore2.0",
"CodeUri": "",
"MemorySize": 256,
"Timeout": 30,
"Role": null,
"Policies": [ "AWSLambdaBasicExecutionRole","AWSLambdaVPCAccessExecutionRole","AmazonSSMFullAccess"],
"Events": {
"PutResource": {
"Type": "Api",
"Properties": {
"Path": "/",
"Method": "GET"
}
}
}
}
},
答案 0 :(得分:9)
您可能在权限配置中遇到了问题,这就是API无法调用您的lambda的原因。尝试明确地以invoke
的形式向{。
apigateway
以下是SAM github repo中报告的问题,以供完全参考,这是一个example的Hello SAM项目
如果您想通过AWS CLI添加权限以进行测试,则可能要使用principal
。请访问official documentation website了解更多详情。
答案 1 :(得分:8)
我有一个类似的问题-我删除了,然后重新安装了lambda函数。我的API网关仍然指向旧的API,因此我不得不进入API网关并更改“资源方法”以更改“集成请求”设置以指向新的API(它似乎指向正确的API,但没有就我而言)
答案 2 :(得分:3)
相同的错误,解决方案很简单:在API网关的集成设置中再次清除并应用“ Lambda函数”映射。
我的映射如下所示:MyFunction-894AR653OJX:test
,其中“ test”是指向我的lambda的正确版本的别名
该问题是由于在lambda上删除了ALIAS“测试”,然后在另一个版本上(在发布之后)重新创建的。看来,API网关内部仍旧链接到“旧” ALIAS 实例。 您可能希望完全按照名称进行匹配...
奖金:因此,无法通过AWS控制台移动该ALIAS,但是可以使用以下命令通过AWS CLI进行此操作:
aws lambda --profile <YOUR_PROFILE> update-alias --function-name <FUNCTION_NAME> --name <ALIAS_NAME> --function-version <VERSION_NUMBER>
答案 3 :(得分:1)
我遇到了同样的问题,但是我正在通过Terraform进行部署。在收到另一个用户的建议后,我在API网关的“集成”部分中重新选择了Lambda函数,然后检查了Lambda权限中发生了什么变化。事实证明,我需要在Lambda资源中的API Gateway触发器的source_arn部分中放置阶段名称的地方添加一个“ *”。不知道SAM与Terraform相比如何,但是也许您可以更改阶段名称,或者只是尝试我尝试过的这种故障排除技术。
答案 4 :(得分:0)
我有一个类似的问题,并且正在使用Terraform。它需要其中带有“ POST”的策略。出于某种原因,/ * /(通配符)策略不起作用?
这是我用来解决此问题的策略和示例地形。
非常感谢以上所有内容。
这是我的Lambda函数策略JSON的样子和地形:
{
"Version": "2012-10-17",
"Id": "default",
"Statement": [
{
"Sid": "AllowAPIGatewayInvoke",
"Effect": "Allow",
"Principal": {
"Service": "apigateway.amazonaws.com"
},
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:us-east-1:999999999999:function:MY-APP",
"Condition": {
"ArnLike": {
"AWS:SourceArn": "arn:aws:execute-api:us-east-1:999999999999:d85kyq3jx3/test/*/MY-APP"
}
}
},
{
"Sid": "e841fc76-c755-43b5-bd2c-53edf052cb3e",
"Effect": "Allow",
"Principal": {
"Service": "apigateway.amazonaws.com"
},
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:us-east-1:999999999999:function:MY-APP",
"Condition": {
"ArnLike": {
"AWS:SourceArn": "arn:aws:execute-api:us-east-1:999999999999:d85kyq3jx3/*/POST/MY-APP"
}
}
}
]
}
add in a terraform like this:
//************************************************
// allows you to read in the ARN and parse out needed info, like region, and account
//************************************************
data "aws_arn" "api_gw_deployment_arn" {
arn = aws_api_gateway_deployment.MY-APP_deployment.execution_arn
}
//************************************************
// Add in this to support API GW testing in AWS Console.
//************************************************
resource "aws_lambda_permission" "apigw-post" {
statement_id = "AllowAPIGatewayInvokePOST"
action = "lambda:InvokeFunction"
//function_name = aws_lambda_function.lambda-MY-APP.arn
function_name = module.lambda.function_name
principal = "apigateway.amazonaws.com"
// "arn:aws:execute-api:us-east-1:473097069755:708lig5xuc/dev/POST1/cloudability-church-ws"
source_arn = "arn:aws:execute-api:${data.aws_arn.api_gw_deployment_arn.region}:${data.aws_arn.api_gw_deployment_arn.account}:${aws_api_gateway_deployment.MY-APP_deployment.rest_api_id}/*/POST/${var.api_gateway_root_path}"
}
答案 5 :(得分:0)
我遇到了同样的问题,所以我删除了然后创建了堆栈,然后它起作用了。
答案 6 :(得分:0)
我有同样的问题。我将集成更改为模拟,即将集成类型设置为Lambda,然后在进行一次部署后将集成类型再次设置为Lambda。此后,它完美地工作了。
我希望这会有所帮助。
答案 7 :(得分:0)
面对相同的问题,我发现问题是:API网关无法调用Lambda函数,因为我看不到lambda函数的任何CloudWatch日志。
因此,我首先浏览了 API网关控制台,并在集成请求下-给出了Lambda函数的完整ARN。并且开始工作。
第二,通过CloudFormation
x-amazon-apigateway-integration:
credentials:
Fn::Sub: "${ApiGatewayLambdaRole.Arn}"
type: "aws"
uri:
Fn::Sub: "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${lambda_function.Arn}/invocations"
答案 8 :(得分:0)
AWS lambda 资源权限的文档显示了可以过滤或通配符 /*/*/* 的 3 个访问级别,记录为 $stage/$method/$path。但是,他们的示例和大多数在线示例仅使用 2 个级别,而我仅使用 3 个级别就将头撞在墙上,结果拒绝访问。我更改为 2 个级别,然后 lambda 创建了触发器。希望这可以避免有人将计算机扔到墙上。