Облачные данные вложенных стеков без отката корневого стека - PullRequest
0 голосов
/ 07 марта 2019

В настоящее время у меня есть шаблон "master.yaml", который запускает "service-a.yaml" и "service-b.yaml", а затем "service-c.yaml", который опирается на выходные данные из service-a и service-b.

Есть ли способ разбить этот вложенный стек на несколько вложенных стеков?Таким образом, когда что-то глубоко внутри "service-c" терпит неудачу, это не вызывает откат по всей цепочке?Я хочу запустить A + B параллельно, а затем C, когда они будут закончены автоматически.

Я мог бы иметь master.yaml, который собирает "service-a" и "service-b", а затем вручную запускает "service-c", когда они закончат, но я хотел бы как-нибудь автоматизировать это?

1 Ответ

1 голос
/ 08 марта 2019

Вы можете создать стек с проектом Codebuild и Codepipeline (в основном выполняющим CI / CD), чтобы запускать один стек за другим, и, таким образом, каждый стек будет давать сбой и откатываться отдельно.

Например, шаблон облачной информации будет иметь проект Codebuld следующим образом

  CodeBuildProject:
    Type: AWS::CodeBuild::Project
    Properties:
      Artifacts:
        Type: CODEPIPELINE
      Environment:
        ComputeType: BUILD_GENERAL1_LARGE
        Image: aws/codebuild/python:3.6.5
        Type: LINUX_CONTAINER
        EnvironmentVariables:
        - Name: bucket
          Value: !Ref ArtifactStoreBucket
          Type: PLAINTEXT
        - Name: prefix
          Value: build
          Type: PLAINTEXT
      Name: !Ref AWS::StackName
      ServiceRole: !Ref CodeBuildRole
      Source:
        Type: CODEPIPELINE
        BuildSpec: stack/buildspec.yaml
      Tags:
      - Key: owner
        Value: !Ref StackOwner
      - Key: task
        Value: !Ref RepositoryName

В файле buildspec.yaml вы можете упаковать шаблоны облачного образования следующим образом:

  - aws cloudformation package --template-file master.yaml
                               --s3-bucket $bucket --s3-prefix $prefix
                               --output-template-file master-template.yaml

  - aws cloudformation package --template-file service-a.yaml
                               --s3-bucket $bucket --s3-prefix $prefix
                               --output-template-file service-a-template.yaml

И, наконец, этап кодирования, который связывает все вместе. Например, в приведенном ниже фрагменте вы можете получить исходный код, запускаемый codecommit. Таким образом, каждый толчок в хранилище будет автоматически создавать ваш конвейер.

  Pipeline:
    Type: AWS::CodePipeline::Pipeline
    Properties:
      ArtifactStore:
        Location: !Ref ArtifactStoreBucket
        Type: S3
      DisableInboundStageTransitions: []
      Name: !Sub "${AWS::StackName}"
      RoleArn: !GetAtt [PipelineRole, Arn]
      Stages:
      # Stage 1 - CodeUpdate Stage
      - Name: CodeUpdate
        Actions:
        - Name: SourceCodeUpdate
          ActionTypeId:
            Category: Source
            Owner: AWS
            Version: '1'
            Provider: CodeCommit
          OutputArtifacts:
          - Name: SourceCode
          Configuration:
            PollForSourceChanges: 'false'
            RepositoryName: !Ref RepositoryName
            BranchName: !Ref BranchName
          RunOrder: '1'
      # Stage 2 - Build Stage
      - Name: Build
        Actions:
        - Name: UpdateLambda
          ActionTypeId:
            Category: Build
            Owner: AWS
            Version: '1'
            Provider: CodeBuild
          InputArtifacts:
          - Name: SourceCode
          OutputArtifacts:
          - Name: BuildArtifact
          Configuration:
            ProjectName: !Ref 'CodeBuildProject'
          RunOrder: '1'
      # Stage 3 - Build master stack
      - Name: MasterSetup
        Actions:
        - Name: CreateMasterChangeset
          ActionTypeId:
            Category: Deploy
            Owner: AWS
            Version: '1'
            Provider: CloudFormation
          InputArtifacts:
          - Name: BuildArtifact
          Configuration:
            ActionMode: CHANGE_SET_REPLACE
            StackName: !Sub "${AWS::StackName}-master"
            ChangeSetName: !Sub "${AWS::StackName}-master-update"
            RoleArn: !GetAtt [CFNRole, Arn]
            TemplatePath: BuildArtifact::master-template.yaml
            Capabilities: CAPABILITY_IAM
            ParameterOverrides: !Sub
            - |
              {
                "MasterStack": "${w}",
                "StackOwner": "${x}",
                "Task": "${y}"
              }
            - {
              w: !Sub '${AWS::StackName}',
              x: !Sub '${StackOwner}',
              y: !Sub '${RepositoryName}'
            }
          RunOrder: '1'
        - Name: ExecuteMasterChangeset
          ActionTypeId:
            Category: Deploy
            Owner: AWS
            Version: '1'
            Provider: CloudFormation
          Configuration:
            ActionMode: CHANGE_SET_EXECUTE
            StackName: !Sub "${AWS::StackName}-master"
            ChangeSetName: !Sub "${AWS::StackName}-master-update"
          RunOrder: '2'
      # Stage 4 - Build service-a stack
      - Name: ServiceASetup
        Actions:
        - Name: CreateServiceAChangeset
          ActionTypeId:
            Category: Deploy
            Owner: AWS
            Version: '1'
            Provider: CloudFormation
          InputArtifacts:
          - Name: BuildArtifact
          Configuration:
            ActionMode: CHANGE_SET_REPLACE
            StackName: !Sub "${AWS::StackName}-service-a"
            ChangeSetName: !Sub "${AWS::StackName}-service-a-update"
            RoleArn: !GetAtt [CFNRole, Arn]
            TemplatePath: BuildArtifact::service-a-template.yaml
            Capabilities: CAPABILITY_IAM
            ParameterOverrides: !Sub
            - |
              {
                "MasterStack": "${w}",
                "StackOwner": "${x}",
                "Task": "${y}"
              }
            - {
              w: !Sub '${AWS::StackName}',
              x: !Sub '${StackOwner}',
              y: !Sub '${RepositoryName}'
            }
          RunOrder: '1'
        - Name: ExecuteServiceAChangeset
          ActionTypeId:
            Category: Deploy
            Owner: AWS
            Version: '1'
            Provider: CloudFormation
          Configuration:
            ActionMode: CHANGE_SET_EXECUTE
            StackName: !Sub "${AWS::StackName}-service-a"
            ChangeSetName: !Sub "${AWS::StackName}-service-a-update"
          RunOrder: '2'

Если вы хотите, чтобы стеки выполнялись параллельно, вы можете добавить более 1 стека на каждом этапе.

Очевидно, что вам нужно настроить роли и группы самостоятельно, и это должно дать вам основную идею, с чего начать.

Для получения дополнительной информации вы можете прочитать больше о codepipeline следующим образом: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-cd-pipeline.html https://docs.aws.amazon.com/codepipeline/latest/userguide/reference-pipeline-structure.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...