从 API Gateway 获取 terraform 中 AWS lambda 的端点

Posted

技术标签:

【中文标题】从 API Gateway 获取 terraform 中 AWS lambda 的端点【英文标题】:Get endpoint from API Gateway for an AWS lambda in terraform 【发布时间】:2020-04-21 23:03:49 【问题描述】:

我有一个部署到 AWS 的 lambda,集成是 lambda-proxy,现在我有一个 API 网关,它为我提供了一个用于调用 lambda 的端点。我需要在 terraform 配置中获取此端点 URL,我该怎么做?

数据源不公开任何 URL

data "aws_lambda_function" "myfunction" 
  function_name = "my-function-name"


data "aws_api_gateway_rest_api" "my_rest_api" 
  name = "my-rest-api"

api_gateway_deployment 确实暴露了一个invoke_url,但不幸的是它无法导入,否则我可以声明资源然后使用terraform import ...

resource "aws_api_gateway_rest_api" "my_rest_api" 
  name        = "my-rest-api"
  tags = 
    STAGE = "prod"
  


resource "aws_api_gateway_deployment" "my_rest_api" 
  rest_api_id = aws_api_gateway_rest_api.my_rest_api.id
  stage_name  = "prod"

编辑:澄清一下,lambda 不是由 terraform 部署或管理的。

【问题讨论】:

您绝对可以使用invoke_url 导出的属性来满足您的需要。我不确定为什么你需要将它与import 一起使用,除非你正在做一些非常不寻常的事情。请分享您需要端点的代码,我们可以向您展示如何操作。 @MattSchuchard 亚马逊 lambda 根本不由 terraform 管理,这就是我需要导入或数据源的原因。 我在尝试使用 AWS SAM 模板部署应用程序时遇到了这个问题。 SAM 负责创建 API 网关,我想在 Terraform 中管理的 CloudFront 配置中引用它。我最终决定在我的 SAM 模板中配置一个自定义域,并在我的 CloudFront 配置中明确引用它。它没有提供我想要的关卡资源检查,但它似乎有效。 【参考方案1】:

我的设置略有不同但相似。

我用过: - Terraform 预置 AWS API Gateway 自定义域 - 无服务器框架用于部署 Lambda 并将其链接到上面创建的 API GW URL。

我从 Terraform 导出 API GW URL 作为输出变量。并且,在函数部署期间将其作为环境变量传递给 Serverless Framework

这里是如何操作的。

1/ ma​​in.tf 负责导出 API GW URL

output "tf_output_aws_apigw_domain_name__domain_name"

  value = "$aws_api_gateway_domain_name.tf_aws_apigw_domain_for_apis.domain_name"

2/ serverless.yml 负责将 Lambda 函数链接到此 API GW URL

[...]
  customDomain:
    domainName: $env:APIGW_DOMAIN_NAME
    basePath: /myapi
    stage: dev
    createRoute53Record: true
[...]

以下是将它们粘合在一起的命令(在我的自动化管道中)。

第一部分负责读取 terraform 的输出变量值(即之前创建的 API GW URL)并将自身设置为环境变量 APIGW_DOMAIN_NAME。

稍后部分初始化负责将 lambda 函数映射到 APIGW URL 的 serverless-domain-manager 插件并部署无服务器设置。

terraform init ...
terraform refresh ...
export APIGW_DOMAIN_NAME=`terraform output tf_output_aws_apigw_domain_name__domain_name`

sls plugin install -n serverless-domain-manager
sls deploy --debug

干杯, 内存

【讨论】:

以上是关于从 API Gateway 获取 terraform 中 AWS lambda 的端点的主要内容,如果未能解决你的问题,请参考以下文章

输入意外结束:从 AWS API Gateway 获取响应时出现 ApolloClient 错误

如何从 AWS API Gateway cloudwatch 日志中获取用户的公共 IP?

通过 API Gateway 从 s3 静态网站获取到 Lambda 函数,给出 415 Unsupported Media Type 错误

获取问题-不支持的方法:在测试 API Gateway API 时在邮递员中获取

在 AWS Lambda 函数中从 S3 获取对象并发送到 Api Gateway

需要配置serverless资源输出获取api gateway api id