DataformをGCEインスタンス上のGitリポジトリとSSHで連携してみる
概要
Dataformは以下のサードパーティのリポジトリと接続することができます。
Gitプロバイダ | 接続方法 |
---|---|
Azure DevOps Services | SSH |
Bitbucket | SSH |
GitHub | SSH or HTTPS |
GitLab | SSH or HTTPS |
SaaS版のGitHubやGitLabに接続することが多いと思いますが、GCEにインストールしたサードパーティのGit(今回はGitLab)とも接続できるのかな?と思い気になったので試してみようと思ったのが今回の記事のきっかけです。
試してみたいことのイメージは以下です。
それでは実際にGCEインスタンス上に構築したGitリポジトリ(GitLab)とDataformをSSH接続できるかどうかを検証してみたいと思います。ちなみに、GitLabとはSSHまたはHTTPSにて接続が可能となっていますが今回の記事ではまずSSHでの接続を試しています。HTTPSでの接続も追って記事にします。
やってみる
Compute Engineの準備
今回はGitLabを用いるのでインストール要件を以下の公式リファレンスより確認します。
GitLabのインストール要件では4コア・4GBが最小限のコア・メモリ数とあったのでそれを踏まえて以下のスペックのGCEインスタンスを構築します。データベースは外出しせずにバンドルされているPostgreSQLをそのまま使ってもらいます。
設定項目 | 設定値 |
---|---|
マシンタイプ | e2-standard-4(4 vCPU 2コア 16GBメモリ) |
ブートディスク | 10GB |
ファイアウォール | HTTP・HTTPSトラフィックを許可する |
イメージ | Debian GNU/Linux 12 (bookworm) |
イメージはDebianにしてますが特に理由はなく個人的な好みです(4コアが最小限ってわかっているのに2コアのマシンタイプを選んでます笑)。また今回は一時的な検証用なのでdefault
VPCネットワークに作成しています。
インスタンスが作成できたらGCEのコンソールからSSHで接続します。
GitLabのインストール
インストール方法はGitLabのリファレンスのDebianの項目を参考にします。
インスタンスにSSH接続したらまずは必要な依存関係をインストールします。
sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificates perl
Postfixも必要なためインストールします(Postfixをインストールしない場合は外部SMTPサーバ設定をします)。
sudo apt-get install -y postfix
次にGitLabパッケージのリポジトリを設定します。
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash
パッケージをインストールします。EXTERNAL_URLには外部IP、または構築したGCEの外部IPをAレコードに設定したホスト名(ドメイン)を設定します。
sudo EXTERNAL_URL="https://有効なホスト名 または 外部IP" apt-get install gitlab-ee
有効なホスト名をEXTERNAL_URL
に設定した場合、GitLabは自動的にLet's Encryptを使用して証明書をリクエストしてくれます。最高です。
私は自分で管理しているドメインを用いて設定しましたので上記の通りLet's Encryptの証明書が適切に設定されていました。
外部IPをEXTERNAL_URL
に設定した場合でもエラーメッセージが出ますが特に問題なくアクセスできます。
インストール完了したらrootユーザのパスワードを確認します。
sudo cat /etc/gitlab/initial_root_password
EXTERNAL_URL
に指定したURLをブラウザに打ち込みアクセスします。GitLabのログイン画面が表示されたらインストール成功です。ユーザ名root
とパスワードを打ち込みログインしてください。
※rootユーザのパスワード変更やrootユーザ以外の普段使いのユーザ作成などの設定を本来するべきなのですが今回はDataformとの接続検証のためだけなので特に設定しません。
本番環境などの用途で構築する場合はリファレンスを参照の上セキュリティ設定を必ず実施してください。
DataformからSSHで接続するための準備
DataformからSSHでリポジトリを連携する準備をします。該当のリファレンスがあるので読み込みます。
SSH 経由でリモート リポジトリを接続するには、SSH 認証鍵と Secret Manager のシークレットを生成する必要があります。SSH 認証鍵は公開 SSH 認証鍵と秘密 SSH 認証鍵で構成されます。公開 SSH 認証鍵を Git プロバイダと共有し、秘密 SSH 認証鍵を使用して Secret Manager シークレットを作成する必要があります。次に、デフォルトの Dataform サービス アカウントとシークレットを共有します。
・・・GCEでSSH認証鍵を作成してSecretManagerに登録してね、という理解をしました。
ざっくりとした流れとしては以下となります。
- GitLabでSSH認証鍵を作成
- GitLabリポジトリに公開鍵をアップロード
- Secret Managerに秘密鍵を登録
- Dataformのサービスアカウントに
roles/secretmanager.secretAcessor
ロールを付与 - Dataform側で作業
それではまずGitLab側でSSH認証鍵を生成します。
以下のコマンドでED25519 SSH鍵を生成します。
ssh-keygen -t ed25519
保存先やパスフレーズを聞かれますが何も入力せずにEnterを推します(入力いただいてもかまわないです)
デフォルトではホームディレクトリ配下に.ssh
ディレクトリが作成され、そこに以下のように公開鍵(.pub)と秘密鍵が生成されています。
id_ed25519 id_ed25519.pub
公開鍵(id_ed25519.pub)をcatコマンドなどで開くなどしてコピーします。
鍵をコピーできたら、GitLabのEdit profile
の画面へ移動します。
SSH Keys
> Add new key
を押下して公開鍵登録画面へ遷移し、先ほどコピーした鍵を貼り付けます。
貼り付け後はAdd key
を押下して登録します。
Google Cloud側の作業
次にGoogle Cloud のSecret Managerのコンソールを開きます。
シークレットを作成を押下します。
GCEで作成した秘密鍵(id_ed25519ファイル)の内容をコピーしておき、シークレットの値
のところへ貼り付けます。名前は適当な名前を設定します。他の項目は全てデフォルトのまま作成します。
続いてDataformのサービスアカウントにroles/secretmanager.secretAcessor
ロールを付与しておきます(手順は割愛します)。
また、適当な名前でGitLabのリポジトリを作成しておきます。
作成したリポジトリのSSHのリンクをコピーします。
Dataformのリポジトリを適当な名前で作成して、SETTINGS
を開きます。
GITと接続
を押下します。
プロトコルはSSH
を選択、リモートのGitリポジトリのURL
には先ほど作成したリポジトリのSSHのURLを貼り付けます。
シークレットにはSecret Managerで作成したものを、ホストのSSH公開鍵のKey-Value
にはid_ed25519.pub
の内容を貼り付けます※(コメントの部分root@〜
は不要)。
※SSH公開鍵のKey-Value
ssh-keyscan
で作成するでよいと思います。作成結果に含まれるホスト名は不要です。
ssh-keyscan -t ed25519 <gitlab-host>
リポジトリと繋がっているか確認する
確認のためDataformの開発ワークスペースを適当な名前で作成します。
GitLabのリポジトリで作成されたREADMEがワークスペース内で確認できました。無事GitLabと接続できているようです。
せっかくなので適当なファイルを作成してCOMMITしてPUSHしてみます。
GitLab側を確認してみます。
PUSHした内容が連携されていました。Dataformと接続できていることが確かに確認できました。
補足
今回のVPC/GCEインスタンスはSSH接続を全てのIPから許可していますがこれはあくまで検証用に一時的に使っているだけで、本番運用には避けなくてはならないものです。
セキュアに運用するためには、DataformのEgress IPのみを許可する形などの運用が良いと考えられます(Egress IPはリファレンスに記載されいてるフォームから登録すると知ることができるようです。検証しておらず恐縮丸です)。
Note: Connecting a Dataform repository to a remote repository can fail if the remote repository is not open to the public internet, for example, if it is behind a firewall. You can fill out the Dataform egress IPs fixed ranges waitlist form to sign up for updates about consistent egress IP addresses in Dataform, which enable connections to protected remote repositories.
引用:https://cloud.google.com/dataform/docs/connect-repository#gitlab
また、検証が終わりましたらGCEのインスタンスの削除を忘れないようにしてください。
所感
わかったこと。
- DataformはGCEインスタンス上のGitLabにSSH接続できる
リファレンスに従えば、とくに詰まるところはなくインストールや鍵の生成、登録、Dataformとの接続ができました。
今回の目標であるDataform <-> GCE上のGitの接続も確認できてよかったです。今回はGCEインスタンスのGitと連携していますが、オンプレミスや他のクラウドでもDataform接続元IPを注意すれば接続は問題なくできるのかなと思います。
次はHTTPSでの接続も試してみたいと思っています。
それでは、また。ナマステー