1

我正在使用 HTTP API 网关来触发 lambda 调用。当我使用邮递员的网址时,没有问题。当我从浏览器中使用它时,它总是会为 favicon 发出第二个请求。

网关本身是否有阻止 favicon 请求到达 lambda 的方法?

我正在使用以下地形:

resource "aws_apigatewayv2_api" "retry_api" {
  name          = "${var.environment}_${var.cdp_domain}_retry_api"
  protocol_type = "HTTP"
  description   = "To pass commands into the retry lambda."
  target = module.retry-support.etl_lambda_arn
}

resource "aws_lambda_permission" "allow_retry_api" {
  statement_id  = "AllowAPIgatewayInvokation"
  action        = "lambda:InvokeFunction"
  function_name = module.retry-support.etl_lambda_arn
  principal     = "apigateway.amazonaws.com"
  source_arn = "${aws_apigatewayv2_api.retry_api.execution_arn}/*/*"
}
4

2 回答 2

1

这不会阻止浏览器发出的网站图标请求,而是不会为这些请求调用 Lambda。

假设 API 端点是/hello并且 http 方法是GET,您可以限制api-gateway只为这个 URL 调用 lambda。格式应该是这样的。

arn:${AWS::Partition}:execute-api:${AWS::Region}:${AWS::AccountId}:${__ApiId__}/${__Stage__}/GET/hello

所以source_arninaws_lambda_permission会变成这样

source_arn = "${aws_apigatewayv2_api.retry_api.execution_arn}/*/*/GET/hello"

答案假设现有的/最终分别是 forapiId和for stage。否则检查值${aws_apigatewayv2_api.retry_api.execution_arn}并进行相应的修改。

这个答案也可以提供帮助。您只能openapi specification正文中为您的支持提供path。对于上述情况,openapi specification调用名为 Lambda的相关路径部分HelloWorldFunction如下所示

  "paths": {
        "/hello": {
          "get": {
            "x-amazon-apigateway-integration": {
              "httpMethod": "POST",
              "type": "aws_proxy",
              "uri": {
                "Fn::Sub": "arn:${AWS::Partition}:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${HelloWorldFunction.Arn}/invocations"
              },
              "payloadFormatVersion": "2.0"
            },
            "responses": {} //Provide the expected response model
          }
        }
      }

是 OpenApi 规范的链接。

于 2021-05-13T06:31:53.147 回答
0

通常,我会将 cloudfront 放在 API 网关前面,并将 favicon.ico 映射到 S3 存储桶。

如果您真的想在 API GW 级别处理它,您可以创建一个 /favicon.ico 路由,并将集成设置为 MOCK - 这将返回一个特定值,而不是调用 lambda(或任何其他后端)。

于 2021-05-18T19:52:32.383 回答