はじめに
AWS CodeCommitが他のコードリポジトリのサービスに機能的に水をあけられて久しいが、AWS CodePipelineはV2でそれらのコードリポジトリとの接続性を高めて利便性を上げようとしている。
そんな中、セルフマネージドのGitLabについても2023/12/28に接続可能になったので、今回は
再現性高く接続できるよう、Terraformで動かしてみることする。
なお、この接続の実態としてはAWS CodeStar Connectionsのサービスを使うようである。この後の記述で何度かAWS CodeStar Connectionsと記載するが、マネージメントコンソール上では「接続」という名前になっているので、間違えないよう注意していただきたい。
準備
以下のように、いくつかGitLab側での設定をしておく必要がある。
GitLabのHTTPS化
まずは、Self ManagedなGitLabが正しくHTTPS化されていないといけない。
平文のHTTPのままでは使えず、オレオレ証明書だと認証局へのアクセスでエラーになってしまう。
特に制限事項等の記載は見つけられなかったが、AWS CodeStar Connectionsのホスト設定がHTTPSでアクセスすることが前提になっているようだ。
HTTPS化についてはLet's Encryptあたりを使うと無料で証明をしてくれるが、今回はACMを利用して作成した。ACMでAWSが管理するプライベート認証局を使って証明書発行する方法は別の記事で書いているので、そちらを参考にしていただきたい。
GitLabのトークン払い出し
GitLabのトークンを以下の画面で払い出す。
この際作成するトークンはリポジトリのトークンではなくて、ユーザに紐づくトークンが必要になる。リポジトリのトークンではPermissionDeniedでエラーになるので、注意しよう。以下のEdit ProfileのAccess Tokensのメニューから作成可能だ。
あとは、api
のパーミッションが必要になるので、画像の箇所にチェックを入れておく。
接続(CodeStar Connections)の設定
リソースの作成
以下の通りにリソースを作成する。
今回、Self ManagedなGitLabはEC2で起動しているので、そのリソースをデータソースで参照している。
インターネットからのアクセスを前提にしているならVPC設定不要では?と思ったが、設定しないとエラーになる。理由はよく分からない……。
resource "aws_codestarconnections_host" "example" {
name = local.codestar_connection_host_name
provider_endpoint = "https://${data.aws_instance.smgitlab.public_dns}"
provider_type = "GitLabSelfManaged"
vpc_configuration {
vpc_id = data.aws_security_group.ec2.vpc_id
subnet_ids = [data.aws_instance.smgitlab.subnet_id]
security_group_ids = [data.aws_security_group.ec2.id]
tls_certificate = aws_acmpca_certificate_authority.example.certificate
}
}
resource "aws_codestarconnections_connection" "example" {
name = local.codestar_connection_name
host_arn = aws_codestarconnections_host.example.arn
}
保留中の接続の更新
CodeStar Connectionsはリソースを作成しただけでは使い始めることができない。
コンソールの以下の画面で接続の更新を行う。
リダイレクトが多いからか、この処理はTerraformはおろかCLIでも提供されていないので、仕方ないがマネージメントコンソールからやっておこう。
デベロッパー用ツール(Codeシリーズのコンソール画面)のメニューの設定→接続の以下の画面で、「保留中の接続の更新」のボタンを押す。
すると、以下の画面が出てくるので、準備段階で作成したトークンのIDを入力しよう。
トークンIDを入力したら、以下の画面でAuthorizeのボタンを押せば、接続の設定が完了する。
接続設定画面のステータスが、「利用可能」になっていればOKだ。
CodePipelineに組み込む
IAMロールの設定
さて、CodePipelineに組み込みたいところだが、その前にCodePipelineのIAMロールに以下の権限を付与しておく必要がある。設定しない場合はソースステージでエラーになる。
data "aws_iam_policy_document" "codepipeline_custom" {
(中略)
statement {
sid = "AllowCodeStarConnections"
effect = "Allow"
actions = [
"codestar-connections:UseConnection",
]
resources = [
aws_codestarconnections_connection.example.arn,
]
}
(中略)
}
CodePipelineの設定
CodePipelineは以下のように設定すれば良い。ここは特に難しいことはないだろう。
あとは、ソースアーティファクトをCodeCommitと同じように扱っておけば良いだけである。
FullRepositoryId
だけ厄介で、その名の通り、リポジトリ名だけでなくグループも書いておかないとエラーになるため注意しよう。
resource "aws_codepipeline" "example" {
name = local.codepipeline_pipeline_name
role_arn = aws_iam_role.codepipeline.arn
(中略)
stage {
name = "Source"
action {
run_order = 1
name = "Source"
category = "Source"
owner = "AWS"
provider = "CodeStarSourceConnection"
version = "1"
output_artifacts = ["SourceArtifact"]
configuration = {
ConnectionArn = aws_codestarconnections_connection.example.arn
FullRepositoryId = "root/test"
BranchName = "main"
}
}
}
(中略)
}
これで、Self ManagedなGitLabからのCI/CD起動が簡単になった!
なお、2024/2/9にはCodePipeline V2に機能が追加され、GitLabであればタグやブランチをフィルタしてパイプラインを起動できるようになったので、今後より便利にCI/CDをできるようになっていくだろう。