【问题标题】:AWS SAM & Parameter Store: How to select parameter for the deployment into different environmentsAWS SAM & Parameter Store:如何为部署到不同环境中选择参数
【发布时间】:2021-05-03 19:15:48
【问题描述】:

我有一个设置,我使用 CodeCommit 作为我的存储库来存储 lambda 函数和 CodePipeline,使用 AWS SAM 来部署和创建 lambda 函数。

我想将 lambda 函数部署到不同的环境中,例如 QA、staging 和 Prod。我已使用 AWS 参数存储来引用我的变量。

下面是我设置的 template.yaml 文件,它创建了一个 lambda 函数,它使用 AWS 参数存储来引用变量

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

Parameters:
  BucketName:
    Description: 'Required. Bucket Name'
    Type: 'AWS::SSM::Parameter::Value<String>'
    Default: 'MyBucketname' 

  CSVPath:
    Description: 'Required. Configkey Name'
    Type: 'AWS::SSM::Parameter::Value<String>'
    Default: 'MyCSVPath' 

Resources:
    GetOrdersFunction:
        Type: AWS::Serverless::Function 
        Properties:
            CodeUri: ./LambdaCode
            Handler: app.lambda_handler
            FunctionName: app
            Runtime: python3.6
            Description: 'staging'
            Environment: 
                Variables:
                    BucketName: !Ref BucketName
                    CSVPath: !Ref CSVPath
            Events:
              HelloWorld:
                    Type: Api
                    Properties:
                        Path: /orders
                        Method: get  

我可以在我的 template.yaml 中为部署定义变量,但我不确定如何为不同的环境(prod 或 qa)定义它。

当管道触发时,它应该使用 QA 变量部署到 QA 环境,并使用将在 AWS 参数存储中定义的 prod 变量部署到 prod

我应该在我的 template.yaml 文件中进行哪些更改才能部署到不同的环境?

【问题讨论】:

  • 每个环境是否有一个代码管道,或者每个环境至少有不同的阶段或操作?您可以从代码管道传递ParameterOverrides 以传递正确的参数值{"BucketName":"/BUCKETNAME/DEV","CSVPath":"/CSVPATH/DEV"}
  • 是的,我每个环境都有一个代码管道

标签: amazon-web-services aws-lambda aws-codepipeline aws-sam amazon-systems-manager


【解决方案1】:

正如 Meir 所提到的,您可以使用 cloudformation 中的参数和条件功能来做到这一点,例如,您将添加一个参数部分,如下所示:

Parameters:
  Stage:
    Type: String
    Default: staging
    Description: Parameter for getting the deployment stage

然后是一个带有映射的映射部分,用于保存所有阶段的环境变量

Mappings:
  StagesMap:
    staging:
      CONFIG_BUCKET: staging-bucket-name
      CONFIG_KEY: source-data-key-path
    prod:
      CONFIG_BUCKET: prod-bucket-name
      CONFIG_KEY: source-data-key-path

那么你的函数可以根据你所处的环境使用变量:

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: CD Demo Lambda
Resources:
  CDDemoLambda:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: lambda_function.lambda_handler
      Runtime: python3.6
      CodeUri: ./LambdaCode
      FunctionName: ApigatewayLambda
      AutoPublishAlias: ApiLambda
      Description: 'Lambda function validation'
      MemorySize: 128
      Timeout: 30
      Events:
        ApiEvent:
          Type: Api
          Properties:
            Path: /getazs
            Method: get
      Environment:
        Variables:
          CONFIG_BUCKET: !FindInMap
            - StagesMap
            - Ref: Stage
            - CONFIG_BUCKET
          CONFIG_KEY: !FindInMap
            - StagesMap
            - Ref: Stage
            - CONFIG_KEY

现在,当您调用 sam 部署命令时,您需要定义要部署到的阶段。 例如:

sam deploy --parameter-overrides Stage=prod

您的完整 cloudformation 模板应如下所示:

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: CD Demo Lambda

Parameters:
  Stage:
    Type: String
    Default: staging
    Description: Parameter for getting the deployment stage

Mappings:
  StagesMap:
    staging:
      CONFIG_BUCKET: staging-bucket-name
      CONFIG_KEY: source-data-key-path
    prod:
      CONFIG_BUCKET: prod-bucket-name
      CONFIG_KEY: source-data-key-path


Resources:
  CDDemoLambda:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: lambda_function.lambda_handler
      Runtime: python3.6
      CodeUri: ./LambdaCode
      FunctionName: ApigatewayLambda
      AutoPublishAlias: ApiLambda
      Description: 'Lambda function validation'
      MemorySize: 128
      Timeout: 30
      Events:
        ApiEvent:
          Type: Api
          Properties:
            Path: /getazs
            Method: get
      Environment:
        Variables:
          CONFIG_BUCKET: !FindInMap
            - StagesMap
            - Ref: Stage
            - CONFIG_BUCKET
          CONFIG_KEY: !FindInMap
            - StagesMap
            - Ref: Stage
            - CONFIG_KEY

【讨论】:

  • 谢谢,这是我真正需要的设置 :)
【解决方案2】:

可以通过传递 parameterOverrides 从代码管道中覆盖 CloudFormation 模板默认参数

从控制台:

  • 添加/编辑操作

  • 动作提供者 Cloudformation

  • 动作模式

  • 创建/更新堆栈

  • 高级 -> 参数覆盖

    {"BucketName":"/BUCKETNAME/DEV","CSVPath":"/CSVPATH/DEV"}
    

如果代码管道是从 Cloudformation 模板创建的:

                  - Name: DeployMyStack
                    InputArtifacts:
                        - Name: Artifacts
                    ActionTypeId:
                        Category: Deploy
                        Owner: AWS
                        Version: 1
                        Provider: CloudFormation
                    Configuration:
                        ActionMode: 'CREATE_UPDATE'
                        Capabilities: CAPABILITY_NAMED_IAM,CAPABILITY_AUTO_EXPAND
                        ParameterOverrides: !Sub
                            - '{"BucketName":"/BUCKETNAME/${Env}","CSVPath":"/CSVPATH/${Env}'
                            - {
                                  Env: !Ref Environment,
                              }
                        RoleArn: !Ref CloudFormationServiceRoleArn
                        StackName: !Sub
                            - Gl${ENV}-My-Stack
                            - { ENV: !Ref Environment }
                        TemplatePath: 'Artifacts::MyTemplate.yaml'

【讨论】:

  • 您好,感谢您的回复,这是否也适用于 AWS SAM,因为这是用于部署 lambda 函数的内容
  • 如果我理解正确,您使用 sam 构建和部署 lambdas。但是你在哪里运行命令sam deploy
  • 我正在创建 sam template.yaml,然后被 CodePipline 使用。它使用与云形成和代码部署集成的代码构建来部署 lambda 函数
  • 我的问题仍然是我想为我的 prod、QA 和测试环境使用相同的 template.yaml 文件。然后我将如何在 .yaml 中定义 parameterOveride,因为这将全部使用 codepipline 进行设置?
  • parameterOveride 不会在您当前的模板中定义。但是用于创建代码管道的模板。如果您是手动创建代码管道,则需要从控制台传入parameterOveride
【解决方案3】:

您正在寻找mappingsFindInMap 功能。查看示例并在 RegionMap 和 EnvMap 之间切换,它将非常适合您的用例。

这里的期望是,根据给定的参数(Parameter)将获取一组变量,这正是映射所做的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-19
    • 2021-04-16
    • 2020-04-29
    • 2022-01-17
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    相关资源
    最近更新 更多