- Published on
セルフホスト(self-managed)版 GitLab と CircleCI クラウドを IP アドレスベースでセキュアに接続する方法
- Authors
- Name
- Tadashi Nemoto
- @tadashi0713
この記事では、CircleCI が提供する IP アドレス範囲機能を利用して、セルフホスト(self-managed)版 GitLab と CircleCI クラウドを IP アドレスベースでセキュアに接続する方法について紹介します。
- CircleCI クラウドのセルフホスト(self-managed)版 GitLab サポート
- CircleCI の IP アドレス範囲機能
- 事前準備
- セルフホスト(self-managed)版 GitLab で CircleCI の IP アドレスを許可する
- プロジェクトのセットアップ
- IP アドレス範囲機能を有効にしたパイプラインを作成する
- Docker イメージのビルド・プッシュを行いたい場合(kaniko)
- macOS を利用したい場合
- 注意点
CircleCI クラウドのセルフホスト(self-managed)版 GitLab サポート
CircleCI クラウドはこの度、セルフホスト(self-managed)版 GitLab のサポートをリリースしました。
CircleCI に GitLab が対応 | CircleCI
セルフホスト(self-managed)版 GitLab では、GitLab CI を自前でホストして CI/CD パイプラインを作ることもできますが、様々な課題が出てきます。
-
コンピューティングリソースの制限によって、ビルドスピード・並列数に制限が出てしまう
-
iOS アプリケーションのビルド・テストに必要な macOS を利用するのが困難
-
デバッグ・可視化・セキュリティ・テスト分割など、開発者が求める CI/CD 機能に不足が出てしまう
今回の CircleCI のサポートによって、セルフホスト(self-managed)版 GitLab を利用している開発者でも高性能な CI/CD 環境を利用することができます。
しかし、セルフホスト(self-managed)版 GitLab と CircleCI クラウドを接続するためには以下の制約があります。
self-managed インスタンスはパブリックインターネットからアクセス可能である必要があります。ファイアウォールの内側に配置している場合は使用できません。
しかしながら、特に企業でセルフホスト(self-managed)版 GitLab を利用している場合には、やみくもにパプリックインターネットからアクセスできる状況にしたくないと思われます。
今回はこの問題を解決するために、CircleCI が提供する IP アドレス範囲機能を利用して、セルフホスト(self-managed)版 GitLab と CircleCI クラウドを IP アドレスベースでセキュアに接続する方法について紹介します。
CircleCI の IP アドレス範囲機能
通常 SaaS 型の CI/CD ツールでは、IP アドレス範囲が固定化されておらず、ファイアウォールが設定されている環境と接続するのが困難な場合があります。
CircleCI が提供する IP アドレス範囲機能を利用することによって、CircleCI で使用される 30 個の IP アドレス (一覧はこちら) のいずれかに、送信トラフィックがルーティングされるようになります。
これによって、IP アドレスベースのファイアウォールで環境を守りながら、CircleCI との通信だけを許可することができます。
IP アドレスの範囲機能で、より安心できるセキュリティを確保 | CircleCI
今回はこの IP アドレス範囲機能を利用して、以下の図のような形でセルフホスト(self-managed)版 GitLab と接続をします。
事前準備
-
セルフホスト(self-managed)版 GitLab
- Community Editon, Enterprise Edition どちらでも可能です。
- 今回は GitLab Helm Chart を利用してインストールしています。
-
CircleCI クラウド
- IP アドレス範囲機能を利用するため、Performance プランまたは Scale プランである必要があります。
セルフホスト(self-managed)版 GitLab で CircleCI の IP アドレスを許可する
まずはセルフホスト(self-managed)版 GitLab において、以下の IP アドレスを許可するように設定します。
-
- ジョブのトリガーや CircleCI と GitLab 間でのユーザーに関する情報の交換などに使用されるサービス
今回は GitLab Helm Chart を利用してインストールしているため、同時にインストールされている NGINX Ingress Controller の loadBalancerSourceRanges
を使って IP アドレスを許可します。
nginx-ingress:
controller:
service:
loadBalancerSourceRanges: [
# IP Ranges
3.228.39.90/32
18.213.67.41/32,
34.194.94.201/32,
34.194.144.202/32,
34.197.6.234/32,
...
# Core
18.214.70.5/32,
52.20.166.242/32,
18.214.156.84/32,
54.236.156.101/32,
...
helm upgrade --install gitlab gitlab/gitlab --values gitlab_config.yaml
プロジェクトのセットアップ
次に、IP アドレスを許可したセルフホスト(self-managed)版 GitLab と CircleCI を接続した上で、プロジェクトのセットアップを行います。
以下のドキュメントにある「GITLAB SELF-MANAGED」に従ってセットアップを行なってください。
IP アドレス範囲機能を有効にしたパイプラインを作成する
プロジェクトのセットアップが完了したら、IP アドレス範囲機能を有効にしたパイプラインを作成していきます。
すべてのジョブに対して IP アドレス範囲を有効にするフラグ circleci_ip_ranges: true
を追加してください。
jobs:
unit_test:
circleci_ip_ranges: true # IP アドレス範囲機能を有効
docker:
- image: cimg/node:18.14.0
steps:
- checkout
- node/install-packages
- run: npm run test:ci
設定ファイルが正しく反映されると、セルフホスト(self-managed)版 GitLab から CircleCI にパイプラインがトリガーされます。
CircleCI の UI だけではなく、GitLab の Merge Request などの UI からステータスを確認することができます。
Docker イメージのビルド・プッシュを行いたい場合(kaniko)
現在 IP アドレス範囲機能は Docker Executor のみの対応になっています。
そのため、通常は以下の理由によって Docker イメージのビルド・プッシュを行うことはできません。
-
Machine Executor(Linux VM など)を利用することができない
-
Docker Executor 内では DinD(Docker in Docker) になってしまう
しかし、Docker Executor 内であっても kaniko を利用することによって DinD(Docker in Docker) を回避することができます。
これによって、IP アドレス範囲機能を有効にした状態で、Docker イメージのビルド・各レポジトリ(Docker Hub, Amazon ECR, Azure Container Registry)へのプッシュを行うことができます。
以下は IP アドレス範囲機能を有効にした上で、kaniko を利用して Docker イメージのビルド・DockerHub へのプッシュを行なっているジョブの例です。
kaniko-build-push-docker-hub:
circleci_ip_ranges: true # IP アドレス範囲機能を有効
environment:
DOCKER_REGISTRY: docker.io
docker:
- image: gcr.io/kaniko-project/executor:debug
entrypoint: ''
steps:
- checkout
- run:
name: add Docker Hub credentials
command: |
mkdir -p /kaniko/.docker
./config.sh
mv config.json /kaniko/.docker
- run:
name: Build and Push image
command: |
/kaniko/executor \
--context "$(pwd)" \
--dockerfile "$(pwd)/Dockerfile" \
--destination "${DOCKER_REGISTRY}/tadashi0713/gitlab-kaniko:${CIRCLE_SHA1}"
詳細は以下のドキュメントを参考にしてください。
How-to: build and push Docker images with Kaniko - Tips, Tricks and Hacks - CircleCI Discuss
macOS を利用したい場合
CircleCI クラウドでは macOS VM をクラウドネイティブに利用することができ、かつIP アドレス範囲が公開されています。
これらの IP アドレス範囲を、先ほどと同じくセルフホスト(self-managed)版 GitLab で許可してあげることによって、macOS VM に接続することができます。
nginx-ingress:
controller:
service:
loadBalancerSourceRanges: [
# macOS
162.252.208.0/24,
162.252.209.0/24,
192.206.63.0/24,
162.221.90.0/24,
38.39.177.0/24,
...
- macOS のビルドは記載されてる IP アドレスに自動的に制限されます。 つまり macOS のビルドでは、
circleci_ip_ranges: true
を明示的に設定する必要がありません。
CircleCI では M1 Mac も提供されており、iOS ビルドなどのパフォーマンスを大幅に向上させることができます。
CI/CD パイプラインが M1 に対応し Apple Silicon でのビルドが可能に
注意点
-
現在 IP アドレス範囲機能は、Performance プランおよび Scale プランで利用できます。
-
現在、IP アドレス範囲機能を使用できるのは、Docker Executor (
remote_docker
を除く) のみです。 -
IP アドレスの範囲機能の利用には、この機能を有効にしたジョブで使用されるデータ 1GB につき、450 クレジットがかかります。