标签: aws-api-gateway

aws cloudfront api 端点响应 Forbidden(403)

我在 api 网关后面有一个 lambda 函数。当使用Invoke URL触发时,此功能工作正常。调用 URL 是阶段下方法选项卡中提供的链接。

\n\n

在此输入图像描述

\n\n

我正在向以下资源发送请求,效果很好。\n在此输入图像描述

\n\n

我想为我的 api 设置自定义域,因此我按照标准程序设置 ACM 证书。除此之外,我还在route53中设置了域(api.tarkshala.com)。检查下面给出的屏幕截图。

\n\n

已导入 ACM 证书\n在此输入图像描述

\n\n

自定义域映射\n在此输入图像描述

\n\n

Route53 中映射的域名\n在此输入图像描述

\n\n

但是,当我使用 Cloudfront 链接(d3pn2j4magp6tp.cloudfront.net)或使用 POSTMAN 的域名(api.tarkshala.com)访问 API 时,它最终会变成403 Forbidden

\n\n

我不知道我到底错过了什么?

\n\n

响应标头如下所示:

\n\n
Connection \xe2\x86\x92keep-alive\nContent-Length \xe2\x86\x9223\nContent-Type \xe2\x86\x92application/json\nDate \xe2\x86\x92Fri, 13 Apr 2018 03:17:25 GMT\nVia \xe2\x86\x921.1 a1cf0e6cf29b584b5fe1ada9ccee9758.cloudfront.net (CloudFront)\nX-Amz-Cf-Id \xe2\x86\x929Jh5HeQIuDNfm5WGlTae34oYZ7BiN3nI2VlH_8PJHLQ0mr2C20njJQ==\nX-Cache \xe2\x86\x92Error from cloudfront\nx-amz-apigw-id \xe2\x86\x92FQoiyF1phcwFVrg=\nx-amzn-ErrorType \xe2\x86\x92ForbiddenException\nx-amzn-RequestId \xe2\x86\x923013c239-3ec9-11e8-abe6-53449bcfc96c\n
Run Code Online (Sandbox Code Playgroud)\n\n

回复:

