amazon-web-services - 在定义单个 AWS::Serverless::Function 的 SAM 模板中指定多个 API 阶段和 Lambda 别名

标签 amazon-web-services aws-lambda aws-serverless aws-sam aws-sam-cli

我的目标
我正在尝试编写一个(单个)SAM 模板来获取由 Api 网关事件触发的 Lambda 函数。
我想要多个 API Stage(比如“dev”、“testing”、“prod”)并且我希望它们中的每一个都映射到具有相同名称的 Lambda 别名上。
我不想在每次部署时生成新的 lambda 版本,我喜欢手动设置每个 lambda 别名使用的 lambda 版本。当然,“dev”别名意味着指向 $LATEST 代码版本。
我尝试了什么,得到了什么
我修改了经典的“hello_world”模板如下。
现在,当第一次部署(比如“开发”)时,一切似乎都按预期工作。
但是如果我尝试部署到“测试”阶段,这个新阶段的 API 会响应,而“开发”阶段的 API 会停止响应。
我错过了什么?

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  zzzz

  Sample SAM Template for zzzz

# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 3

Parameters:
  StageAliasName:
    Description: stage / alias name to be used in this deploy
    Type: String
    AllowedValues:
      - prod
      - stage
      - dev
      - v1
    Default: dev

Resources:
  ApiGatewayApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: !Ref StageAliasName

  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.8
      AutoPublishAlias: !Ref StageAliasName
      FunctionName: zzz
      Environment:
        Variables:
          stage: !Ref StageAliasName
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            RestApiId: !Ref ApiGatewayApi
            Path: /hello
            Method: GET
#            Auth:
#              ApiKeyRequired: true



Outputs:
  # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function
  # Find out more about other implicit resources you can reference within SAM
  # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api
#  HelloWorldApi:
#    Description: "API Gateway endpoint URL for Prod stage for Hello World function"
#    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
  HelloWorldFunction:
    Description: "Hello World Lambda Function ARN"
    Value: !GetAtt HelloWorldFunction.Arn
  HelloWorldFunctionIamRole:
    Description: "Implicit IAM Role created for Hello World function"
    Value: !GetAtt HelloWorldFunctionRole.Arn

最佳答案

我和你有同样的问题,发现这个:https://jun711.github.io/aws/deploy-api-gateway-to-multiple-stage-when-aws-sam-replaces-previous-stages/ .看起来 SAM 取代了之前的阶段。
这个 jun chap 做了一些手动步骤来使它工作。很高兴知道它有效,但有点破坏“基础设施即代码”,我认为我将使用 ansible 为不同环境模板化不同版本的模板,然后就可以了。

关于amazon-web-services - 在定义单个 AWS::Serverless::Function 的 SAM 模板中指定多个 API 阶段和 Lambda 别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65724680/

相关文章:

amazon-web-services - 尝试部署无服务器时出现 "An error occurred: LogGroup - <resource name> already exists"

javascript - 无服务器:此服务中不存在该功能

amazon-web-services - 是否可以/建议在 AWS CodeBuild 中使用 `sam build`?

amazon-web-services - 具有 Cloudformation 的 AWS 无服务器 API 的阶段 "dev already exists"

amazon-web-services - 使用 YAML 语法的 AWS UserData 字段中的 "!Sub |"是什么意思?

amazon-web-services - 为什么我的 Event Bridge 规则不执行我的 Lambda 函数?

amazon-web-services - 向数百万个 S3 对象添加元数据

python - 通过 API 网关从 HTML 向 Python Lambda 函数发送 POST 请求

MySQL 没有充分利用服务器

amazon-web-services - 从 AWS S3 中删除不完整的分段上传文件