Amazon web services AWS SAM&;参数存储:如何为部署到不同环境中选择参数

Amazon web services AWS SAM&;参数存储:如何为部署到不同环境中选择参数,amazon-web-services,aws-lambda,aws-codepipeline,aws-sam,amazon-systems-manager,Amazon Web Services,Aws Lambda,Aws Codepipeline,Aws Sam,Amazon Systems Manager,我有一个设置,使用CodeCommit作为存储库来存储lambda函数,并使用AWS SAM来部署和创建lambda函数的代码管道 我想将lambda函数部署到不同的环境中,如QA、staging和Prod。我使用AWS参数存储来引用我的变量 下面是我设置的template.yaml文件,它创建了一个lambda函数,并使用AWS参数存储引用变量 AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-3

我有一个设置,使用CodeCommit作为存储库来存储lambda函数,并使用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  
AWSTemplateFormatVersion:'2010-09-09'
转换:AWS::Serverless-2016-10-31
描述:测试
参数:
BucketName:
描述:'必填项。Bucket Name'
类型:“AWS::SSM::Parameter::Value”
默认值:“MyBucketname”
CSVPath:
描述:'必填项。Configkey名称'
类型:“AWS::SSM::Parameter::Value”
默认值:“MyCSVPath”
资源:
GetOrdersFunction:
类型:AWS::Serverless::Function
特性:
代码URI:./LambdaCode
处理程序:app.lambda\u处理程序
功能名称:应用
运行时:python3.6
描述:“登台”
环境:
变量:
BucketName:!参考BucketName
CSVPath:!参考CSVPath
活动:
HelloWorld:
类型:Api
特性:
路径:/orders
方法:获取
我可以在template.yaml中为部署定义变量,但我不确定如何为不同的环境(prod或qa)定义变量

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

我应该在template.yaml文件中做哪些更改,以便能够部署到不同的环境?

您正在寻找的是模板和功能。看看这些例子,并在RegionMap和EnvMap之间切换,它将非常适合您的用例


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

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

{"BucketName":"/BUCKETNAME/DEV","CSVPath":"/CSVPATH/DEV"}
从控制台:

  • 添加/编辑操作

  • 动作提供者云信息

  • 动作模式

  • 创建/更新堆栈

  • 高级->参数覆盖

    {"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'

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

参数:
阶段:
类型:字符串
默认值:暂存
Description:获取部署阶段的参数
然后是一个带有映射的映射部分,用于保存所有阶段的环境变量

映射:
舞台地图:
登台:
配置存储桶:暂存存储桶名称
配置密钥:源数据密钥路径
产品:
CONFIG_BUCKET:prod BUCKET名称
配置密钥:源数据密钥路径
然后,您的函数可以根据您所处的环境使用变量:

AWSTemplateFormatVersion:'2010-09-09'
转换:“AWS::Serverless-2016-10-31”
描述:CD演示Lambda
资源:
CDDemoLambda:
类型:“AWS::Serverless::Function”
特性:
处理程序:lambda_函数。lambda_处理程序
运行时:python3.6
代码URI:./LambdaCode
功能名称:ApigatewayLambda
自动出版物:ApiLambda
描述:“Lambda函数验证”
记忆化:128
超时时间:30
活动:
ApiEvent:
类型:Api
特性:
路径:/getazs
方法:获取
环境:
变量:
配置桶:!FindInMap
-舞台地图
-参考:阶段
-配置桶
配置键:!FindInMap
-舞台地图
-参考:阶段
-配置键
现在,当您调用sam to deploy命令时,需要定义要部署到的阶段。 例:

sam部署--参数覆盖Stage=prod
完整的cloudformation模板应如下所示:

AWSTemplateFormatVersion:'2010-09-09'
转换:“AWS::Serverless-2016-10-31”
描述:CD演示Lambda
参数:
阶段:
类型:字符串
默认值:暂存
Description:获取部署阶段的参数
映射:
舞台地图:
登台:
配置存储桶:暂存存储桶名称
配置密钥:源数据密钥路径
产品:
CONFIG_BUCKET:prod BUCKET名称
配置密钥:源数据密钥路径
资源:
CDDemoLambda:
类型:“AWS::Serverless::Function”
特性:
处理程序:lambda_函数。lambda_处理程序
运行时:python3.6
代码URI:./LambdaCode
功能名称:ApigatewayLambda
自动出版物:ApiLambda
描述:“Lambda函数验证”
记忆化:128
超时时间:30
活动:
ApiEvent:
类型:Api
特性:
路径:/getazs
方法:获取
环境:
变量:
配置桶:!FindInMap
-舞台地图
-参考:阶段
-配置桶
配置键:!FindInMap
-舞台地图
-参考:阶段
-配置键

每个环境是否有一个代码管道,或者每个环境是否至少有不同的阶段或操作?您可以从codepipeline传递
ParameterOverrides
以传递正确的参数值
{“BucketName”:“/BucketName/DEV”,“CSVPath”:“/CSVPath/DEV”}
是的,每个环境都有一个代码管道。谢谢您的回复,这也可以吗