CDK PipelinesのソースをSelf-Managed版GitLabにして動くか試してみた
こんにちは、こーへいです。
今回は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の用意は以下の記事が参考になります。
注意点としてはCodePipelineとの接続のため、GitLabへはHTTPSでアクセス可能な状態にする必要があります。
また場合によってはGitLabを配置しているEC2インスタンスのセキュリティグループのインバウンドルールにも注意が必要です。
やってみた
ベースとなるコードはこちらの記事を参考にさせていただきました。
// 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してみます。
画像は成功と出ているので少しややこしいですが、pushしたのに反応せずCodePipelineは起動しませんでした。
CodePipelineをv2に変更すると動きました
原因としては、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に直接対応していないため、別の手段を検討する必要があると感じました。
本番環境などでは別の手段を取る必要があるので、次回はその方法を記事にしてみます。