如何解决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
,
您正在寻找 mappings 和 FindInMap 功能。查看示例并在 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 举报,一经查实,本站将立刻删除。