如何将URL端点详细信息作为变量在Serverless Framework的`serverless.yml`文件中获取?

11
使用Serverless Framework部署AWS Lambda函数时,Serverless会创建(或接收)特定的URL端点字符串。我想在serverless.yml规范文件的另一部分中使用该字符串(作为变量)。那个URL端点在serverless.yml中可用作变量吗?Serverless Framework文档关于AWS相关变量似乎没有回答这个问题。

细节:我的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变量包含1a234bc5de1a234bc5de.execute-api,甚至是1a234bc5de.execute-api.eu-west-1.amazonaws.com?(如果知道第一个参数,显然我也可以构造出后面两个参数。)

有了这个变量,我可以构建完整的URL终结点,并在serverless.yml文件的其他位置中使用它。

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


1
这可能有所帮助:http://www.goingserverless.com/blog/api-gateway-url - jarmod
太好了,@jarmod。它似乎在CloudFormation变量中可用。文档位于https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html,`AWS :: ApiGateway :: RestApi资源上的Ref`包含该ID。 - Jochem Schulenklopper
2个回答

16
我可以将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

1
没错,可以这样做。只是好奇:ApiGatewayRestApi 上的 Ref 只能通过环境变量传递给函数吗? - Jochem Schulenklopper
2
我认为环境变量是将配置数据传递给 Lambda 函数的最简单方式。另一种好的方法是将其保存在参数存储中(你可以在同一个无服务器模板中完成此操作),并将参数存储键提供给 Lambda 函数。对于大量配置数据的情况,另一种选择是将其写入 JSON 文件,并将其与 Lambda 包一起打包,但这需要额外的构建时间脚本编写(也许是从 CloudFormation 堆栈输出检索 API Gateway 信息)。 - jarmod
好的。最初,我希望那个变量可以通过HTTP请求路径或查询字符串中的变量被传递到另一个Lambda函数。这可能是最合理的方式(至少在我的情况下),但通过环境进行传递也可以。 - Jochem Schulenklopper
不,我会尽量避免构建时脚本。在 Serverless 上部署该函数之前,我已经有一个 Go 函数体需要编译成适用于 AWS Lambdas 的正确 OS 目标。我正在努力摆脱这个要求。 - Jochem Schulenklopper

8

这里有一个更简单、更现代的选择:

provider:
  environment:
    API_URL: !Sub 'https://${ApiGatewayRestApi}.execute-api.${aws:region}.amazonaws.com/${sls:stage}'

注意:上述代码适用于REST API(API Gateway v1),而不是HTTP API
如果您正在使用新的HTTP API(API Gateway v2),解决方案更简单:
provider:
  environment:
    API_URL: !GetAtt HttpApi.ApiEndpoint

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