微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AWS SAM 和 Parameter Store:如何为部署到不同环境中选择参数

如何解决AWS SAM 和 Parameter Store:如何为部署到不同环境中选择参数

我有一个设置,我使用 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 Parameter Store 中定义的 prod 变量部署到 prod

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

解决方法

正如 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
,

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

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

,

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

来自控制台:

  • 添加/编辑操作

  • 操作提供程序 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'

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。