ENGINEER BLOG ENGINEER BLOG
  • 公開日
  • 最終更新日

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 を実行すると自動でチェックが走ります。
問題があればコミットが中断されるので、気づかないまま壊れたコードを積み重ねることがなくなりました。

pre-commit-check1.png

書き方で 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-check2.png

まとめ

今回は pre-commit を導入し、コミット前に ruff・型チェック・テスト・テンプレート検証が自動で走るようにしました。

一番よかったのは、ruff 以外のチェックも同じ仕組みに載せられたことです。
特に SAM テンプレートの検証を手元で回せるようになり、デプロイしてから間違いに気づく回数が減りました。

ツールを入れる作業よりも、入れたものを実行し続ける仕組みを作る方が大事だと感じています。
同じように導入したツールが使われないまま眠っている方の参考になれば幸いです。

この記事は私が書きました

野間 太一

記事一覧

猫とCloudFormationが好きです。

野間 太一

この記事を共有する

クラウドのご相談

CONTACT

クラウド導入や運用でお悩みの方は、お気軽にご相談ください。
専門家がサポートします。

サービス資料ダウンロード

DOWNLOAD

ビジネスをクラウドで加速させる準備はできていますか?
今すぐサービス資料をダウンロードして、詳細をご確認ください。