はじめに
このシリーズの第1弾で、実は一度だけこんな注意書きをしていました。
APIキーを直接書き込むと誤ってGit管理下に入れてしまうリスクがあります。実運用では環境変数(例:${GEMINI_API_KEY})経由で読み込む形にするのがおすすめです。
注意書きだけして、具体的な対策は先送りにしていたので、今回はその宿題を片付けます。application.properties にAPIキーを直書きせず、環境変数から読み込むように変更します。
1. なぜ直書きしてはいけないのか
これまでのシリーズでは、以下のように application.properties にAPIキーをそのまま書いていました。
spring.ai.google.genai.api-key=AIzaSy...から始まるAPIキー
学習用のサンプルコードとして動かすだけなら問題になりにくいのですが、このファイルをそのままGitにコミットしてGitHubなどにpushしてしまうと、APIキーが世界中に公開されてしまいます。一度公開してしまったキーは、たとえ後からコミットを消しても、Git履歴やキャッシュされたページに残り続ける可能性があるため、そもそも履歴に含めないことが一番の対策になります。
2. Spring Bootの環境変数命名規則を利用する
Spring Bootには、環境変数をプロパティとして自動的に読み込んでくれる「Relaxed Binding」という仕組みがあります。プロパティ名をすべて大文字にし、.(ドット)や-(ハイフン)を_(アンダースコア)に置き換えると、対応する環境変数名になります。
今回使っている spring.ai.google.genai.api-key というプロパティ名は、以下の環境変数に対応します。
SPRING_AI_GOOGLE_GENAI_API_KEY
つまり、application.properties に何も書かなくても、この名前の環境変数さえ設定しておけば、Spring Bootが自動的に読み取ってくれます。
3. application.properties からAPIキーを削除する
先ほどのプロパティ行を削除(またはコメントアウト)します。
spring.application.name=SpringAISample05
# spring.ai.google.genai.api-key=... ← この行を削除
spring.ai.google.genai.chat.model=gemini-3.1-flash-lite
これで、このファイルをそのままGitにコミットしても、APIキーが漏れる心配はなくなります。
4. 環境変数を設定する
ここが少しだけ注意が必要なポイントです。macOSでは、ターミナルから実行する場合とEclipseから実行する場合とで、環境変数の設定場所が異なります。GUIアプリ(Eclipse)は、ターミナルの .zshrc に書いた設定を自動的には読み込んでくれません。
これは「どちらか一方を設定すればよい」という話ではなく、普段どちらの方法でアプリを実行するかによって、必要な設定が変わるという話です。
| 実行方法 | 必要な設定 | 反映範囲 |
|---|---|---|
ターミナルから ./gradlew bootRun / test など |
~/.zshrc に環境変数を追記 |
そのPC上の全ターミナル・全プロジェクトに効く |
| Eclipseの実行ボタン/Gradle Tasksビュー | 実行構成(Run Configurations)の「環境」タブに追加 | その実行構成(=そのプロジェクト)だけに効く |
普段どちらか一方の方法しか使わないなら、対応する側だけ設定すれば十分です。ただし、このシリーズのように「普段はEclipseから実行しつつ、たまにターミナルから ./gradlew を直接叩く」というように両方の実行方法を使う場合は、両方に設定しておく必要があります。
ターミナルから実行する場合
シェルの設定ファイル(macOSのデフォルトはzshなので ~/.zshrc)に追記します。echo コマンドを使ってワンライナーで追記する方法もありますが、確実なのは nano などのエディタで直接編集する方法です。
nano ~/.zshrc
ファイルの末尾に、以下の行を追加します。
export SPRING_AI_GOOGLE_GENAI_API_KEY="AIzaSy...(実際のAPIキー)"
保存して終了したら(Control+O → Enter → Control+X)、設定を反映させます。
source ~/.zshrc
確認は printenv コマンドで行えます。
printenv SPRING_AI_GOOGLE_GENAI_API_KEY
Tips:環境によっては
echo $変数名での確認がうまく動かないことがあります(筆者の環境では/bin/echo自体が実行できないという珍しい現象に遭遇しました)。その場合はprintenv 変数名を使うと確実です。
Eclipseから実行する場合
「実行」→「実行構成(Run Configurations)」を開き、実行しているアプリの設定(「Spring Boot App」や「Java Application」に分類されているもの)を選択します。右側の「環境(Environment)」タブを開き、「新規(New)」ボタンから以下を追加します。
- 名前(Name):
SPRING_AI_GOOGLE_GENAI_API_KEY - 値(Value):
AQ......(実際のAPIキー)
Gradle Tasksビューから bootRun や test を実行している場合も、同様にそのタスクの実行構成に対して「環境」タブから設定します。
この設定はEclipse内部(実行構成ごと)に保存されるものなので、ターミナルの環境変数とは完全に別管理です。前述の表の通り、ターミナルからも実行する予定があるなら、~/.zshrc 側の設定も別途必要になります。
5. 動作確認
環境変数を設定したら、いつも通りアプリを起動し、リクエストを送ってみてください。
curl localhost:8080/ask \
-H"Content-type: application/json" \
-d'{"question":"なぜ、犬はおなかを見せるのでしょうか?"}'
以前と変わらず回答が返ってくれば成功です。もし認証エラー(401系のエラー)が返ってきた場合は、環境変数名のタイプミスや、設定した実行構成と実際にクリックした実行ボタンが一致しているかを確認してみてください。
6. ハマりどころ:環境変数は実行構成ごとに個別設定が必要
このシリーズでは「SpringAISample02」「SpringAISample03」……と複数のサンプルプロジェクトを並行して動かしています。ここで1つハマりどころがあります。
Eclipseの実行構成(Run Configurations)は、プロジェクト(アプリケーションクラス)ごとに個別に管理されています。 そのため、あるプロジェクト(例:SpringAISample05)の実行構成に環境変数を設定していても、別のプロジェクト(例:SpringAISample02)を実行するときは、その実行構成に改めて環境変数を設定しないと反映されません。
これを忘れると、application.properties にはAPIキーの記述がなく、環境変数も読み込まれない状態になり、以下のようなエラーで起動に失敗します。
Incomplete Google GenAI configuration: Provide 'api-key' for Gemini API or 'project-id' and 'location' for Vertex AI.
このエラーが出た場合は、以下の2点を確認してください。
- 「実行」→「実行構成(Run Configurations)」で、今回実行しようとしているプロジェクトに対応する構成を選び、「環境」タブに
SPRING_AI_GOOGLE_GENAI_API_KEYが登録されているか -
application.propertiesにAPIキーの記述が(新たに)残っていないか
複数のサンプルプロジェクトを行き来しながら動かしている場合は特に、「今どのプロジェクトの実行構成を触っているか」を意識しておくと、このエラーを避けやすくなります。
まとめ
-
application.propertiesにAPIキーを直書きすると、Gitの履歴に残ってしまうリスクがある - Spring Bootの命名規則(
spring.ai.google.genai.api-key→SPRING_AI_GOOGLE_GENAI_API_KEY)を使えば、プロパティファイルを一切書き換えずに環境変数だけでAPIキーを渡せる - macOSでは、ターミナルとEclipseで環境変数の設定場所が異なる。普段どちらの方法で実行するかによって、必要な設定(
~/.zshrcか、実行構成の「環境」タブか)が変わり、両方使うなら両方への設定が必要 - Eclipseの実行構成はプロジェクトごとに個別なので、複数のサンプルプロジェクトを行き来する場合は、それぞれの実行構成に環境変数を設定し直す必要がある
これでこのシリーズのサンプルコードは、APIキーを気にせず安心してGitにコミットできる状態になりました。
