Dataformのコンパイル時にDataformがGitリポジトリと接続できない場合の動作を観察してみた
概要
Dataformはサードパーティのリポジトリと接続することができますが、この場合はGCEやオンプレミスのサーバにインストールしたGit(GitHubやGitLabなど)でも接続することができます。
しかしながらGCEやオンプレミスにGitをインストールしてそのGitリポジトリと連携した場合は当然SaaS版とは異なり自身で可用性・冗長性を担保する必要があります。
Dataformはリポジトリ、ワークスペースのプログラムをコンパイルして実行するという点、またコンパイル結果は24時間で期限切れとなってしまいます。
よって自身でGitサーバを管理してDataformを本番運用している場合はリポジトリの可用性も重要なポイントになると考えます(内蔵GitやSaaSのGitを用いている場合はあまり意識しなくてよいかと)。
気になったのはGitサーバがダウンしている時にコンパイルをするとどんな動作をするかという点です。
前置きが長くなりましたが今回の記事ではDataformと連携しているGitサーバがダウンしている場合にコンパイルを行うとどうなるのかを実際に観察してみました。
興味がありましたら読んでみてください。
やってみる
※DataformとGCE上にインストールしたGit(今回はGitLabを用いています)は連携している前提です。
イメージは以下となります。
Dataformの連携設定はすでに実施しています。
GitをホスティングしているGCEインスタンスを停止させます。
インスタンスが停止しているので当然Gitリポジトリへはアクセスできません。この状態でコンパイルをしてみます。
コンパイルは以下のREST APIで実行します。
Method: projects.locations.repositories.compilationResults.create
curlで叩きます。
curl -X POST "https://dataform.googleapis.com/v1beta1/projects/プロジェクトID/locations/asia-northeast1/repositories/リポジトリ名/compilationResults" \
--header "Authorization: Bearer $(gcloud auth print-access-token)" \
--header "Content-Type: application/json" \
--data '{"gitCommitish":"main"}'
プロジェクトIDやリポジトリ名は各環境の値にします。
叩いた結果は以下でした。
{
"error": {
"code": 400,
"message": "Remote repository 'git@リポジトリURL/プロジェクト名.git' could not be reached.",
"status": "INVALID_ARGUMENT"
}
}
HTTPステータスコード400(Bad Request)
となりました。
もう少し確認したいので今度はDataformのコンソールからワークスペース作成をしてみます。
ワークスペース作成を行うとやはりエラーメッセージが表示されてしまいました。
API リクエスト エラー: Remote repository 'git@***/***.git' could not be reached.
Logginで見てみます。
Remote repository 'git@***/***.git' could not be reached.
先ほどと同様のエラーログが出力されていますね。
念の為インスタンスを起動して正常系も確認します。
先ほどと同じくcurlで叩きます。
curl -X POST "https://dataform.googleapis.com/v1beta1/projects/プロジェクトID/locations/asia-northeast1/repositories/リポジトリ名/compilationResults" \
--header "Authorization: Bearer $(gcloud auth print-access-token)" \
--header "Content-Type: application/json" \
--data '{"gitCommitish":"main"}'
今度はちゃんとコンパイルされました。
{
"name": "projects/プロジェクトID/locations/asia-northeast1/repositories/リポジトリ名/compilationResults/a8c54d8b-d91a-4f1e-b58e-0c7633dd415f",
"gitCommitish": "main",
"codeCompilationConfig": {
"defaultDatabase": "***",
"defaultSchema": "dataform",
"defaultLocation": "asia-northeast1"
},
"dataformCoreVersion": "2.8.3",
"resolvedGitCommitSha": "53730f2714e2c2f8e1db23385cd99a0c8e1c9e4d",
"createTime": "2024-10-10T13:36:31.727278643Z"
}
GCEが起動している状態でGitを停止させてみた場合も確認してみます。
今回使っているGitはGitLabなので以下のコマンドで停止しました。
sudo gitlab-ctl stop
curlを叩きます。
{
"error": {
"code": 400,
"message": "Remote repository 'git@リポジトリURL/プロジェクト名.git' could not be reached.",
"status": "INVALID_ARGUMENT"
}
}
サーバが停止している時と同様でした。
まとめ
結果を表にすると以下となります。
状態 | パターン | 結果 |
---|---|---|
GCEが停止 | コンパイル | Remote repository 'git@/.git' could not be reached |
Gitが停止 | コンパイル | Remote repository 'git@/.git' could not be reached |
GCEが停止 | ワークスペース作成(Dataformの画面) | API リクエスト エラー: Remote repository 'git@/.git' could not be reached |
GCEが停止 | ワークスペース作成(Logging) | Remote repository 'git@/.git' could not be reached |
上記よりGitリポジトリをホスティングしているサーバが停止していてDataformがリポジトリと接続できない時はHTTPステータスコード400(Bad Request)
・Remote repository 'git@***/***.git' could not be reached.
が帰ってくるということが確認できました。
サーバ再起動中やその他様々な障害の時はまた異なった結果かもしれませんが一旦は上記を確認できて満足です。
この記事が何かの役に立てば嬉しいです。
それではまた。ナマステー
参考