\n\n
{\n    "message": "Forbidden"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

amazon-web-services aws-api-gateway

10
推荐指数
1
解决办法
2万
查看次数

AWS CDK 将 API 网关 URL 传递到同一堆栈中的静态站点

我正在尝试在单个堆栈中部署 S3 静态网站和 API 网关/lambda。

S3 静态站点中的 javascript 调用 lambda 来填充 HTML 列表,但它需要知道用于 lambda 集成的 API 网关 URL。

目前,我像这样生成了一个 RestApi ......

    const handler = new lambda.Function(this, "TestHandler", {
      runtime: lambda.Runtime.NODEJS_10_X,
      code: lambda.Code.asset("build/test-service"),
      handler: "index.handler",
      environment: {
      }
    });

    this.api = new apigateway.RestApi(this, "test-api", {
      restApiName: "Test Service"
    });    

    const getIntegration = new apigateway.LambdaIntegration(handler, {
      requestTemplates: { "application/json": '{ "statusCode": "200" }' }
    });

    const apiUrl = this.api.url;
Run Code Online (Sandbox Code Playgroud)

但是在 cdk 部署上,apiUrl =

"https://${Token[TOKEN.39]}.execute-api.${Token[AWS::Region.4]}.${Token[AWS::URLSuffix.1]}/${Token[TOKEN.45]}/"

因此,直到静态站点需要该值之后,才会解析/生成 url。

如何计算/查找/获取 API 网关 URL 并更新 cdk …

aws-lambda aws-api-gateway aws-cdk

10
推荐指数
1
解决办法
1279
查看次数

如何修复“WebSocket API 连接持续时间:2 小时”的 websocket 限制

我正在使用 API Gateway websocket 连接,并且我已阅读此限制:

https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html

它说 WebSocket API 的连接持续时间限制为 2 小时。这是否意味着我无法保持连接超过 2 小时?如果是,解决方法是什么?我是否必须每 2 小时重新建立一次连接才能保持连接?

amazon-web-services websocket aws-api-gateway

10
推荐指数
1
解决办法
2519
查看次数

AWS CDK 如何根据 OpenApi 规范创建由 Lambda 支持的 API 网关?

我想使用 AWS CDK 来定义 API 网关和 APIG 将代理到的 lambda。

OpenAPI 规范支持x-amazon-apigateway-integration对 Swagger 规范的自定义扩展(在此处详细说明),为此需要 lambda 的调用 URL。如果 lambda 定义在与 API 相同的堆栈中,我在 OpenAPI 规范中看不到如何提供它。我能想到的最好的方法是使用 lambda 定义一个堆栈,然后从中获取输出并运行sed以在 OpenAPI 规范中执行查找和替换以插入 uri,然后使用此修改创建第二个堆栈OpenAPI 规范。

例子:

  /items:
    post:
      x-amazon-apigateway-integration:
        uri: "arn:aws:apigateway:eu-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:eu-west-2:123456789012:function:MyStack-SingletonLambda4677ac3018fa48679f6-B1OYQ50UIVWJ/invocations"
        passthroughBehavior: "when_no_match"
        httpMethod: "POST"
        type: "aws_proxy"

Run Code Online (Sandbox Code Playgroud)

一季度。这似乎是一个鸡与蛋的问题,以上是唯一的方法吗?

我尝试使用SpecRestApi CDK 构造的defaultIntegration属性。该文件指出:

除非指定了集成,否则用作此 API 中创建的所有方法的默认值的集成。

这似乎应该能够使用 CDK 规范中定义的 lambda 定义默认集成,因此所有方法都使用此集成,而无需提前知道 lambda 的 uri。

因此我试过这个:

SingletonFunction myLambda = ...

SpecRestApi openapiRestApi = SpecRestApi.Builder.create(this, "MyApi")
                        .restApiName("MyApi")
                        .apiDefinition(ApiDefinition.fromAsset("openapi.yaml"))
                        .defaultIntegration(LambdaIntegration.Builder.create(myLambda)
                                    .proxy(false)
                                    .build())
                        .deploy(true) …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services swagger aws-lambda aws-api-gateway openapi

10
推荐指数
2
解决办法
4979
查看次数

AWS Cognito 用户池的服务器发现终端节点(众所周知的 url)是什么?

OpenID 提供商在众所周知的 URL 上发布其元数据。在 Okta 中,它看起来像这样:https://dev-599740.okta.com/oauth2/default/.well-known/oauth-authorization-server AWS Cognito 用户池是否有类似的 URL?如果不是,我如何找到 AWS Cognito 用户池的以下端点?

  1. 客户端注册端点
  2. 自省端点
  3. 令牌撤销端点

amazon-web-services amazon-cognito aws-api-gateway ibm-api-management aws-userpools

10
推荐指数
1
解决办法
7874
查看次数

在 Lambda 函数中获取 Cognito 用户属性

我正在使用 AWS Amplify 创建 Lambda 函数、REST API 和 Cognito 用户池。我想检索向端点发出请求的 Cognito 用户,以便我可以访问他们的用户属性。

我为该功能选择了无服务器 Express 模板:

应用程序.js

app.post('/do-something', async (req, res) => {
  // The user pool ID is available as an environment variable.
  // I want to get the user and use their user attributes here.
});
Run Code Online (Sandbox Code Playgroud)

客户端配置根据当前用户的令牌设置 Authorization 标头:

应用程序.js

Amplify.configure({
  API: {
    endpoints: [
      {
        name: "sampleCloudApi",
        endpoint: "https://xyz.execute-api.us-east-1.amazonaws.com/Development",
        custom_header: async () => { 
          return { Authorization: `Bearer ${(await Auth.currentSession()).getIdToken().getJwtToken()}` }
        }
      }
    ]
  }
});
Run Code Online (Sandbox Code Playgroud)

事件 ( …

amazon-web-services amazon-cognito aws-lambda aws-api-gateway aws-amplify

10
推荐指数
1
解决办法
6062
查看次数

AWS Api Gateway 中的资源与方法

我正在学习 AWS,并且正在深入研究 API Gateway。但我不清楚API网关中资源和方法之间的区别。我的想法是方法是资源的一部分,并且它们面向客户。而资源是一个更广泛的类别,涉及更多内容。如果有人可以帮助我以更简单和直观的方式识别它们之间的区别,我将不胜感激。我已经浏览了文档和一些 YouTube 视频。

amazon-web-services aws-api-gateway

10
推荐指数
1
解决办法
4424
查看次数

POST url编码表单到Amazon API Gateway

我正在创建一个webhook来接收来自第三方服务的通知,他们将数据发送到具有内容类型的POST主体中application/x-www-form-urlencoded.

但它会产生同样的错误:

{"message": "Could not parse request body into json: Unrecognized token \'name\': was expecting \'null\', \'true\', \'false\' or NaN\n at [Source: [B@456fe137; line: 1, column: 6]"}
Run Code Online (Sandbox Code Playgroud)

我可以通过以下curl调用重现错误:

% curl -v -X POST -d 'name=Ignacio&city=Tehuixtla' https://rl9b6lh8gk.execute-api.us-east-1.amazonaws.com/prod/mandrillListener
*   Trying 54.230.227.63...
* Connected to rl9b6lh8gk.execute-api.us-east-1.amazonaws.com (54.230.227.63) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate: *.execute-api.us-east-1.amazonaws.com
* Server certificate: Symantec Class 3 Secure Server CA - G4
* Server certificate: VeriSign Class 3 Public Primary Certification Authority …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services aws-lambda aws-api-gateway

9
推荐指数
1
解决办法
9934
查看次数

AWS Lambda无法返回PDF文件

我使用无服务器创建了一个lambda函数.此函数在GET请求上通过API网关触发,并应从缓冲区返回pdf文件.我正在使用html-pdf创建缓冲区并尝试使用以下命令返回pdf文件

  let response = {
    statusCode: 200,
    headers: {'Content-type' : 'application/pdf'},
    body: buffer.toString('base64'),
    isBase64Encoded : true,
  };
  return callback(null, response);
Run Code Online (Sandbox Code Playgroud)

但浏览器只是无法加载pdf,所以我不确切知道如何将pdf文件直接返回到浏览器.无法找到解决方案.

lambda amazon-web-services node.js aws-api-gateway serverless-framework

9
推荐指数
3
解决办法
2万
查看次数

API网关 - ALB:主机名/ IP与证书的altnames不匹配

我的设置目前看起来像:

API Gateway --- ALB --- ECS Cluster --- NodeJS Applications
             |    
             -- Lambda
Run Code Online (Sandbox Code Playgroud)

我还在API网关上设置了自定义域名(更新:我使用了默认的API网关链接并遇到了同样的问题,我认为这不是自定义域名问题)

当ECS集群中的1个服务通过API网关调用另一个服务时,我得到了

主机名/ IP与证书的altnames不匹配:"Host:someid.ap-southeast-1.elb.amazonaws.com.不在证书的altnames中:DNS:*.execute-api.ap-southeast-1.amazonaws. COM"

为什么是这样?

UPDATE

我注意到当我启动调用API网关的本地服务器时,我收到类似的错误:

{
    "error": "Hostname/IP doesn't match certificate's altnames: \"Host: localhost. is not in the cert's altnames: DNS:*.execute-api.ap-southeast-1.amazonaws.com\""
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试禁用HTTPS检查:

const response = await axios({
  method: req.method,
  url,
  baseURL,
  params: req.params,
  query: req.query,
  data: body || req.body,
  headers: req.headers,
  httpsAgent: new https.Agent({
   : false // <<=== HERE!
  })
})
Run Code Online (Sandbox Code Playgroud)

我得到了这个......

{
    "message": "Forbidden"
}
Run Code Online (Sandbox Code Playgroud)

当我直接在Postman上调用底层API网关URL时,它工作......不知何故,它让我想起了CORS,服务器似乎阻止了我的服务器localhost或ECS/ELB访问我的API网关?


它可能很令人困惑,所以我尝试的总结:

  • 在现有设置中,ECS内的服务可以通过API网关调用另一个.当发生这种情况时,由于HTTPS错误而失败
  • 要解决它,我设置rejectUnauthorized: false …

https amazon-web-services node.js amazon-elb aws-api-gateway

9
推荐指数
1
解决办法
1705
查看次数