Terraform:如何为调用Lambda的AWS API Gateway创建url路径参数?

11
我正在编写Terraform代码,以部署一个带有AWS Lambda整合的AWS API Gateway。我想在url中指定一个可选的路径参数,以便我可以从Lambda中引用它。但是我无法弄清楚如何在AWS API Gateway的Terraform代码中进行指定。
我能找到的唯一关于路径变量的信息是这篇stackoverflow文章:In Terraform, how do you specify an API Gateway endpoint with a variable in the request path?
在这个答案中,将路径变量指定在aws_api_gateway_integration函数的uri字段中:
resource "aws_api_gateway_integration" "get-account-integration" {
    rest_api_id             = "${var.gateway_id}"
    resource_id             = "${var.resource_id}"
    http_method             = "${aws_api_gateway_method.get-account.http_method}"
    type                    = "HTTP"
    integration_http_method = "GET"
    uri                     = "/integration/accounts/{id}" # <--
    passthrough_behavior    = "WHEN_NO_MATCH"

    request_parameters {
        "integration.request.path.id" = "method.request.path.accountId"
    }
}

不幸的是,与AWS Lambda集成使用该uri字段作为lambda的ARN。这是我在集成中引用lambda的方式:

resource "aws_api_gateway_integration" "books_lambda" {
  rest_api_id             = "${var.gateway.id}"
  resource_id             = "${var.resource_id}"
  http_method             = "${aws_api_gateway_method.books.http_method}"
  type                    = "AWS_PROXY"
  integration_http_method = "POST"
  uri                     = "${var.books_invoke_arn}" # <--
  credentials             = "${aws_iam_role.books_gateway.arn}"

  request_parameters {
    "integration.request.path.id" = "method.request.path.bookId"
  }
}

由于arn位于uri字段的位置,我不知道在哪里定义路径参数的放置位置。

我尝试将路径变量附加到uri字段(${var.books_invoke_arn}/{bookId}),但是它会产生错误。当uri字段被lambda arn占用时,我应该在哪里指定路径变量?

第二个问题是,是否可以使该变量可选,还是必须拥有第二组terraform(一组带有变量,一组没有)?

谢谢!


你解决了这个问题吗? - Kwhitejr
3个回答

2

这是一个老问题,但在我的搜索中出现了。我认为在此期间可能会发生变化,但目前实现这个功能的方法是在route_key中使用花括号指定您的变量,就像我们代码中的示例一样:

resource "aws_apigatewayv2_route" "room-recommendations-ng" {
  api_id             = aws_apigatewayv2_api.this.id
  route_key          = "GET /rooms/{room}/recommendations"
  target             = "integrations/${aws_apigatewayv2_integration.room-recommendations.id}"
}

0

由于类型为AWS_PROXY,因此URI必须是根据RFC-3986规范完全形成的、编码的HTTP(S) URL。对于AWS集成,URI应采用arn:aws:apigateway:{region}:{subdomain.service|service}:{path|action}/{service_api}的形式。

请尝试以下代码(我假设使用us-east-1区域):

resource "aws_api_gateway_integration" "books_lambda" {
  rest_api_id             = var.gateway.id
  resource_id             = var.resource_id
  http_method             = aws_api_gateway_method.books.http_method
  type                    = "AWS_PROXY"
  integration_http_method = "POST"
  uri                     = "arn:aws:apigateway:us-east-1:lambda:path/integration/accounts/{id}"
  credentials             = aws_iam_role.books_gateway.arn

  request_parameters      = {
    "integration.request.path.id" = "method.request.path.bookId"
  }
}

如需更多信息,请参见资源:aws_api_gateway_integration


-1

Terraform文档已经给出了答案。

resource "aws_api_gateway_integration" "integration" {
  rest_api_id             = "${aws_api_gateway_rest_api.api.id}"
  resource_id             = "${aws_api_gateway_resource.resource.id}"
  http_method             = "${aws_api_gateway_method.method.http_method}"
  integration_http_method = "POST"
  type                    = "AWS_PROXY"
  uri                     = "arn:aws:apigateway:${var.myregion}:lambda:path/2015-03-31/functions/${aws_lambda_function.lambda.arn}/invocations"
}

关于您的第二个问题,我需要更多细节。根据当前的描述,您可以考虑使用count来管理它。
参考:

https://www.terraform.io/intro/examples/count.html

https://www.terraform.io/docs/configuration/resources.html#count-multiple-resource-instances

更新

由于您没有粘贴如何管理Lambda函数的代码。如果您成功管理它,可以将其引用为${aws_lambda_function.lambda.arn}

resource "aws_lambda_function" "lambda" {
  filename      = "lambda_function_payload.zip"
  function_name = "lambda_function_name"
  ...
}

如果 Lambda 函数存在,您可以通过其数据源获取其详细信息。
data "aws_lambda_function" "existing_lambda" {
  function_name = "${var.function_name}"
}

您可以将其引用为data.aws_lambda_function.existing_lambda.arn


感谢您的回复,BMW。我已经花了很多时间阅读您提供的terraform文档,但是我没有找到答案。您是在说路径参数需要成为lambda arn的一部分吗?如果是这样,在arn中我应该把路径参数放在哪里? - user2233394
感谢您抽出时间更新您的答案,但我认为我们之间存在一些混淆。 我能够轻松引用lambda。我从我的lambda terraform导出lambda arn,并将其插入到aws_api_gateway_integration的uri字段中(您可以在上面的第二个代码块中看到我的代码)。不清楚的是如何在上述集成terraform中指定路径参数。 uri字段通常是该位置,但由于uri字段具有lambda arn,因此我不知道在哪里或如何指定路径参数的放置位置。 - user2233394
1
@user2233394,您只需要添加lambda arn而不是路径本身。在集成设置中,您无需将映射添加到request_parameters中。一旦通过资源设置了路径参数,它们将出现在Lambda事件中,如“pathParameters”。 - user2980055

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接