Amazon web services 可以通过API网关获取但不能发布到Lambda。为什么?

Amazon web services 可以通过API网关获取但不能发布到Lambda。为什么?,amazon-web-services,aws-lambda,Amazon Web Services,Aws Lambda,下面是客户提出的请求。GET请求成功,但POST请求出错 fetch('api/public/libraries/sign-out-discourse', { method: 'GET', // or 'POST' headers: new Headers([ ['Accept', 'application/json'], ['Content-Type', 'application/json'], ['Authorization',

下面是客户提出的请求。GET请求成功,但POST请求出错

fetch('api/public/libraries/sign-out-discourse', {
    method: 'GET', // or 'POST'
    headers: new Headers([
        ['Accept', 'application/json'],
        ['Content-Type', 'application/json'],
        ['Authorization', jwtToken],
    ]),
})
以下是POST请求中的错误:

HTTP/1.1 403 Forbidden
Server: CloudFront
Date: Fri, 05 Oct 2018 08:50:14 GMT
Content-Type: text/html
Content-Length: 694
Connection: keep-alive
X-Cache: Error from cloudfront
Via: redacted
X-Amz-Cf-Id: redacted

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>ERROR: The request could not be satisfied</TITLE>
</HEAD><BODY>
<H1>403 ERROR</H1>
<H2>The request could not be satisfied.</H2>
<HR noshade size="1px">
This distribution is not configured to allow the HTTP request method that was used for this request. The distribution supports only cachable requests.

<BR clear="all">
<HR noshade size="1px">
<PRE>
Generated by cloudfront (CloudFront)
Request ID: redacted
</PRE>
<ADDRESS>
</ADDRESS>
</BODY></HTML>
我试过的

在CloudFront中,我选择了行为->编辑->允许的HTTP方法:GET、HEAD、OPTIONS、PUT、POST、PATCH、DELETE。在AWS以某种方式将设置存储在CloudFront缓存中的不太可能的情况下,我利用这个机会使缓存失效

在API Gateway graphical中,我为资源启用了CORS。自从进行此更改后,我重新部署了API

其他调试


curl-X POST API_ENDPOINT返回的错误与从我的应用程序中使用POST调用端点的错误相同。

如果您使用的是Lambda代理集成,则需要在响应中提供CORS头,API网关不会为您的POST请求执行此操作

var response = {
    statusCode: 200,
    headers: {
        "Access-Control-Allow-Origin" : "*",
        "Access-Control-Allow-Credentials" : true
    },
    body: JSON.stringify({"message":"Success"})
}
callback(null, response);

我不使用Lambda代理集成。老实说,我不知道我是否应该这样做。我收集来阅读的是,它是为lambda发送数据到其他lambda的。这不是我的用例。不管是哪种情况,我都试着将你的修改添加到我的Lambda代码中。我仍然收到相同的403错误。您是否尝试过直接调用API网关,即不通过CloudFront调用?不幸的是,我还没有想出如何执行此操作。但是如果我在Lambda接口中创建一个测试事件并运行它,我会得到一个200。在API网关控制台中,转到API>MyAPI>Stages>MyStage,它应该位于页面顶部,调用URL。当我这样做时,我仍然会得到一个错误,但另一个错误是关于授权头的错误。因此,绕过云端肯定可以解决我原来的问题。我的CloudFront配置可能有什么问题?