GitLab Environment Toolkitを使って実際にGitLabの環境構築をしてみた

記事タイトルとURLをコピーする

はじめに

こんにちは、サーバーワークス橋本です。
今回はGitlabについて、GitLab Environment Toolkitを使って実際にGitLabの環境構築を試してみました。
GitLabはSaaS環境もありますが、企業が本格的に活用しようと考える場合、セルフホステッドのほうが出来ることが多いです。
※SaaSとセルフホステッド(Self-Managed)の違いは前に書いたブログを参照してください。
ただし、GitLab環境を一から用意するのは複雑で且つ、検討することが多いです。
そこでGitLabが提供しているGitLab Environment Toolkitを使うことで、同社が設計した内容で比較的簡単にGitLab環境を構築することができます。

GitLab Environment Toolkitとは?

GitLab Environment ToolkitはGitLab環境の導入を支援するためにGitLabが推奨する構成Reference architecturesをベースに従って拡張されたTerraformとAnsibleスクリプトのセットです。
Terraformでクラウドリソース(AWSのEC2、VPCなど)を構築し、AnsibleでGitLabのインストールや設定を行います。

このツールを利用することにより、ニーズに合ったGitLab環境を比較的楽に構築することが出来ます。
例えば、以下のニーズに対応しています。

規模に合わせた環境構築:
1,000人から50,000人規模まで、ユーザー数に応じた最適なアーキテクチャを自動でデプロイ可能

マルチクラウド対応:
AWS、GCP、Azureといった主要なクラウドプロバイダーで、GitLabを簡単にセットアップ可能

高可用性と災害対策:
複数のロケーションにGitLabを分散配置する「Geo」機能をサポートしており、災害時にもサービスを継続可能な構築も可能

高度な検索とモニタリング:
モニタリングや検索機能OpenSearchによる強力な検索機能や、Prometheusを使った監視環境も簡単に構築可能

ダウンタイムを最小限に:
サービスを止めずにアップグレード可能

柔軟な設定:
独自のロードバランサやデータベースを利用する構築も可能

オンプレミスにも対応:
Ansibleを利用してGitLabのみをデプロイ可能。

とりあえず最小構成を試してみる

GitLab Environment Toolkitを使って、AWS上にGitLabのセルフホステッド環境を構築してみます。 リファレンスアーキテクチャで記載されている構成で進めていきます。 具体的には、以下の内容を試してみます。

  1. 最小構成(最大20RPSまたは1,000ユーザー)を構築
  2. クラウドリソースはAWSを使用

構成と役割

VPC

デフォルトVPCが無い場合は作成するようになっているみたいです。
※デフォルトVPCはセキュリティのベストプラクティス的に使わない方が良いので、本格的に利用する場合は変更が必要かと思われます。詳細はこちらをご参照ください。

EC2 (haproxy_external)

  • HAProxy
    ロードバランシングします。(GitLabホストは1台ですがデフォルトで作成します。)

EC2 (gitlab_rails)

  • GitLab、Gitaly
    GitLabの機能全般を担います。
  • PostgreSQL
    GitLabのデータを保持します。
  • Redis
    データのキャッシングします。
  • Sidekiq
    時間がかかる処理をバックグラウンドで実行します。

実践

事前準備

GitLab Environment Toolkitを利用するためには、以下の事前準備が必要です。

プロバイダー認証の設定 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYを用意

SSH認証の設定 SSH キー ペアを生成しておく。

Terraform 状態ストレージのセットアップ 対象のAWS環境にTerraform State 用のAmazon S3 バケットを用意する。 ※特に指定はないですが分かりやすい名前で作成※今回は、hs-swx-test-202508-get-terraform-state

Elastic IP アドレスの予約

静的外部IPアドレス(Elastic IP アドレス)を予約します。 ※Elastic Load Balancing (ELB)を使う場合は不要です。

GitLab Environment Toolkitのセットアップ

Terraformの有無確認 Terraformv1.9.0以上がインストール済であることを確認 ※未インストールの場合は先にインストールから実施する。

# バージョン確認コマンド
terraform -version

