|

ABC DX Tech Internship 2024 参加者募集中!ぜひご応募ください!

2024-05-23

データ関連

DataformとGitHubリポジトリをSSH接続する手順とハマったところ

DataformGitHub

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のリポジトリでやるべきことは以下の通りです

  1. (マシン用のユーザーがない場合のみ)GitHub等のサービス側でマシン用アカウントを作成する

  2. マシン用アカウントのためにSSH鍵のペアを作成する

  3. マシン用アカウントにSSH鍵を登録する

  4. Google CloudのSecret ManagerにSSH秘密鍵を登録する

  5. シークレットアクセサーの権限を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キーの作成」というメニューが表示されて驚きました。そのままアルゴリズム指定して鍵を作って保存が出来たのでめちゃくちゃ便利です。 Image_2024-05-09_17-52-27

(まあ、人生で何回使うかはわかりませんが…)

 

マシン用アカウントにSSH鍵を登録する

作ったら公開鍵をリポジトリサービス側に登録しましょう。

チームで使用している何らかのパスワード管理ツール等への保存もしておくと良いと思います。

 

Google CloudのSecret ManagerにSSH秘密鍵を登録する

Google Cloud側には秘密鍵を登録します。

Secret Managerを開いて、「シークレットを作成」を選びます。 Secret_Manager__セキュリティ__MIERUNGER__Google_Cloud_コンソール_2024-05-09_17-55-14

あとは、適当に名前を付けて、シークレットの値に秘密鍵を貼り付けるだけです。 シークレットの作成__セキュリティ__MIERUNGER__Google_Cloud_コンソール_2024-05-09_17-57-23

有効期限やローテーション期間の設定も可能ですので、そのあたりは組織のガバナンスに照らし合わせて設定しましょう。

 

シークレットアクセサーの権限をDataformのサービスアカウントに渡す

ここで一つ目のハマりポイントです。公式ドキュメントにも書いていますが、

service-[PROJECT_NUMBER]@gcp-sa-dataform.iam.gserviceaccount.com

にシークレットアクセサーの権限を与えてください。( [PROJECT_NUMBER] のところにはプロジェクト番号を入れる)

 

権限付与はシークレット単位で行えるので、先ほど設定したシークレットを開いて「権限」タブから付与します。 Untitled

 

以上で前準備は完了です。

 

Dataformでの作業

ここまで準備が出来たらあとはDataformから接続設定を行うだけです。

Dataformの設定画面から設定を行います。 Image_2024-05-09_18-13-54

ここのポイントは、最後の「ホストのSSH公開鍵のKey-Value」です。

 

まず、この値の取得先ですが、

となります。

 

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とリポジトリの接続も安定したのでやってよかったと思います。

 


この記事の著者

プロフィール画像

伴 拓也

朝日放送グループホールディングス株式会社 DX・メディアデザイン局 デジタル・メディアチーム

アプリケーションからインフラ、ネットワーク、データエンジニアリングまで幅広い守備範囲が売り。最近はデータ基盤の構築まわりに力を入れて取り組む。 主な実績として、M-1グランプリ敗者復活戦投票システムのマルチクラウド化等。