はじめに
AWS CodeCommit環境において、SQLFluffとAWS CodeBuildを組み合わせて、PR時にSQLのフォーマットチェックを自動化(CI)する仕組みを構築しました。その手順と設定のポイントをご紹介します。
解決したかった課題とアプローチ
課題:
- レビューにおいて「ロジック」ではなく「フォーマットの揺れ」の指摘に無駄な工数がかかっている。
解決策:
- 「機械的に直せるものは機械に任せる」方針に変更。
- PR作成時に自動でフォーマットチェックを走らせ、ルール違反があればCIを落とす。
- レビュアーは「CIが通った(見た目が整った)コード」のロジック確認にのみ集中する。
実装ステップ
1. ルールブックの作成(.sqlfluff)
まずは「プロジェクトのSQLはこう書く」というルールを明文化します。プロジェクトのルートディレクトリに.sqlfluffを作成します。
今回は私の強いこだわりである「末尾カンマ(trailing comma)の徹底」を設定しつつ、GROUP BYの指定は数字でも項目名でもOKとする柔軟なルールにしました。
[sqlfluff] # お使いのDWHに合わせて変更(今回はRedshift) dialect = redshift templater = dbt exclude_rules = None [sqlfluff:templater:dbt] project_dir = . [sqlfluff:indentation] tab_width = 4 indented_ctes = True # AS句を必須にしてエイリアス漏れを防ぐ [sqlfluff:rules:aliasing.table] aliasing = explicit [sqlfluff:rules:aliasing.column] aliasing = explicit # キーワードは大文字、識別子は小文字に統一して可読性アップ [sqlfluff:rules:capitalisation.keywords] capitalisation_policy = upper [sqlfluff:rules:capitalisation.identifiers] capitalisation_policy = lower # ★最重要:カンマは必ず「末尾(trailing)」にする [sqlfluff:rules:layout.commas] line_position = trailing # GROUP BY 1, 2 などの数字指定を許可する [sqlfluff:rules:ambiguous.column_references] group_by_and_order_by_style = implicit
ポイント: templater = dbt を指定することで、{{ ref('...') }} などのdbt特有のJinja記法でパースエラーが起きるのを防ぎます。
2. CIの実行指示書の作成(buildspec.yml)
GitHub Actionsの ci.yml に相当するものを、AWS環境では buildspec.yml として作成します。これもルートディレクトリに配置します。
version: 0.2
phases:
install:
runtime-versions:
python: 3.9
commands:
- echo "Installing SQLFluff and dbt-redshift..."
# dbtプラグイン込みでインストール
- pip install dbt-redshift sqlfluff-templater-dbt
pre_build:
commands:
- echo "Checking versions and initializing dbt..."
- sqlfluff --version
- dbt --version
- dbt deps
build:
commands:
- echo "Running SQLFluff Lint..."
# models/ 配下の全SQLをチェック。エラーがあればここでビルド失敗(CIが落ちる)
- sqlfluff lint models/
3. AWS上でのCI/CDパイプライン構築
設定ファイルが準備できたら、AWSコンソールでこれらを動かす設定を行います。
- AWS CodeBuildの作成:
- ソースとして対象のCodeCommitリポジトリを指定。
- 環境は
Amazon Linux 2の標準イメージを選択。 - Buildspecは「buildspec ファイルを使用する」を選択。
- Amazon EventBridgeでトリガー設定:
- メンバーがPRを出した瞬間にCodeBuildを起動させるため、EventBridgeでルールを作成します。
- 「CodeCommit Pull Request State Change」イベント(
pullRequestCreatedやpullRequestSourceBranchUpdated)をトリガーにして、先ほどのCodeBuildをターゲットに指定します。
運用方法とチームへの浸透
この仕組みを入れた後、チームメンバーには以下のようにアナウンスしました。
「PR作成時に自動でSQLのフォーマットチェックが走ります。失敗した場合は、手元で
sqlfluff fix models/を実行して自動修正してから再度レビュー依頼をしてください」
この fix コマンドが非常に優秀で、細かいインデントやカンマの位置をルール通りに自動で直してくれます。
おわりに
この仕組みを導入したことで、PRを開いた瞬間に「あ、カンマが前になってる…」と指摘するストレスから解放されました。レビュアーは純粋なデータモデリングや集計ロジックの正しさに集中できるようになり、結果的に自分の開発タスクの時間を守ることにも繋がっています。
「dbtの知見が偏っている」「レビューに時間がかかりすぎている」と悩んでいるチームには、SQLFluffによる自動チェックの導入を強くおすすめします!