リソースをクローン GitLab Environment Toolkitをクローンします。

# リソースをClone
git clone git@gitlab.com:gitlab-org/gitlab-environment-toolkit.git
# 対象ディリクトリに移動
cd gitlab-environment-toolkit

AWS環境設定

AWSに構築するリソースの設定を行う。

認証キーで生成したキーペアの配置

事前準備で生成した公開鍵を以下のディリクトリに配置する。

# cp/mvで公開鍵を配置
cp <生成した公開鍵のパス> ./keys/
環境ディリクトリと設定ファイルを作成

今回は、最小構成なのでGitLabで用意しているexampleディリクトリを丸ごとコピーして利用する。

# exampleディリクトリをコピー
cp -r ./example/1k_aws/terraform ./terraform/environments/hs-swx-test-202508
# 環境ディリクトリに移動
cd ./terraform/environments/hs-swx-test-202508

※上記コマンドでhs-swx-test-202508ディリクトリとenvironment.tf,main.tf,variables.tfが作成される。

設定ファイルの編集

environment.tf

補足:
gitlab_rails_node_count:GitLabで利用するEC2の台数を指定する※今回は最小構成なのでこのまま
haproxy_external_node_count:ロードバランサー(HAProxy)をEC2で運用するのがデフォルト
gitlab_rails_instance_type:リファレンスアーキテクチャの最小構成のインスタンスなのでこのまま haproxy_external_*:ロードバランサー(HAProxy)をEC2で運用するのがデフォルトなのでELBとかを使う場合は変更が必要(今回はこのまま)

module "gitlab_ref_arch_aws" {
source = "../../modules/gitlab_ref_arch_aws"

prefix         = var.prefix
ssh_public_key = file(var.ssh_public_key_file)

gitlab_rails_node_count    = 1
gitlab_rails_instance_type = "c5.2xlarge"

haproxy_external_node_count                = 1
haproxy_external_instance_type             = "c5.large"
haproxy_external_elastic_ip_allocation_ids = [var.external_ip_allocation]
}

output "gitlab_ref_arch_aws" {
value = module.gitlab_ref_arch_aws
}

main.tf

補足:
bucket:作成したS3バケット名
key:Terraformの状態ファイルを保存するキー(名前は環境名でOK)
region:構築するリージョン指定(特にこだわりないならap-northeast-1)

terraform {
backend "s3" {
   bucket = "hs-swx-test-202508-get-terraform-state"
   key    = "hs-swx-test-202508.tfstate"
   region = "ap-northeast-1"
}
required_providers {
   aws = {
      source = "hashicorp/aws"
   }
}
}

# Configure the AWS Provider
provider "aws" {
region = var.region
}

variables.tf

補足:
prefix:環境名を指定(ただし、デフォルトだとprefixでS3やkeyを作成するので一意になるように注意)
region:構築するリージョン指定(特にこだわりないならap-northeast-1)
ssh_public_key_file:配置した公開鍵のパスを指定
external_ip_allocation:事前準備で予約したElastic IPのIDを指定

variable "prefix" {
default = "hs-swx-test-202508"
}

variable "region" {
default = "ap-northeast-1"
}

variable "ssh_public_key_file" {
default = "../../../keys/id_ed25519.pub"
}

variable "external_ip_allocation" {
default = "eipalloc-XXXXXXXXXXXXXXXXXX"
}

AWS環境構築

Terraformコマンドでの構築実施

プロバイダーのインストール

GitLab Environment Toolkitのディレクトリに移動し、必要なプロバイダーをインストールします。

terraform init
インフラストラクチャをプロビジョニング

確認が入るので、特に問題なければ[yes]を入力すると必要なリソースが構築されます。

terraform apply

GitLab設定

GitLabをプロビジョニングする設定を行う。

環境ディリクトリと設定ファイルを作成

今回は、最小構成なのでGitLabで用意しているexampleディリクトリを丸ごとコピーして利用する。

