CDK PipelinesのソースをSelf-Managed版GitLabにして動くか試してみた

CDK PipelinesのソースをSelf-Managed版GitLabにして動くか試してみた

Clock Icon2025.01.30

こんにちは、こーへいです。

今回はCDK PipelinesのソースにSelf-Managed版GitLabにして動かせるか試してみました。結論から言うと動きはしましたが推奨はできません。

CDK Pipelinesとは

皆さんはCDK Pipelinesというものをご存知でしょうか?

CDK Pipelinesとは、CDKでCodeシリーズを構築できるコンストラクトライブラリモジュールであり、要は単一のリポジトリにてVPCやEC2等のデプロイしたいリソースと、それらのリソースデプロイを自動化してくれるCodeシリーズをCDK Pipelinesが扱いやすいものにまとめてくれることがメリットです。

詳細な説明はCDK Pipelines とはが分かりやすいです。

ソースにSelf-Managed版GitLabを指定する

そんな便利なCDK Pipelinesですが、Githubなどのソースは対応しているものの、GitHub, GitHub Enterprise, BitBucket using a connectionには同様にconnectionを使用するSelf-Managed版GitLabの記述はありませんでした。

ですが、これらはconnectionsを使用する仕組みなので、恐らくGitLabも動くだろうと思い試してみました。

Self-Managed版GitLabの用意

Self-Managed版GitLabの用意は以下の記事が参考になります。

https://techstep.hatenablog.com/entry/2024/01/28/150851#Lets-Encryptによるhttps化

注意点としてはCodePipelineとの接続のため、GitLabへはHTTPSでアクセス可能な状態にする必要があります。

また場合によってはGitLabを配置しているEC2インスタンスのセキュリティグループのインバウンドルールにも注意が必要です。

https://dev.classmethod.jp/articles/self-managed-gitlab-codepipeline-vpc/

やってみた

https://benjamin.co.jp/blog/technologies/aws-cdk-pipelines/#cdk-pipelines

ベースとなるコードはこちらの記事を参考にさせていただきました。

// lib/stacks/pipeline-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { CodePipeline, CodePipelineSource, ShellStep } from 'aws-cdk-lib/pipelines';
import { PipelineStage } from './pipeline-stage';

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

    // Self-Managed版GitLabリポジトリ情報
    const repo = '<Self-Managed版GitLabリポジトリのOwrner>/<Self-Managed版GitLabリポジトリ>';
    const branch = '<ブランチ>';

    const pipeline = new CodePipeline(this, 'Pipeline', {
      pipelineName: '<CDK Pipelinesの名前>',
      synth: new ShellStep('Synth', {
        input: CodePipelineSource.gitHub(repo, branch, {
          connectionArn: "arn:aws:codeconnections:リージョン:AWSアカウントID:connection/識別子", //作成したConnection
        }),
        commands: ['npm ci', 'npm run build', 'npx cdk synth']
      })
    });

    const deploy = new PipelineStage(this, "Deploy");
    const deployStage = pipeline.addStage(deploy);
  }
}

この状態でリポジトリにpushしてみます。

貼り付けた画像_2025_01_30_10_25

画像は成功と出ているので少しややこしいですが、pushしたのに反応せずCodePipelineは起動しませんでした。

CodePipelineをv2に変更すると動きました

貼り付けた画像_2025_01_30_10_28

原因としては、CDK PipelinesのデフォルトはCodePipelineがv1で構築されていることでした。コンソールからv2にアップデートすることでpushで起動するようになりました。

まずはCDKパイプラインのやり方を試してみてください。 もっとコントロールしたい場合や、aws-codepipelineのv2サポートが必要な場合は、aws-codepipelineのコンストラクトライブラリを直接使うことをお勧めします。※機械翻訳

こちらにv2を使用するならaws-codepipelineのコンストラクトライブラリを使用してねと記載されていますね。

ちなみに何故v1だと動かずv2だと動くのかの原因は分かりませんでした。以下は考察。

  • v1だとコードをpushしても動かないが、コンソールから手動でCodePipelineを動かすと問題なく動く。そのためv1とv2のトリガー条件の差に原因がある
  • Self-Managed版GitLabのアップデートは23年末で、v2のアップデートはそれ以前のものなのでv1に対応していない可能性

対応方法

CDK PipelinesはCodePipelineのv2に対応しておらず、CodePipelineはv1からv2への移行を推奨としているためCDK Pipelinesをそのまま使うのは適切ではありません。

  • CDKドキュメントに記載の通り、CDK Pipelinesとaws-codepipelineを組み合わせてv2にて構築できるようにする
  • CDK Pipelinesを使用せずに構築する
    • CodePipelineはIaCではなくcliで構築するのを推奨している記事も見つけました

まとめ

CDK PipelinesにてSelf-Managed版GitLabをソースにして動かすことはできましたが、CDK PipelinesではGitLabのサポートの記述がない点やCDK Pipelines自体がCodePipeline v2に直接対応していないため、別の手段を検討する必要があると感じました。

本番環境などでは別の手段を取る必要があるので、次回はその方法を記事にしてみます。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.