🚀

CDKPipelineで空ステージを作成する

2023/09/19に公開

動機

  • CDKPipelineでPipelineを構築している際に、コマンド(シェルスクリプト)だけ実行できるステージを作ることが欲しい

※CDKPipelineとは、aws-cdk-lib.pipelines module で実装されたCI/CD Pipelineを指します。

https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/cdk_pipeline.html
https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.pipelines-readme.html

解決方法概要

  • 空の何もデプロイしないStackを定義して、そのスタックをStage化する
  • そのStageをPipelineの途中に挟み、 prepost で好きなコマンドを実行する

メリット:

  • CDKPipelineの定義をそのまま使った形で実現できる
    デメリット:
  • 何もデプロイしないCDK(CloudFormation)デプロイが走るのが少し無駄に感じる

CDKPipeline実装方法

空Stackを定義:

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class EmptyStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props: cdk.StackProps) {
    super(scope, id, props);
  }
}

空Stageを定義:

import * as cdk from "aws-cdk-lib";
import { Stage, StageProps } from "aws-cdk-lib";
import { Construct } from 'constructs';

export class EmptyStage extends Stage {
  constructor(scope: Construct, id: string, props: cdk.StackProps) {
    super(scope, id, props);
    new EmptyStack(this, 'empty-stack', props);
  }
}

CDKPipelineに組み込む:

import { CodePipeline } from "aws-cdk-lib/pipelines";


const pipeline = new CodePipeline()
 :
const hogeStage = pipeline.addStage(new EmptyStage(app, 'hogeStage', props));
hogeStage.addPre(...steps: cdk.pipelines.Step[]); ←好きなコマンドを挟む
 

まとめ

以上が、CDKPipelineで任意のコマンドを実行するだけのステージを挟む方法になります。
Stack無しのステージは作成することができなかったので空ステージのような形で実現していますが、もっと良い方法があれば教えてください!

細かいことに対応するのが難しいという印象を受けがちなCDKPipelineですが、こんなこともできるのか〜くらいに誰かの役に立てば幸いです。

Discussion