0

我有一个使用由隐式 http api 事件触发的 AWS lambda 函数的应用程序,该事件从 React 应用程序获取发布/获取请求:

"mylambda": {
      "Type": "AWS::Serverless::Function",
      "Properties": {
        "InlineCode": "exports.handler = async (event, context)",
        "MemorySize": {
          "Ref": "LambdaMemorySize"
        },
        "Handler": "backend/index.handler",
        "Role": {
          "Fn::GetAtt": ["myrole", "Arn"]
        },
        "Timeout": {
          "Ref": "LambdaTimeout"
        },
        "Runtime": "nodejs12.x",
        "FunctionName": "myFunction",
        "Events": {
          "httpapi": {
            "Type": "HttpApi",
            "Properties": {
              "Path": "/myApi",
              "Method": "ANY"
            }
          }
        }
      }
    }
  },

我想在 Lambda 函数中为 http-api 端点添加一个环境变量,以便我可以在 lambda 的处理程序中使用它:

"Environment": {
          "Variables": {
           
            "apiEndpoint": {
              "Fn::Join": [
                "",
                [
                  "https://",
                  { "Ref": "ServerlessHttpApi" },
                  ".execute-api.",
                  { "Ref": "AWS::Region" },
                  ".amazonaws.com"
                ]
              ]
            }
          }
        }

问题是这会引发循环依赖错误,我可以理解原因(lambda 依赖于 api-gateway 而 api-gateway 依赖于 lambda)。

我尝试单独创建http-api,但似乎无法将lambda中的api引用为触发器,即当我部署时,模板创建了一个没有我的api作为触发器的lambda函数,而我的api 是单独创建的。

我知道整个环境变量的事情可以从控制台轻松完成,但我的部署模型假设一切都应该在 CF 模板中完成。

这里的答案建议:

“您可以轻松地从该事件中提取所需的信息,而不是将其作为环境变量,但这取决于您的确切用例。”

我可以在 index.js 中的 lambda 处理程序的主体中执行此操作:

module.exports.apiendpoint = event.requestContext.domainName;

但这将与以下事实相冲突:1)我不能使用 React 的 src 文件夹之外的 index.js 变量,以及 2)我不确定应用程序第一次将如何运行,因为它需要 get/首先发布请求以触发 lambda。

我认为我的主要问题很简单:我不知道如何在 Lambda 的环境变量中引用 http api 端点而不会引发错误。我的应用程序的整个结构是错误的吗?

4

0 回答 0