- 公開日
- 最終更新日
AWS SAM プロジェクトのコミット前チェックを pre-commit で自動化してみた
この記事を共有する
目次
はじめに
前回、AWS Lambda(以下、Lambda)の Python コードに ruff を導入しました。
ところが、しばらく使ってみて困ったことがあります。実行するのを忘れるのです。
そこで pre-commit というフレームワークを導入しました。
やってみると ruff だけでなく、AWS Serverless Application Model(以下、SAM)のテンプレート検証まで同じ仕組みに載せられたので、その話を書きます。
pre-commit とは
pre-commit は、git commit の直前に決めたコマンドを自動実行してくれるツールです。
Git には元々フックという仕組みがあり、.git/hooks/ にスクリプトを置けば同じことができます。
ただし .git/ はリポジトリに含まれないため、他の人が clone しても設定が共有されません。
pre-commit は設定をファイルとしてリポジトリに置けるので、この問題が起きません。
インストールは以下のコマンドです。
pip install pre-commit
設定ファイルを書く
リポジトリ直下に .pre-commit-config.yaml を置きます。
まずは ruff だけの最小構成です。
repos:
- repo: local
hooks:
- id: ruff-lint
name: ruff (lint)
entry: ruff check src
language: system
pass_filenames: false
types: [python]
- id: ruff-format
name: ruff (format check)
entry: ruff format --check src
language: system
pass_filenames: false
types: [python]
設定したら以下のコマンドでフックを有効にします。
pre-commit install
これ以降、git commit を実行すると自動でチェックが走ります。
問題があればコミットが中断されるので、気づかないまま壊れたコードを積み重ねることがなくなりました。

書き方で 2 つ補足します。
フォーマッタ側には --check を付けます。
これを付けると、ファイルを書き換えずに「整形が必要かどうか」だけを判定します。
コミットの最中にファイルの中身が勝手に変わると、コミット対象と実際の内容がずれて混乱するためです。
pass_filenames: false は、変更されたファイルだけでなく指定したディレクトリ全体を対象にする指定です。
Lambda の関数は互いに独立しているように見えて共通のレイヤーを参照していることがあるため、全体を見た方が安全でした。
ruff 以外のチェックも載せる
pre-commit の便利なところは、コマンドとして実行できるものなら何でも登録できる点です。
ruff だけで終わらせるのはもったいないので、他のチェックも足しました。
最終的に以下の 5 種類を登録しています。
- ruff -- Python のリンターとフォーマッタ
- pyright -- Python の型チェック
- pytest -- ユニットテスト
- cfn-lint -- AWS CloudFormation テンプレートの静的チェック
- sam validate -- SAM テンプレートの検証
後半 2 つが SAM プロジェクトならではの部分です。
設定は以下のように追記します。
- id: cfn-lint
name: cfn-lint (CloudFormation)
entry: cfn-lint template.yaml
language: system
pass_filenames: false
files: \.(yaml|yml)$
- id: sam-validate
name: sam validate (SAM template)
entry: sam validate --region ap-northeast-1
language: system
pass_filenames: false
files: ^template\.yaml$
files で対象ファイルを絞っている点がポイントです。
Python だけを直したコミットで SAM テンプレートの検証まで走ると、待ち時間が無駄になります。
types: [python] と files を使い分けて、関係するファイルが変わったときだけ動くようにしています。
この 2 つを入れておくと、テンプレートの書き間違いをデプロイ前に見つけられます。
CloudFormation のエラーはスタックを流してから気づくことが多く、そこまでの待ち時間が無駄になるので、手元で止められる価値は大きいです。

まとめ
今回は pre-commit を導入し、コミット前に ruff・型チェック・テスト・テンプレート検証が自動で走るようにしました。
一番よかったのは、ruff 以外のチェックも同じ仕組みに載せられたことです。
特に SAM テンプレートの検証を手元で回せるようになり、デプロイしてから間違いに気づく回数が減りました。
ツールを入れる作業よりも、入れたものを実行し続ける仕組みを作る方が大事だと感じています。
同じように導入したツールが使われないまま眠っている方の参考になれば幸いです。
この記事は私が書きました
野間 太一
記事一覧猫とCloudFormationが好きです。