はじめに
こんにちは、サーバーワークス橋本です。
今回は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のセルフホステッド環境を構築してみます。 リファレンスアーキテクチャで記載されている構成で進めていきます。 具体的には、以下の内容を試してみます。
- 最小構成(最大20RPSまたは1,000ユーザー)を構築
- クラウドリソースは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_ID
とAWS_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のセルフホステッド環境を比較的簡単に構築することができます。
次回は、機会があればクラウドネイティブハイブリッドについても触れようと思います。