AIのあとしまつ

事例・基礎知識

個人開発者が『クラウド破産』しないためのAWS/OpenAI API管理術【APIキー流出対策】

GitHubに上げたコードにAPIキーが含まれていて数百万円の請求が……。AI開発初心者が最初に直面する「パケ死」リスクを防ぐための、正しい環境変数の管理方法をガイドします。

APIキー 流出 対策AWS クラウド破産OpenAI 請求 高額環境変数 管理GitHub APIキー 漏洩.env 使い方API 予算制限GitGuardian 設定

「朝起きたら、AWSから300万円の請求が来ていた」

怪談のような話ですが、これは個人開発者の間で毎月のように起きている実話です。被害者の多くは「自分は大丈夫」と思っていた人たちです。夜中に少し試してみようとコードを書き、GitHubにプッシュして寝た。翌朝、見覚えのないEC2インスタンスが数百台起動していた、という事例が世界中で報告されています。

怖いのはスピードです。GitHubにAPIキーが含まれたコードがプッシュされてから、ボットがそのキーを検出して不正利用を開始するまで、早ければ数秒です。GitHubのパブリックリポジトリは常時クローリングされており、シークレットを探すボットが24時間稼働しています。

なぜキーが漏れるのか:AIコーディングの落とし穴

AIにコードを書かせると、動作確認のためにAPIキーをコードの中に直接書き込む(ハードコーディング)ことがあります。AIは「動くコード」を生成することが目的なので、セキュリティよりも即座に動作するコードを優先することが多いのです。

// 絶対にやってはいけない例
const openai = new OpenAI({
  apiKey: "sk-proj-xxxxxxxxxxxxxxxx" // ← ここにキーが書いてある
});

このまま「とりあえず保存しよう」とGitHubにPushした瞬間、世界中のボットがあなたのキーを検知し、数秒後には不正利用が始まります。

さらに厄介なのが、一度コミットしたキーはGitの履歴に残るという点です。「気づいたのでファイルから削除してプッシュした」では不十分で、Gitの履歴にはそのコミットが残り続けます。git logを追えばいつでも掘り起こせます。プライベートリポジトリにしていても、招待されたコラボレーターや、将来リポジトリが公開設定になった瞬間に露出します。

正しい環境変数の管理方法

ステップ1:.env.local ファイルにキーを書く

プロジェクトのルートディレクトリに .env.local ファイルを作り、そこにキーを書きます。

# .env.local
OPENAI_API_KEY=sk-proj-xxxxxxxxxxxxxxxx
AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
NEXT_PUBLIC_SUPABASE_URL=https://xxxxx.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI...

ステップ2:.gitignore に必ず追加する

.gitignore ファイルに以下を追加して、絶対にGitHubへアップされないようにします。

# .gitignore
.env
.env.local
.env.development.local
.env.test.local
.env.production.local

Next.jsプロジェクトを create-next-app で作った場合はデフォルトで .env*.local が gitignore に含まれますが、念のため確認してください。

ステップ3:コードではキーを直接書かず環境変数から読む

// 正しい使い方
const openai = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY, // 環境変数から読む
});

ステップ4:Vercel等のデプロイ先に環境変数を登録する

.env.local はローカル専用です。Vercelにデプロイする際は、Vercelのダッシュボードから「Settings > Environment Variables」に同じキーと値を登録します。

プラットフォーム別:予算制限の設定方法

OpenAI:ハードリミットを必ず設定する

OpenAIの管理画面(platform.openai.com)から「Billing > Limits」を開きます。「Hard limit」に月額の上限額を設定しましょう。個人開発の初期段階なら**$5〜$20**程度で十分です。この上限を超えるとAPIが自動的に停止されます。「Soft limit」はアラートメールが届くだけなので、ハードリミットが重要です。

AWS:Billing Alertsを必ず有効化する

AWSのコスト管理は少し複雑ですが、手順は以下です。

  1. AWSコンソール右上のアカウント名をクリック → 「Billing and Cost Management」
  2. 「Budgets」→ 「Create a budget」
  3. 「Monthly cost budget」を選択し、金額を設定(例:$10)
  4. アラートメールアドレスを登録

あわせて「Cost anomaly detection(異常コスト検出)」も有効にしておくと、急激なコスト増を早期にメールで知らせてくれます。

Vercel:帯域制限の確認

Vercelの無料プランには帯域制限(100GB/月)があります。画像や動画を多数配信するサービスの場合は注意が必要です。ダッシュボードの「Usage」タブで現在の使用量を確認できます。

GitGuardianで流出を事前に防ぐ

GitGuardianは、コードにシークレット(APIキー、パスワード、証明書など)が含まれていないかを自動チェックするサービスです。パブリックリポジトリへの適用は無料です。

設定は簡単で、GitHubアカウントでサインアップし、リポジトリへのアクセスを許可するだけです。コミット時にシークレットが検出されると、即座にメールで通知されます。

GitHubにも「Secret scanning」という類似機能が組み込まれていますが、GitGuardianはより多くのパターンを検出できます。両方有効にしておくのがベターです。

pre-commit フックで手元でも防ぐ

さらに徹底したい場合は、git commit を実行した時点でシークレットをチェックする pre-commit フックを設定できます。

# detect-secrets ライブラリを使う例
pip install detect-secrets
detect-secrets scan > .secrets.baseline

もし既に流出してしまった場合の対応手順

  1. 即座にキーを無効化する — OpenAIなら「API keys」から該当キーを削除、AWSなら「IAM > Access keys」から無効化
  2. Gitの履歴からキーを削除するgit filter-repo または BFG Repo Cleaner を使用(ただしリモートも force push が必要)
  3. 請求額を確認する — 身に覚えのない課金がある場合、AWSはサポートに連絡すると不正利用分を免除してもらえるケースがある
  4. 全システムを確認する — 同じキーを使い回していた場合、他のサービスでも不正利用されている可能性がある

クラウド破産は、技術レベルに関係なく「うっかり」で発生します。「自分は大丈夫」と思わず、開発を始める初日に必ずリミット設定と .gitignore の確認を行いましょう。この10分の作業が、将来の数百万円の損失を防ぎます。

→ APIキー以外のセキュリティリスクも含めた包括的な解説はAI生成コードのセキュリティリスク10選を参照

→ 非エンジニア向けのセキュリティ対策まとめはVibe Codingで最低限やるべきセキュリティ対策を参照