首页 文章

API网关CLI Lambda权限(添加权限)

提问于
浏览
0

在阅读了大量页面(包括一些SO)之后提出了一些建议(参见下面的列表),我仍然无法通过AWS CLI命令行工具授予我的APIGateway访问权以执行新添加的Lambda函数 .

即我试图复制这个:

我创建了一个新的 endpoints ,具有以下集成设置:

一旦我尝试测试它(从API网关控制台中),我就会得到它

<AccessDeniedException>
  <Message>Unable to determine service/operation name to be authorized</Message>
</AccessDeniedException>

我知道这是因为,虽然我已经将lambda函数添加到方法中,但APIGateway策略仍未更新(图1),因此存在权限问题 .

如果我重新添加该功能并自动允许权限(通过AWS GUI),则测试和执行工作正常 .

我正在尝试执行的当前CLI命令是(通过PS):

aws lambda add-permission --function-name xx-url --statement-id apigateway-perm-1 --action lambda:InvokeFunction --principal apigateway.amazonaws.com --s
ource-arn "arn:aws:execute-api:{REGION}:{AWS_ACCOUNT_ID}:{API_ID}/*/*"

我试过上面 arn 地址的多个版本(包括 /*/* | /{STAGE}/{METHOD} | /{STAGE}/{METHOD}/{RESOURCE}

我也尝试在这些更改之前和之后部署API,但没有效果?

PS - 我也读过将函数的集成类型更改为POST的建议(参见this URL),但我的要求是有一个GET方法,也是 - 通过控制台手动添加这个GET方法工作正常,因此,所以应该通过CLI工具做同样的事情 .

URL列表(如果其他人在此问题/主题上寻找一些资源):

UPDATE #1

我还可以确认,在将新创建的_131433与现有的工作进行比较后,它们看起来几乎相同(只是命名不同):

使用的AWS CLI命令: aws lambda get-policy --function-name {FunctionName}

已经有效的政策与新创建政策的结果:

这让我怀疑它可能是我缺少的另一个步骤 .

EDIT (per request)

测试屏幕截图 - 此日志继续显示 AccessDeniedException 错误 .

以文本形式记录(为便于阅读而缩短一点):

请求测试请求的执行日志Tue Mar 28 22:59:40 UTC 2017:开始执行请求:test-invoke-request Tue Mar 28 22:59:40 UTC 2017:HTTP方法:GET,资源路径:/ api / v1 / Tue Mar 28 22:59:40 UTC 2017:方法请求路径:{} Tue Mar 28 22:59:40 UTC 2017:方法请求查询字符串: Tue Mar 28 22 :59:40 UTC 2017:方法请求 Headers :{} Tue Mar 28 22:59:40 UTC 2017:转换前的方法请求体:Tue Mar 28 22:59:40 UTC 2017: endpoints 请求URI:https:// lambda .ap-southeast-2.amazonaws.com / 2015-03-31 / functions / arn:aws:lambda:ap-southeast-2::function:xx-url / invocations Tue Mar 28 22:59:40 UTC 2017: endpoints 请求标头:{X-Amz-Date = 20170328T240Z,x-amzn-apigateway-api-id = ,Accept = application / json,Access-Control-Allow-Origin = *,User-Agent = AmazonAPIGateway_f,Host = lambda.ap-southeast-2.amazonaws.com,X-Amz-Content-Sha256 = 93438097f7627fe6203432b05e2257de86b32f74f8306,X-Amzn-Trace-Id = Root = 1-58 daeadc-bdd8f80d35834164c70,x-amzn-lambda-integration-tag = test-request,Authorization = ****************************** *************** d309e7,X-Amz-Source-Arn = arn:aws:execute-api:ap-southeast-2: / null / GET / api / v1 / ,X-Amz-Security-Token = FQoDYXdzEDcaDAzSjIbAbD9j0wBjWFBxP dR0 CGiK3flLOatlCr2 [TRUNCATED] Tue Mar 28 22:59:40 UTC 2017:转换后的 endpoints 请求体:{“resource”:“/ api / v1 /","path":"/api/v1/","httpMethod":"GET","headers":null,"queryStringParameters":{"fileName":"x.doc“} “pathParameters”:NULL, “stageVariables”:空 “的RequestContext”:{ “帐户ID”: “”, “RESOURCEID”: “”, “阶段”:“测试调用-stage”, “的requestId”: “测试调用请求”, “同一性”:{ “cognitoIdentityPoolId”:NULL, “帐户ID” “”, “cognitoIdentityId”:NULL, “呼叫者”: “ABPPLGO4:” “apiKey”: “测试调用的API密钥”, “SOURCEIP”: “测试调用源-IP”, “ACCESSKEY”: “ASHYYQ”, “cognitoAuthenticationType”:空, “cognitoAuthenticationProvider”:空”使用rArn“:”arn:aws:sts :: 111:assume-role / AWS-Admins / “,”userAgent“:”Apache-HttpClient / 4.5.x(Java / 1.8.0_112)“,”user“ : “AROZBPPLGO4:{名}”, “resourcePath”: “/ API / V1 / {路径}”, “列举HTTPMethod”: “GET”, “apiId”: “”, “体”:空, “isBase64Encoded”:false} Tue Mar 28 22:59:40 UTC 2017:转换前的 endpoints 响应体:

<AccessDeniedException> <Message>Unable to determine service/operation name to be authorized</Message> </AccessDeniedException>

Tue Mar 28 22:59:40 UTC 2017:终点响应 Headers :{x-amzn-RequestId = 39398a3e-140a-11e7-92a3-3fdc0fbb61c2,Connection = keep-alive,Content-Length = 130,Date = Tue,28 2017年3月22:59:39 GMT} Tue Mar 28 22:59:40 UTC 2017:由于配置错误导致执行失败:格式错误的Lambda代理响应Tue Mar 28 22:59:40 UTC 2017:方法已完成,状态:502

事实上,最终阅读 Malformed Lambda proxy response 不是问题 - 我通过手动重新选择lambda函数,允许应用权限,立即重新测试并且一切正常,Lambda甚至没有被调用来证明它 .

1 回答

  • 1

    总结聊天的调试:

    GET方法已创建使用不正确的Lambda的http方法, GET . 这导致Lambda无法解释来自API网关的请求,从而生成XML错误响应 . XML错误响应不是有效的JSON代理响应,因此生成502 .

    控制台正在添加必要的权限并将http方法重置为POST,因此在使用控制台后它成功的原因 .

相关问题