我正在使用代码管道来部署我的基础架构,我希望能够在不同的环境(dev,staging,prod,...)中部署它.
我目前有一个buildspec.yml文件,其中包含一些"pip install"指令和"aws cloudformation package"命令.我还创建了2个管道,一个用于生产,另一个用于开发,指向github上的2个不同分支.我遇到的问题是,因为在两个分支中文件都包含类似的资源,例如我在S3存储桶上有名称冲突.
使用AWS CLI和cloudformation创建或更新堆栈时,您可以使用--parameters选项传递参数.我想在我创建的2个管道中做类似的事情.
解决这个问题的最佳解决方案是什么?
最终目标是自动化基础架构的部署.我们的基础设施由用户,KMS密钥,Lamdbas(在python中),组和桶组成.
我按照教程创建了两个管道:http://docs.aws.amazon.com/lambda/latest/dg/automating-deployment.html
第一个管道链接到包含代码的repo的主分支,第二个管道链接到分段分支.我的目标是使用第一个管道和登台环境中的暂存分支,使用第二个管道在生产环境中自动部署主分支.
我的buildspec.yml文件看起来像:
version: 0.1 phases: install: commands: - pip install requests -t . - pip install simplejson -t . - pip install Image -t . - aws cloudformation package --template-file image_processing_sam.yml --s3-bucket package-bucket --output-template-file new_image_processing_sam.yml artifacts: type: zip files: - new_image_processing_sam.yml
image_processing_sam.yml文件如下所示:
AWSTemplateFormatVersion: "2010-09-09" Transform: "AWS::Serverless-2016-10-31" Description: Create a thumbnail for an image uploaded to S3 Resources: ThumbnailFunction: Type: "AWS::Serverless::Function" Properties: Role: !GetAtt LambdaExecutionRole.Arn Handler: create_thumbnail.handler Runtime: python2.7 Timeout: 30 Description: "A function computing the thumbnail for an image." LambdaSecretEncryptionKey: Type: "AWS::KMS::Key" Properties: Description: "A key used to encrypt secrets used in the Lambda functions" Enabled: True EnableKeyRotation: False KeyPolicy: Version: "2012-10-17" Id: "lambda-secret-encryption-key" Statement: - Sid: "Allow administration of the key" Effect: "Allow" Principal: AWS: "arn:aws:iam::xxxxxxxxxxxxx:role/cloudformation-lambda-execution-role" Action: - "kms:Create*" - "kms:Describe*" - "kms:Enable*" - "kms:List*" - "kms:Put*" - "kms:Update*" - "kms:Revoke*" - "kms:Disable*" - "kms:Get*" - "kms:Delete*" - "kms:ScheduleKeyDeletion" - "kms:CancelKeyDeletion" Resource: "*" - Sid: "Allow use of the key" Effect: "Allow" Principal: AWS: - !GetAtt LambdaExecutionRole.Arn Action: - "kms:Encrypt" - "kms:Decrypt" - "kms:ReEncrypt*" - "kms:GenerateDataKey*" - "kms:DescribeKey" Resource: "*" LambdaExecutionRole: Type: "AWS::IAM::Role" Properties: RoleName: "LambdaExecutionRole" AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: - "lambda.amazonaws.com" Action: - "sts:AssumeRole" Policies: - PolicyName: LambdaKMS PolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Action: - "kms:Decrypt" Resource: "*" - Effect: "Allow" Action: - "lambda:InvokeFunction" Resource: "*" ManagedPolicyArns: - "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" UserGroup: Type: "AWS::IAM::Group" LambdaTriggerUser: Type: "AWS::IAM::User" Properties: UserName: "LambdaTriggerUser" LambdaTriggerUserKeys: Type: "AWS::IAM::AccessKey" Properties: UserName: Ref: LambdaTriggerUser Users: Type: "AWS::IAM::UserToGroupAddition" Properties: GroupName: Ref: UserGroup Users: - Ref: LambdaTriggerUser Policies: Type: "AWS::IAM::Policy" Properties: PolicyName: UserPolicy PolicyDocument: Statement: - Effect: "Allow" Action: - "lambda:InvokeFunction" Resource: - !GetAtt DispatcherFunction.Arn Groups: - Ref: UserGroup PackageBucket: Type: "AWS::S3::Bucket" Properties: BucketName: "package-bucket" VersioningConfiguration: Status: "Enabled" Outputs: LambdaTriggerUserAccessKey: Value: Ref: "LambdaTriggerUserKeys" Description: "AWSAccessKeyId of LambdaTriggerUser" LambdaTriggerUserSecretKey: Value: !GetAtt LambdaTriggerUserKeys.SecretAccessKey Description: "AWSSecretKey of LambdaTriggerUser"
我在两个管道中添加了一个部署操作,以执行beta操作期间计算的更改集.
第一个管道像魅力一样工作,并做我希望它做的一切.每次我在主分支中推送代码时,它都会被部署.
我面临的问题是,当我在登台分支中推送代码时,一切都在管道中工作,直到达到部署操作.部署操作尝试创建一个新堆栈,但由于它完全相同的buildspec.yml和处理的image_processing_sam.yml,我达到名称冲突,如下所示.
package-bucket already exists in stack arn:aws:cloudformation:eu-west-1:xxxxxxxxxxxx:stack/master/xxxxxx-xxxx-xxx-xxxx LambdaTriggerUser already exists in stack arn:aws:cloudformation:eu-west-1:xxxxxxxxxxxx:stack/master/xxxxxx-xxxx-xxx-xxxx LambdaExecutionRole already exists in stack arn:aws:cloudformation:eu-west-1:xxxxxxxxxxxx:stack/master/xxxxxx-xxxx-xxx-xxxx ...
有没有办法参数化buildspec.yml,以便能够为image_processing_sam.yml中的资源名称添加后缀?任何其他想法实现这一点是受欢迎的.
最好的祝福.
http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/continuous-delivery-codepipeline-basic-walkthrough.html
模板配置文件通过如下参数文件应用于CodePipeline中的CloudFormation:
{ "Parameters" : { "DBName" : "TestWordPressDB", "DBPassword" : "TestDBRootPassword", "DBRootPassword" : "TestDBRootPassword", "DBUser" : "TestDBuser", "KeyName" : "TestEC2KeyName" } }
将这些文件放在您的仓库的根目录中,可以至少以两种方式引用它们.
在您的CodePipeline CloudFormation中:
Configuration: ActionMode: REPLACE_ON_FAILURE RoleArn: !GetAtt [CFNRole, Arn] StackName: !Ref TestStackName TemplateConfiguration: !Sub "TemplateSource::${TestStackConfig}" TemplatePath: !Sub "TemplateSource::${TemplateFileName}"
或者在模板配置字段的控制台中:
值得注意的是配置文件格式与通过cli使用的CloudFormation不同
-- parameters
--parameters使用以下格式:
[ { "ParameterKey": "team", "ParameterValue": "AD-Student Life Applications" }, { "ParameterKey": "env", "ParameterValue": "dev" }, { "ParameterKey": "dataSensitivity", "ParameterValue": "public" }, { "ParameterKey": "app", "ParameterValue": "events-list-test" } ]
CodePipeline Cloudformation模板配置文件使用以下格式:
{ "Parameters" : { "DBName" : "TestWordPressDB", "DBPassword" : "TestDBRootPassword", "DBRootPassword" : "TestDBRootPassword", "DBUser" : "TestDBuser", "KeyName" : "TestEC2KeyName" } }