DataformからGitHubにSSH接続したいけど繋がらない場合は…
Dataformとリポジトリ接続
データ基盤にガバナンスを効かせたければやはりdbtなのか、Dataformなのか…が必要だと思います。
どちらがいいか…は使っているプロダクト次第なところがありますが、BigQueryを使っているとやはりDataformを選ぶ組織も多いのではないでしょうか。
こういったツールを使うメリットの一つに「バージョン管理が出来ること」は間違いなく入ってくるでしょう。品質担保には欠かせないものです。
Dataformも基本的には3rd Partyのリポジトリと接続する使い方が前提かなと思います。PRやMRも活用できるのもいいですね。
というわけで、弊社でも基本的にGitHubリポジトリと接続しています。
もともとはHTTPSで接続していたのですが、最近なぜかgRPCのエラーで接続に失敗することが増えてきたのでSSHに切り替える作業を行いました。
(突然頻繁に google.api_core.exceptions.InvalidArgument: 400 The remote repository https://github.com/***.git closed connection during remote operation.
とか言われるようになりました😣)
その際に、思いのほか手こずったので、DataformからSSHに切り替える方法についてまとめていきます。
ちなみに本内容の公式ドキュメントは「サードパーティの Git リポジトリに接続する」となります。
あわせて参照しておくべきです。(この記事に辿り着いているころにはもう一読してるわ、という感じかもですが)
GitHub側(3rd Partyのリポジトリ側)作業
3rd Partyのリポジトリでやるべきことは以下の通りです
-
(マシン用のユーザーがない場合のみ)GitHub等のサービス側でマシン用アカウントを作成する
-
マシン用アカウントのためにSSH鍵のペアを作成する
-
マシン用アカウントにSSH鍵を登録する
-
Google CloudのSecret ManagerにSSH秘密鍵を登録する
-
シークレットアクセサーの権限をDataformのサービスアカウントに渡す
順に見ていきます。
(マシン用のユーザーがない場合のみ)GitHub等のサービス側でマシン用アカウントを作成する
これは先ほどの公式ドキュメントにも
警告: 秘密 SSH 認証鍵は、対応するサービス アカウントを使用するすべての Dataform ユーザー間で共有されます。Git プロバイダでマシンユーザーを作成し、Dataform で使用する予定のリモートの Git リポジトリに対するユーザーのアクセスを制限することをおすすめします。鍵を使用してリポジトリを接続できるのは、Google Cloud プロジェクトのオーナーと、Dataform 管理者ロールを持つ Dataform ユーザーのみです。ただし、Dataform ユーザーは鍵自体を表示できません。
と記載があるとおりです。
PR自動作成の際の投稿者として使えたりとかもするので、一個持っておくと良いと思います。
マシン用アカウントのためにSSH鍵のペアを作成する
これはそのままです。
「気付けばssh-keygen -t の後にrsaでなくed25519と打つことが推奨されていた」の記事の通り、2024年現在のデファクトスタンダードはed25519ですのでed25519で作ると良いと思います。
余談ですが、1Passwordなら、GitHubのSSHの登録画面で「SSHキーの作成」というメニューが表示されて驚きました。そのままアルゴリズム指定して鍵を作って保存が出来たのでめちゃくちゃ便利です。
(まあ、人生で何回使うかはわかりませんが…)
マシン用アカウントにSSH鍵を登録する
作ったら公開鍵をリポジトリサービス側に登録しましょう。
チームで使用している何らかのパスワード管理ツール等への保存もしておくと良いと思います。
Google CloudのSecret ManagerにSSH秘密鍵を登録する
Google Cloud側には秘密鍵を登録します。
Secret Managerを開いて、「シークレットを作成」を選びます。
あとは、適当に名前を付けて、シークレットの値に秘密鍵を貼り付けるだけです。
有効期限やローテーション期間の設定も可能ですので、そのあたりは組織のガバナンスに照らし合わせて設定しましょう。
シークレットアクセサーの権限をDataformのサービスアカウントに渡す
ここで一つ目のハマりポイントです。公式ドキュメントにも書いていますが、
service-[PROJECT_NUMBER]@gcp-sa-dataform.iam.gserviceaccount.com
にシークレットアクセサーの権限を与えてください。( [PROJECT_NUMBER]
のところにはプロジェクト番号を入れる)
権限付与はシークレット単位で行えるので、先ほど設定したシークレットを開いて「権限」タブから付与します。
以上で前準備は完了です。
Dataformでの作業
ここまで準備が出来たらあとはDataformから接続設定を行うだけです。
Dataformの設定画面から設定を行います。
ここのポイントは、最後の「ホストのSSH公開鍵のKey-Value」です。
まず、この値の取得先ですが、
-
Bitbucket: 「Configure SSH and two-step verification」の「SSH Host Keys」の項目
known_hosts
の書式を得るにはcurl https://bitbucket.org/site/ssh
とコマンドを走らせるのが一番速いです。
-
GitHub: 「GitHub's SSH key fingerprints」のページ
- アルゴリズムごとに
known_hosts
の書式も記載があります。
- アルゴリズムごとに
-
GitLab: 「SSH known_hosts entries」のページ
- こちらもアルゴリズムごとに
known_hosts
の書式も記載があります。
- こちらもアルゴリズムごとに
となります。
Google Cloudの公式ドキュメントに重要な記載がありまして、
known_hosts
の書式で…と書いてあるのに加えて、 「ただし、次の形式でホスト名や IP はありません。」 と記述してあります。
形式というのがこれです。
ALGORITHM BASE64_KEY_VALUE
ここを目を通していたにも関わらずスルーしてしまって、少しハマりました。
要するに、 github.com
のような冒頭のホスト名は消せよ、ということですね。
GitHubで、ed25519であれば、
github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl
ではなく
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl
を登録すれば良いということになります。
最初はなんで繋がらないんだ…と頭を抱えていましたが、終わってみればこんなことか…となりますね。
だいたいのトラブルがそうなんですけどね。
まとめ
今回はDataformからGitHub等のリポジトリサービスにSSH接続する際の設定方法についてまとめてみました。
「公式ドキュメントにはちゃんと目を通す、少しでもトラブったらとにかく公式ドキュメントに目を通す」 これに尽きますね。
また、known_hosts
についてもあまり普段真面目に目を通さないので(初回接続時にyを押して終わりみたいな形になりがち)、考えるきっかけけになったりもしました。
ちなみに変更自体の結果としてはSSH接続にしてからDataformとリポジトリの接続も安定したのでやってよかったと思います。