如何使用 Terraform 在 API 网关上启用 HEAD 方法

Posted

技术标签:

【中文标题】如何使用 Terraform 在 API 网关上启用 HEAD 方法【英文标题】:How to enable HEAD method on API Gateway with Terraform 【发布时间】:2018-08-09 23:00:18 【问题描述】:

我已尝试将以下内容添加到我当前工作的 apigateway API 设置中

resource "aws_api_gateway_method" "enable_head_request" 
  provider         = "aws.default"
  rest_api_id      = "$aws_api_gateway_rest_api.petshop.id"
  resource_id      = "$aws_api_gateway_rest_api.petshop.root_resource_id"
  http_method      = "HEAD"
  authorization    = "NONE"
#  api_key_required = "False"


resource "aws_api_gateway_integration" "enable_head_request" 
  provider                = "aws.default"
  rest_api_id             = "$aws_api_gateway_rest_api.petshop.id"
  resource_id             = "$aws_api_gateway_rest_api.petshop.root_resource_id"
  http_method             = "$aws_api_gateway_method.enable_head_request.http_method"
  integration_http_method = "POST"
  type                    = "AWS_PROXY"
  uri                     = "$aws_lambda_function.petshop.invoke_arn"


resource "aws_api_gateway_method_response" "200_for_head_request" 
  provider    = "aws.default"
  rest_api_id = "$aws_api_gateway_rest_api.petshop.id"
  resource_id = "$aws_api_gateway_rest_api.petshop.root_resource_id"
  http_method = "$aws_api_gateway_method.enable_head_request.http_method"
  status_code = "200"

但是在部署并尝试 curl 我得到的端点之后;

curl --head https://test.com
HTTP/1.1 403 Forbidden
Date: Thu, 01 Mar 2018 18:47:07 GMT
Content-Type: application/json
Content-Length: 42
Connection: keep-alive
x-amzn-RequestId: f1811ce9-1d80-11e8-b15c-cf44af523470
x-amzn-ErrorType: MissingAuthenticationTokenException

编辑: 问题确实是部署没有重新部署。但正如我的回答中提到的那样,我找到了一种更好的方法。

【问题讨论】:

curl 命令应该类似于:curl --head "xxx: xxx" https://test.com 取消授权后需要重新部署。最近有一个问题有完全相同的问题。 Terraform 在您申请时不会自动重新部署 API Gateway,因为它根本无法很好地处理 API Gateway 发布模型。 Missing Authentication Token on Unauthenticated Method的可能重复 @ydaetskcoR 我已经能够毫无问题地将新的 GET 请求添加到不同的路径 【参考方案1】:

问题是部署没有被重新部署。这是比链接问题更好的方法

resource "aws_api_gateway_deployment" "petshop" 
  provider    = "aws.default"
  stage_description = "$md5(file("apigateway.tf"))"
  rest_api_id = "$aws_api_gateway_rest_api.petshop.id"
  stage_name  = "prod"

这可以节省您在每次微小更改时重新部署,并且只会由 apigateway.tf 文件中的更改触发

【讨论】:

以上是关于如何使用 Terraform 在 API 网关上启用 HEAD 方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 API 网关上的 cognito 授权方保护的 lambda 函数中获取 AWS Cognito 用户数据

API 网关上的数据聚合

备战一年半,我们让最火的开源网关上了云

在 NodeJs 中的支付网关上执行的交易的签名验证

如何配置海康联网网关上级域,通过国标GB28181级联到EasyCVR?

如何使用 API 或 Terraform 模板在 GCP 中创建 StackDriver 工作区