これはエムスリーAdvent Calendar 2023 の10日目の記事です。
こんにちは、エンジニアリンググループの石塚です。最近は年明けに控えている結婚式という大イベントに向けてダイエット中でスポーツジムへ通い、有酸素運動するのと並行して食事制限をして追い込んでいる毎日です。2ヶ月ほどで6kg弱の減量を目標に地道に日々目標をスプレッドシートにまとめながら追い込んでます。(今の所良いペースです。)
今回は、弊社で利用しているLookerというBIツールを利用しているなかで発生したつらみの共有と対策について共有します。少しニッチな内容ですが、自分自身が調べているときに同事象で苦しんでいるようなブログ記事が見当たらなかったこともあり、ニッチな人を対象に有益な内容になれば幸いです。
Lookerとは?
LookerはGoogle Cloudが提供するBIツールになります。エムスリーで活用しているBIツールのひとつとしてLookerを採用し顧客向けにダッシュボードを提供しております。LookerではLookML(Looker Modeling Language)という独自の言語を用いてデータモデルやダッシュボードの定義をコードで管理ができます。エムスリーではGitLabと連携してバージョン管理を実現しております。より詳しいアーキテクチャについては以の 「LookerによるダッシュボードのアーキテクチャとTerraform providerの実装と運用」 のブログを参照ください。 www.m3tech.blog
デプロイに成功したのに想定のバージョンがデプロイされていない?
前述の通りLookMLをGitLabでバージョン管理をしており、指定ブランチへのマージをトリガーにWebhookでデプロイされる仕組みになっておりました。普段と変わらず追加機能をリリースしWebhookでのデプロイも異常なく完了したためリリース周知をして関係者に対象機能の確認を依頼したところ、「機能追加が反映されていないようです。ご確認をお願いできますでしょうか?」とslackでメンションが飛んできました。
確認したこと
◯BigQuery上のデータの確認
LookerではBigQuery上のデータを参照しているのでデータ自体に問題があるかをまずは確認しました。ただしこれは問題なし。Looker側からの参照がうまくできていないことが判明。
◯Webhookログの確認
GitLabのWebhookのメニューから指定ブランチをトリガーに実行されたWebhookの実行ログを確認しました。ログ上は正しく実行されており、before/afterのgit commit hashがログから確認できました。この段階ではWebhookが正常しているので何故状態。
◯Deployment Managerを確認
Lookerの管理画面にあるDeployment Managerを確認しました。ここではDeployされているgit commit hashの先頭7桁が確認することでき、これがWebhookログに記載のcommit hashと一致しておりませんでした。Webhookを手動で再実行しても状況は変わらず。。。
◯Test Git Connectionを確認
Lookerの管理画面からTest Git Connectionを実行してGit接続を確認しました。下記キャプチャが当時のGit接続テストの実行結果になります。なんか赤い。。。
Git連携で問題があることが判明したので、keyを再発行してGit接続を再設定しました。その後Webhookを再送してDeployment Managerを確認するとWebhookログにあるafterのgit commit hashでデプロイされるようになりめでたしめでたしとなりました。
防止策
めでたしめでたしで終わらせずに対策を考えましょう。LookerはAPIを提供しており様々な操作や情報の取得をAPIを利用して実現可能となっております。その中で使えそうなAPIを探していると良さげなAPIが存在しました。
Get Project Workspace
Looker API Interactive Reference
このAPIでは引数で指定したプロジェクトに関する情報が取得できます。その中に「git_head」 というフィールドがあり、これが現在デプロイされている最新のgit commit hashになります。以下のようなプログラムでGitLab側のgit commit hashと比較し、異なる場合はraise Exceptionをするというシンプルなプログラムを作成しました。
import looker_sdk import os def main(): sdk = looker_sdk.init40() commit_sha = os.environ.get('CI_COMMIT_SHA') # ref.https://developers.looker.com/api/explorer/4.0/types/Project/ProjectWorkspace?sdk=py project_info = sdk.project_workspace(project_id='hoge-bi', fields='git_head') looker_git_head = project_info.get('git_head') print(f'commit_sha : {commit_sha}') print(f'looker_git_head : {looker_git_head}') if commit_sha != looker_git_head: raise Exception(f'There are differences between the commit sha and the looker git head.' f' commit sha : {commit_sha}, looker git head : {looker_git_head}') print('There are no differences between the commit sha and the looker git head.') if __name__ == '__main__': main()
元々はGitLabのWebhookの設定からLooker Webhook Deployの設定をしていたのですが、Deploy後に上のプログラムを実行させるという依存関係を作る必要があるのでgitlab-ciのstageを分けることで依存関係を実現させました。
stages: - apply - postprocess .master-branch-apply-rules: rules: - if: '$CI_COMMIT_REF_NAME == "master" && $CI_PIPELINE_SOURCE != "schedule"' changes: - $RULES_CHANGES_PATH deploy_looker_qa: extends: - .master-branch-apply-rules variables: RULES_CHANGES_PATH: hoge_bi/**/* stage: apply image: alpine before_script: - apk add --upgrade curl - export LOOKER_PROJECT=hoge-bi script: - set -eu - curl -fsSL -H "X-Gitlab-Token:${LOOKER_QA_WEBHOOK_SECRET}" "https://hogehoge.cloud.looker.com/webhooks/projects/${LOOKER_PROJECT}/deploy/ref/${CI_COMMIT_SHA}" check_looker_git_head_qa: extends: - .master-branch-apply-rules variables: RULES_CHANGES_PATH: hoge_bi/**/* stage: postprocess image: python:3.11 before_script: - export LOOKERSDK_BASE_URL="https://hogehoge.cloud.looker.com" - export LOOKERSDK_CLIENT_ID=${LOOKER_QA_CLIENT_ID} - export LOOKERSDK_CLIENT_SECRET=${LOOKER_QA_CLIENT_SECRET} - cd hoge_bi/scripts/check_looker_git_head - pip install poetry && poetry install script: - poetry run python check_looker_git_head.py
これでデプロイエラーが発生した場合は検知ができるようになりました。めでたしめでたし。
その他Looker APIの紹介
その他のLooker APIに関する紹介になります。
Run Git Connection Test
Looker API Interactive Reference
デプロイエラーが発生した際の確認でLooker管理画面から実行していたTest Git Connectionの実行ができるAPIになります。これも防止策で使うAPIの案には上がったのですが、git commit hashを見るのが確実だとなったので不採用になりました。
terraform-provider-looker
GitHub - hirosassa/terraform-provider-looker: Terraform Provider for managing Looker
これはAPIではなくlookerを操作するためののterraform providerプラグインになります。便利に利用しているterraformの裏ではLooker APIがたくさん使われております。弊社ではこのプラグインを利用してLookerのセットアップを管理しております。
まとめ
以上、LookerのDeploy時に発生した想定外のエラー内容とその防止策についてでした。エラーが起きても一つずつ調査をして再発防止を進める、この繰り返しがサービスをブラッシュアップさせていくなと改めて感じました。
We are Hiring
エムスリーではエンジニアを募集中です。ハードスキル、ソフトスキル共にハイレベルなメンバーに囲まれた環境で日々成長を実感しております。 少しでもご興味を持った方は、以下ページよりカジュアル面談等に申し込み頂ければと思います!