今日は、Pulumi を使って開発しているときに誰もが一度は発狂しそうになる「あの瞬間」をなくすための、ちょっとした(でも効果絶大な)TIPSをシェアしたいと思います。
こんな経験ありませんか?
気合を入れて書いたインフラコード。
「よし、これで完璧だ!」と意気揚々とコマンドを叩きます。
$ pulumi up
Pulumi がクラウドの認証情報を読み込み、現在のスタックの状態を確認し、依存関係を計算し……(ここで数分経過)。
コーヒーを一口飲んで画面に戻ると、そこには無情な赤い文字が。
SyntaxError: unexpected EOF while parsing
……えっ、そこ?
括弧を一個閉じ忘れただけ? そのために今の3分間待ってたの?
この「実行してみないとミスがわからない」という状況は、精神衛生上よろしくありません。特に Pulumi のような IaC (Infrastructure as Code) ツールは、実行=クラウドへのアクセスが発生するため、どうしても初動が重くなりがちです。
そこでオススメしたいのが、Python 標準の py_compile を使った事前チェックです。
救世主「py_compile」とは
py_compile は、その名の通り Python ファイルをバイトコード(.pyc)にコンパイルするモジュールです。
通常は Python が実行時に勝手にやってくれることですが、これを手動でやることで、「コードを実行せずに(=クラウドに繋ぎに行かずに)」 文法ミスだけを炙り出すことができます。
いわば、「提出ボタンを押す前の赤ペン先生」 です。
使い方は超シンプル
特別なツールのインストールは不要です。Python が入っていればすぐに使えます。
1. 単一ファイルをチェックしたい時
一番手軽な方法です。
python -m py_compile __main__.py
何も表示されなければ、文法は完璧です(おめでとうございます!)。
もしミスがあれば、即座に(本当に0.1秒で)エラー箇所を指摘してくれます。
2. プロジェクト全体をまとめてチェックしたい時
Pulumi プロジェクトが複数のファイルに分かれている場合は、compileall という親戚を使うのが便利です。
# ドット(.) はカレントディレクトリの意味 # -q をつけるとエラーの時だけ喋ってくれるので静かで良いです python -m compileall . -q
これを pulumi up の前に一発叩くだけ。これだけの習慣で、あの無駄な待ち時間がゼロになります。
ここが素晴らしい!3つのメリット
- とにかく速いクラウドへのAPIリクエストが発生しないので、一瞬で終わります。「待ち時間」という概念がありません。
- 安全(これ重要)コードを「実行」するわけではないので、間違って変なリソースを作ってしまったり、設定を上書きしてしまうリスクが皆無です。
- 環境を汚さないLinter ツールなどを別途入れなくても、Python 標準機能だけで完結するのが地味に嬉しいポイントです。

↑ 上記は通常のフローとpy_compileを利用した場合でのイメージ図です。
ただし「万能」ではありません
py_compile はあくまで「文法チェック」です。
「インデントがおかしい」「括弧が足りない」といったミスは見つけてくれますが、以下のようなミスはスルーしてしまいます。
import pulumii(ライブラリ名のタイポ)bucket = s3.Bucket(bucket_name)(未定義の変数の使用)
これらは文法的には間違っていないからです。
なので、「まずは py_compile で門前払いを防ぎ、その後にプレビューで内容を確認する」 という二段構えにするのが最強の布陣です。
まとめ:開発リズムを整えよう
Pulumi は強力なツールですが、フィードバックループ(書いて→確認して→直す)が長くなりがちです。
「括弧の閉じ忘れ」みたいな凡ミスで思考を中断されるのはもったいない。
ぜひ py_compile を手元で叩く癖をつけるか、Makefile や CI に仕込んで、サクサク快適な IaC ライフを送ってください!
(おまけ)Makefile の例
毎回コマンドを打つのが面倒な人は、こんな Makefile を置いておくと幸せになれます。
check: @echo "🔍 文法チェック中..." @python -m compileall . -q @echo "✅ OK! 文法は完璧です" deploy: check pulumi up
これで make deploy と打つだけで、勝手にチェックしてからデプロイしてくれるようになりますよ。


