Amazon web services AWS SAM&;参数存储:如何为部署到不同环境中选择参数
我有一个设置,使用CodeCommit作为存储库来存储lambda函数,并使用AWS SAM来部署和创建lambda函数的代码管道 我想将lambda函数部署到不同的环境中,如QA、staging和Prod。我使用AWS参数存储来引用我的变量 下面是我设置的template.yaml文件,它创建了一个lambda函数,并使用AWS参数存储引用变量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
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"}
- 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”}
是的,每个环境都有一个代码管道。谢谢您的回复,这也可以吗