在 CDK CodePipelines 中添加手动审批阶段

Posted

技术标签:

【中文标题】在 CDK CodePipelines 中添加手动审批阶段【英文标题】:Adding manual approval stage in CDK CodePipelines 【发布时间】:2022-01-08 01:25:59 【问题描述】:

我一直在使用 AWS CDK,我认为这是使用 AWS 的好方法。最近我遇到了一个我无法解决的问题。浏览了文档和资源,但没有人解释如何在 CDK 中进行操作。所以我有两个代码管道,每个管道要么部署到登台或生产。现在我想要在代码部署到生产环境之前进行手动审批阶段。我将在下面显示我的简单代码以供参考:

import * as cdk from '@aws-cdk/core';
import  AppsPluginsCdkStack  from './apps-plugins-services/stack';
import 
  CodePipeline,
  ShellStep,
  CodePipelineSource
 from '@aws-cdk/pipelines';

class ApplicationStage extends cdk.Stage 
  constructor(scope: cdk.Construct, id: string) 
    super(scope, id);
    new CdkStack(this, 'cdkStack');
  


class ProductionPipelineStack extends cdk.Stack 
  constructor(scope: cdk.Construct, id: string, props: cdk.StackProps) 
    super(scope, id, props);

    //Create the CDK Production Pipeline
    const prodPipeline = new CodePipeline(this, 'ProductionPipeline', 
      pipelineName: 'ProdPipeline',
      synth: new ShellStep('ProdSynth', 
        // Use a connection created using the AWS console to authenticate to GitHub
        input: CodePipelineSource.connection(
          'fahigm/cdk-repo',
          'develop',
          
            connectionArn:
              'AWS-CONNECTION-ARN' // Created using the AWS console
          
        ),
        commands: ['npm ci', 'npm run build', 'npx cdk synth']
      )
    );

    prodPipeline.addStage(new ApplicationStage(this, 'Production'));
  


class StagingPipelineStack extends cdk.Stack 
  constructor(scope: cdk.Construct, id: string, props: cdk.StackProps) 
    super(scope, id, props);
    //Create the CDK Staging Pipeline
    const stagePipeline = new CodePipeline(this, 'StagingPipeline', 
      pipelineName: 'StagePipeline',
      synth: new ShellStep('StageSynth', 
        // Use a connection created using the AWS console to authenticate to GitHub
        input: CodePipelineSource.connection(
          'fahigm/cdk-repo',
          'master',
          
            connectionArn:
              'AWS-CONNECTION-ARN' // Created using the AWS console
          
        ),
        commands: ['npm ci', 'npm run build', 'npx cdk synth']
      )
    );

    stagePipeline.addStage(new ApplicationStage(this, 'Staging'));
  

//
const app = new cdk.App();

new ProductionPipelineStack(app, 'ProductionCDKPipeline', 
  env:  account: 'ACCOUNT', region: 'REGION' 
);

new StagingPipelineStack(app, 'StagingCDKPipeline', 
  env:  account: 'ACCOUNT', region: 'REGION' 
);

app.synth();

现在我不知道从这里去哪里。该文档仅讨论如何从控制台执行此操作,但我想将其添加到代码中。非常感谢任何帮助!

【问题讨论】:

为什么不是一个有两个阶段的管道? @gshpychka 好吧,我看到了一个答案或博客,他们这样做是为了为每个阶段设置管道。但是拥有一条管道有什么好处吗? 好处是它是连续的,生产是在分期之后进行的。但是你必须用一个 git 分支来做,不能用多个来做。如果它回答了问题,请接受答案。 【参考方案1】:

CDK 文档实际上并没有讨论如何从控制台执行此操作,它讨论了如何使用 CDK 执行此操作,并提供了示例。这是一个例子straight from the docs:

以下示例显示了 ShellStep 形式的自动批准和添加到管道的 ManualApprovalStep 形式的手动批准。两者都必须通过才能从 PreProd 升级到 Prod 环境:

declare const pipeline: pipelines.CodePipeline;
const preprod = new MyApplicationStage(this, 'PreProd');
const prod = new MyApplicationStage(this, 'Prod');

pipeline.addStage(preprod, 
  post: [
    new pipelines.ShellStep('Validate Endpoint', 
      commands: ['curl -Ssf https://my.webservice.com/'],
    ),
  ],
);
pipeline.addStage(prod, 
  pre: [
    new pipelines.ManualApprovalStep('PromoteToProd'),
  ],
);

这里是关于手动批准步骤的文档:https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_pipelines.ManualApprovalStep.html

【讨论】:

是否还可以添加将发送通知以进行批准的电子邮件? 是的,您可以向 SNS 主题发布通知,并且您可以用它做任何您需要的事情,包括发送电子邮件。 当我们点击按钮进行审批时,它会打开一个对话框,其中包含 Comment 和 Url 等字段以供审查。现在我可以传递注释,因为这是一个可选字段,但没有字段可以传入 url。我错过了什么吗? 不确定您指的是什么。如果找不到解决方案,请查阅文档并提出新问题。

以上是关于在 CDK CodePipelines 中添加手动审批阶段的主要内容,如果未能解决你的问题,请参考以下文章

如何将 VPC 和安全组分配给 AWS CDK 中的 Lambda?

如何在 Cloudformation 模板/CDK 中添加 AWS IoT 配置模板

CDK 添加随机参数

如何创建在 Python CDK 中引用自身的 API Gateway 资源策略?

通过 CDK 中的 ARN 将 eventSource 添加到 Lambda

在CDK中通过ARN将事件源添加到Lambda