如何解决 SAM Docs 中的循环依赖关系,同时将 API 端点放入 lambda 函数的环境变量中

2024-03-22

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: hello
Resources:
  ApiGatewayApi:
  Type: AWS::Serverless::Api
  Properties:
    StageName: stage
    TracingEnabled: true
  FunctionA:
    ...
    Environment:
      Variables:
        TEST: !Ref ApiGatewayApi
    Events:
      GetUsers:
        Type: Api
        Properties:
          Path: /account
          Method: get
          RestApiId:
            Ref: ApiGatewayApi
  FunctionB:
    ...
    Environment:
      Variables:
        API_URL: !GetAtt ApiGatewayApi.RootResourceId
    Events:
      OrderEvent:
        Type: SQS
        Properties:
          Queue: !GetAtt OrderServiceQueue.Arn

这导致了循环依赖。如果我在一个没有 API 事件的函数中执行 !Ref,它不会抱怨它。我阅读了来自 aws、博客和其他堆栈溢出问题的高级支持文章,但它们与我的问题并不相似。

FunctionB成功引用 API 网关 id,而 FunctionA 未成功引用 API 网关 id。

我在函数外部创建 api,所以我认为它应该 !Ref 中的端点。还有别的事吗?


循环引用是根据 AWS SAM 如何使用事件来创建 API 定义而创建的。这基本上意味着它需要 lambda 函数的 ARN 来构造此定义,然后才能创建 API。但是,由于您需要 API 的 ID 才能创建 lambda,因此您最终会得到循环引用,因为如果另一个已经存在,则无法创建其中一个。

解决此问题的第一种方法是分多个步骤部署堆栈。您可以首先部署一个空 API,这将允许您在添加 lambda 时引用 API ID。当然,这种方法的显着缺点是,如果您想在另一个帐户上轻松复制此堆栈或出于某种原因重新部署 API,这意味着您每次都必须再次使用此技巧。

另一种方法是,如果您确实希望将此值作为环境变量,则可以手动创建 API 的定义主体(在其中构造 lambda 的 ARN,而不是引用它们),并且大概您还需要手动创建权限,以允许您的 API Gateway 资源执行 lambda 函数。

然而,我认为更好的方法是使用 lambda 代理集成(我认为默认情况下使用它,但我找不到任何文档来验证这一点)。使用 lambda 代理集成时,lambda 中的传入事件包含有关 API 的所有信息 https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format。您可以轻松地从该事件中提取所需的信息,而不是将其作为环境变量,但这取决于您的具体用例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何解决 SAM Docs 中的循环依赖关系,同时将 API 端点放入 lambda 函数的环境变量中 的相关文章

随机推荐