【问题标题】:How to get URL endpoint detail as variable in Serverless Framework's `serverless.yml` file?如何在无服务器框架的“serverless.yml”文件中获取 URL 端点详细信息作为变量?
【发布时间】:2019-08-27 18:32:40
【问题描述】:

使用Serverless Framework 部署 AWS Lambda 函数,Serverless 创建(或接收) 特定的 URL 端点字符串。我想使用该字符串(作为变量) 在serverless.yml 规范文件的另一部分中。

该 URL 端点是否可用作 serverless.yml 中的变量? Serverless Framework documentation on AWS-related variables 似乎没有回答这种情况。


详细信息:我的 serverless.yml 包含一个 provider: 规范 类似于:

provider:
  name: aws
  runtime: python3.6
  memorySize: 512
  region: ${opt:region, 'eu-west-1'}
  profile: ${opt:profile, 'default'}
  stage: ${opt:stage, 'staging'}

还有一个functions: 部分,以:

functions:
  round-control:
    name: ${self:provider.stage}-round-control
    runtime: nodejs8.10
    handler: round/control/app.lambdaHandler
    events:
      - http:
          path: round/control
          method: get

之后

serverless deploy --profile [my-aws-profile]

Lambda 函数sample-experiments-staging-round-control 报告在端点可用 https://1a234bc5de.execute-api.eu-west-1.amazonaws.com/staging/round/control.

问题:Serverless 中是否有一个变量包含 1a234bc5de,或1a234bc5de.execute-api,甚至可能 1a234bc5de.execute-api.eu-west-1.amazonaws.com? (显然,如果我知道第一个,我也可以构造最后两个。)

使用该变量,我可以构建完整的 URL 端点,我 需要在serverless.yml 文件中的另一个位置。

注意1a234bc5de 不是动态生成的随机数 字符串 - 我当前的项目是(每个阶段,每个区域)“固定”到 相同的字符串。也许该字符串是在 AWS Lambda 或 AWS API 网关?

【问题讨论】:

标签: amazon-web-services aws-lambda aws-api-gateway serverless-framework


【解决方案1】:

我能够将 API Gateway 端点的 URL 和唯一 ID 作为环境变量传递给 Lambda 函数,如下所示:

  mylambda:
    handler: mylambda.handler
    runtime: python3.7
    events:
    - http:
        path: id
        cors: true
    environment:
      APIG_UID: !Ref "ApiGatewayRestApi"
      APIG_URL:
        !Join
          - ''
          - - 'https://'
            - !Ref ApiGatewayRestApi
            - '.execute-api.'
            - ${opt:region, self:provider.region}
            - '.amazonaws.com/'
            - ${opt:stage, self:provider.stage}

感谢goingserverless

【讨论】:

  • 是的,这行得通。只是好奇:ApiGatewayRestApi 上的 Ref 是否只能通过环境变量传递给函数?
  • 我认为环境变量是将配置数据导入 Lambda 函数的最简单方法。另一种好方法是将其保存在 Parameter Store 中(您可以在同一个无服务器模板 afaik 中执行此操作)并将参数存储密钥提供给 Lambda 函数。对于大量配置数据,另一种选择是将其写入 JSON 文件并将其与您的 Lambda 包捆绑在一起,但这需要额外的构建时脚本(并且可能从 CloudFormation 堆栈输出中检索 API Gateway 信息)。
  • 好的。最初,我希望该变量可以通过 HTTP 请求路径或作为查询字符串中的变量传递给另一个 Lambda 函数。这本来是最合乎逻辑的(也许只是在我的情况下),但通过环境传递它也很好。
  • 不,我会尽量避免构建时脚本。我已经有一个 Go 函数体,在通过无服务器部署该函数之前,我需要针对 AWS Lambdas 的正确操作系统目标进行编译。我正试图摆脱这个要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多