# inventoryディリクトリを作成
mkdir ./ansible/environments/hs-swx-test-202508
# exampleディリクトリをコピー
cp -r ./example/1k_aws/ansible ./ansible/environments/hs-swx-test-202508/inventory
# 環境ディリクトリに移動
cd ./ansible/environments/hs-swx-test-202508/inventory

※上記コマンドでhs-swx-test-202508/inventoryディリクトリと1k.aws_ec2.yml,vars.ymlが作成される。
※Ansibleの慣例としてinventoryにしているだけで必ずしもこのディリクトリ名でなくてもよい。

# 1k.aws_ec2.ymlを環境名に変更する
mv 1k.aws_ec2.yml hs-swx-test-202508.aws_ec2.yml

※こちらもAnsibleの慣例なので<環境名>.aws_ec2.ymlで変更する。

設定ファイルの編集

<環境名>.aws_ec2.yml

補足:

tag:gitlab_node_prefix:環境名を指定

plugin: aws_ec2
regions:
- ap-northeast-1
filters:

tag:gitlab_node_prefix: hs-swx-test-202508
keyed_groups:
- key: tags.gitlab_node_type
   separator: ''
- key: tags.gitlab_node_level
   separator: ''
hostnames:
# List host by name instead of the default public ip
- tag:Name
compose:
# Set to 'public_ip_address' to make Ansible SSH via the public IP address of the hosts.
# Set to 'private_ip_address' to make Ansible SSH via the private (non-internet routable) IP addresses of the hosts.
# Set to 'instance_id' if Ansible is configured to connect via AWS System Manager sessions (AWS SSM)
ansible_host: public_ip_address

vars.yml

補足:
ansible_user:ツールのデフォルトのOSはUbuntuなので「ubuntu」をユーザに設定
ansible_ssh_private_key_file:事前準備で生成した秘密鍵のパスを指定
aws_region:構築するリージョン指定(特にこだわりないならap-northeast-1)
prefix:事前に取得したElastic IPがURLになるので設定
external_url:事前準備で予約したElastic IPのIDを指定
gitlab_license_file:EE版を使う場合は指定(CE版の場合はコメントアウトでOK) gitlab_root_password:GitLabのrootパスワードを設定する(任意の値)

all:
vars:
   # Ansible Settings
   ansible_user: "ubuntu" # Typically ubuntu (Ubuntu), admin (Debian) or ec2-user (RHEL / Amazon Linux 2)
   ansible_ssh_private_key_file: ""

   # Cloud Settings
   cloud_provider: "aws"
   aws_region: "ap-northeast-1"

   # General Settings
   prefix: "hs-swx-test-202508"
   external_url: "http://XXX.XXX.XXX.XXX"

   # gitlab_license_file: "<gitlab_license_file_path>"

   # Passwords / Secrets
   gitlab_root_password: 'EXAMPLE12345'

GitLab構築

Ansibleコマンドでの構築実施 AnsibleがPythonで作成されているので、Pythonのパッケージ管理ツールであるpipを使ってインストールします。

実行対象のリストアップ

Ansibleが実行対象とするホストをリストアップ

ansible all -m ping -i environments/hs-swx-test-202508/inventory --list-hosts
ansible-playbookを実行

Ansibleのプレイブックを実行することでリストの内容でデプロイします。

ansible-playbook -i environments/hs-swx-test-202508/inventory playbooks/all.yml

GitLabにアクセス

vars.ymlで設定したexternal_url(http://XXX.XXX.XXX.XXX)にブラウザでアクセスするとGitLabのログイン画面が表示されます。

ログイン画面で、vars.ymlで設定したgitlab_root_passwordを入力してログインします。

まとめ

以上、GitLab Environment Toolkitを使って、AWS上にGitLabのセルフホステッド環境を構築を試してみました。
運用に使う場合は、多少の見直しが必要な部分もありますが、 GitLab Environment Toolkitを利用することで、GitLabのセルフホステッド環境を比較的簡単に構築することができます。
次回は、機会があればクラウドネイティブハイブリッドについても触れようと思います。

はしもと しんご(記事一覧)

アプリケーションサービス部ディベロップメントサービス2課

猫が好きです。