使用AWS CodePipelines部署无服务器转换

时间:2018-06-22 23:25:11

标签: amazon-web-services

我根据this CloudFormation Template建立了一条管道。

当我尝试部署使用AWS SAM的模板时,管道中出现错误

  

操作执行失败    CreateStack不能与包含Transforms的模板一起使用。 (服务:AmazonCloudFormation;状态代码:400;错误代码:ValidationError;请求ID:167007a4-7672-11e8-8f67-67e79ae9de20)

这绝对不是我的“操作模式”的抱怨

Configuration:
  ActionMode: CREATE_UPDATE

我可以使用Pipeline Code Build stage,它使用AWS CLI cloudformation软件包like this

version: 0.1
phases:
  install:
    commands:
      - npm install time
      - aws cloudformation package --template-file samTemplate.yaml --s3-bucket bucket-name 
                                   --output-template-file outputSamTemplate.yaml
artifacts:
  type: zip
  files:
    - samTemplate.yaml
    - outputSamTemplate.yaml

但是我宁愿使用一些预先构建的东西。如何使用CodePipelines部署无服务器转换Cloudformation模板?是否可以在不使用AWS CLI打包和部署模板的情况下做到这一点?

1 个答案:

答案 0 :(得分:1)

启动CodeStar Python项目给了我答案。他们在部署阶段特别有两个Cloudformation操作,分别执行CHANGE_SET_REPLACECHANGE_SET_EXECUTE

从CF模板中删除无关的信息,您可以看到其中的操作结构,

Resources:
  ...
  ProjectPipeline:
    Type: 'AWS::CodePipeline::Pipeline'
    Properties:
      Stages:
        -
          Name: Deploy
          Actions:
            - Name: GenerateChangeSet
              ActionTypeId:
                Provider: CloudFormation
              Configuration:
                ActionMode: CHANGE_SET_REPLACE
            - Name: ExecuteChangeSet
              ActionTypeId:
                Provider: CloudFormation
              Configuration:
                ActionMode: CHANGE_SET_EXECUTE

以下是管道的完整模板资源。使用与上述相同的buildspec.yml,他们的CodePipeline模板看起来像

Resources:
  ...
  ProjectPipeline:
    Type: 'AWS::CodePipeline::Pipeline'
    Description: Creating a deployment pipeline for your project in AWS CodePipeline
    Properties:
      Name: pipeline-pipeline
      ArtifactStore:
        Type: S3
        Location:
          Ref: PipelineArtifacts
      RoleArn: !GetAtt [PipelineRole, Arn]
      Stages:
        -
          Name: Source
          Actions:
            -
              Name: CheckoutSourceTemplate
              ActionTypeId:
                Category: Source
                Owner: AWS
                Version: 1
                Provider: CodeCommit
              Configuration:
                PollForSourceChanges: True
                RepositoryName: !GetAtt [PipelineRepo, Name]
                BranchName: master
              OutputArtifacts:
                - Name: TemplateSource
              RunOrder: 1
        -
          Name: Build
          Actions:
            - ActionTypeId:
                Owner: AWS
                Category: Build
                Version: 1
                Provider: CodeBuild
              Configuration:
                ProjectName: !Ref ProjectId
              InputArtifacts:
                - Name: TemplateSource
              OutputArtifacts:
                - Name: BuildTemplate
              RunOrder: 1
        -
          Name: Deploy
          Actions:
            - Name: GenerateChangeSet
              ActionTypeId:
                Owner: AWS
                Category: Deploy
                Version: 1
                Provider: CloudFormation
              Configuration:
                ActionMode: CHANGE_SET_REPLACE
                RoleArn: !GetAtt [PipelineRole, Arn]
                StackName: project-stack
                Capabilities: CAPABILITY_IAM
                TemplatePath: BuildTemplate::outputSamTemplate.yaml
                ChangeSetName: pipeline-changeset
              InputArtifacts:
                - Name: BuildTemplate
              RunOrder: 1
            - Name: ExecuteChangeSet
              ActionTypeId:
                Owner: AWS
                Category: Deploy
                Version: 1
                Provider: CloudFormation
              Configuration:
                ActionMode: CHANGE_SET_EXECUTE
                ChangeSetName: pipeline-changeset
                StackName: project-stack
              RunOrder: 2