1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

「学生ひよこ界隈が送るGo/Javaで実現する「はじめてのバックエンド」Advent Calendar 2025」8日目の記事は、Goで安全に環境変数を設定する方法についてです。

このアドカレの前の記事でも触れた通り、DB接続の際にコードに接続情報をそのまま記載してしまうと、セキュリティ的に大変危険です!

この記事では、Go言語で環境変数を安全に扱うための基本的な方法について解説します。

  • 開発環境と本番環境で設定をどう分ければ良いか悩んでいる方
  • アプリケーションのセキュリティ意識を高めたいと考えている方
  • Goバックエンドにおける.envの扱い方を知りたい方

この記事では、Go言語で.envファイルを使って開発環境と本番環境の設定を安全に分離できるようになることを目指します。

セキュアなアプリケーション開発の第一歩を踏み出せるように頑張りましょう!

環境変数の重要性

アプリケーションを開発していると、様々な「設定値」が必要になります。例えば、以下のような情報です。

  • データベースの接続情報: ユーザー名、パスワード、ホスト名、ポート番号
  • 外部APIのキー: Google Maps APIキー、Stripe APIキーなどの認証情報
  • 環境ごとの設定: 開発環境(development)か本番環境(production)かを示すフラグ、ログレベルの設定

これらの情報をソースコードの中に直接書き込むこと、いわゆるハードコーディングは、非常に危険です。

ハードコーディングの危険性について

  1. セキュリティリスク: ソースコードがGitHubなどのパブリックなリポジトリで公開された場合、APIキーやパスワードといった機密情報が第三者に漏洩してしまいます
  2. メンテナンス性の低下: データベースのパスワードを変更するたびに、ソースコードを修正し、再デプロイする必要が出てきます
  3. 環境ごとの切り替えが困難: 開発用のデータベースと本番用のデータベースを切り替える作業が発生するため、作業効率が下がります

これらの問題を解決するのが環境変数です。

環境変数は、OSのレベルで設定されるキーと値のペアであり、プログラムの外部から設定情報を注入するための仕組みです。ソースコードには「環境変数 DB_PASSWORD からパスワードを読み込む」という記述だけを行い、実際のパスワードはプログラムを実行する環境(開発者のPC、本番サーバーなど)で設定します。

これにより、機密情報をソースコードから完全に分離し、安全にアプリケーションを管理できるようになります。

フロントエンドでの環境変数の設定方法の振り返り

フロントエンド開発を行っている方なら、特にReact (Create React App) や Vue.js (Vue CLI) のようなモダンなフレームワークを使っていると、環境変数を扱った方も多いのではないかと思います。

プロジェクトのルートディレクトリに.envというファイルを作成し、そこにキーと値のペアを記述します。

以下が.envの例です。

.env
REACT_APP_API_URL=https://api.example.com
REACT_APP_API_KEY=xxxxxxxxxxxx

この.envファイルは、通常.gitignoreに追加して、Gitの管理対象から除外します。これにより、各開発者は自分のローカル環境用の設定値を持ちつつ、機密情報がリポジトリにコミットされるのを防ぎます。

同じようにバックエンド開発でも、この.envを活用します。

Goでの環境変数の読み込み

Go言語で環境変数を読み込む基本として、標準ライブラリのosパッケージに含まれるos.Getenv関数を使用します。

os.Getenvは、引数に指定した環境変数のキー(文字列)を受け取り、その値(文字列)を返します。もし指定したキーの環境変数が設定されていない場合は、空文字列""を返します。

package main

import (
	"fmt"
	"os"
)

func main() {
	// 環境変数 "GO_ENV" を読み込む
	goEnv := os.Getenv("GO_ENV")

	if goEnv == "production" {
		fmt.Println("本番環境で実行中です")
	} else {
		fmt.Println("開発環境で実行中です")
	}

	// 設定されていない環境変数を読み込むと空文字列が返る
	apiKey := os.Getenv("API_KEY")
	if apiKey == "" {
		fmt.Println("API_KEYが設定されていません")
	} else {
		fmt.Printf("API_KEY: %s\n", apiKey)
	}
}

ターミナルで環境変数を設定しながらプログラムを実行するには、以下のようにします。

# 環境変数を設定せずに実行
$ go run main.go
開発環境で実行中です
API_KEYが設定されていません

# 環境変数を設定して実行
$ GO_ENV=production API_KEY=my-secret-key go run main.go
本番環境で実行中です
API_KEY: my-secret-key

これで読み込むことができたと思います。

ちなみに、本番環境ではAPI_KEYは表示させないでくださいね!

ただ、環境変数を新たに設定してもう一回同じプログラムを実行したとしても、再読み込みの処理が働かないのが難点です。

godotenvライブラリの使用

Goには、.envファイルを自動的に読み込み、環境変数としてアプリケーションにセットしてくれる便利なサードパーティライブラリが存在します。

その中で広く使われているのがgithub.com/joho/godotenvです。

godotenv のインストール

まず、プロジェクトにgodotenvをインストールします。

go get github.com/joho/godotenv

.env ファイルの作成

次に、プロジェクトのルートに.envファイルを作成し、値を以下のように設定します。

.env
GO_ENV=development
API_URL=http://localhost:8080
DB_USER=myuser
DB_PASSWORD=mypassword

以下のように、必ず.gitignoreファイルに.envを追加して、リポジトリにコミットしないように設定するのを忘れないでください。

.gitignore
# ... 他のルール ...

# 環境設定ファイル
.env

godotenv の使い方

godotenvはアプリケーションの起動時にgodotenv.Load()を呼び出すだけで、利用することができます。

godotenv.Load()は、カレントディレクトリにある.envファイルを探し、その内容を環境変数として読み込みます。

もし.envファイルが存在しなくてもエラーにはなりません。

package main

import (
	"fmt"
	"log"
	"os"

	"github.com/joho/godotenv"
)

func main() {
	// .envファイルを読み込む
	err := godotenv.Load()
	if err != nil {
		// .envファイルが読み込めなかった場合の処理
		// 本番環境など、.envファイルが存在しない場合を考慮し、エラーにしない選択も可能
		log.Println("警告: .envファイルが読み込めませんでした")
	}

	// これ以降、os.Getenvで.envファイルの内容を読み出せる
	goEnv := os.Getenv("GO_ENV")
	apiUrl := os.Getenv("API_URL")
	dbUser := os.Getenv("DB_USER")
	dbPass := os.Getenv("DB_PASSWORD")

	fmt.Printf("GO_ENV: %s\n", goEnv)
	fmt.Printf("API_URL: %s\n", apiUrl)
	fmt.Printf("DB_USER: %s\n", dbUser)
	fmt.Printf("DB_PASSWORD: %s\n", dbPass)
}

実行結果は以下のようになります。

$ go run main.go
GO_ENV: development
API_URL: http://localhost:8080
DB_USER: myuser
DB_PASSWORD: mypassword

このようにgodotenvを使うことで、開発者は.envファイルを編集するだけで済み、ターミナルで毎回環境変数を設定する手間がなくなります。

おわりに

本記事では、Goでの環境変数の安全な設定方法について解説しました。

この記事を執筆するにあたって、.envを使う際の標準ライブラリの細かい挙動を確認できたので、サードパーティ製のライブラリの特徴などが差別化されて、理解しやすかったと感じています。

実際にプロダクトを作るときは、ハードコーディングではなくきちんと環境変数から設定しましょう^ ^

最後までお読みいただき、ありがとうございました!

この「学生ひよこ界隈が送るGo/Javaで実現する「はじめてのバックエンド」Advent Calendar 2025」では、GoJavaを使い、APIの作り方、データベースとの接続、テストやDockerといった気になったバックエンド技術の基本を振り返った学びを共有しています。

ぜひ他の記事もチェックして、筆者がこのひとりアドカレを完遂することができるか、確認してみてください(^^)

学生ひよこ界隈が送るGo/Javaで実現する「はじめてのバックエンド」Advent Calendar 2025

それでは、明日の「学生ひよこ界隈が送るGo/Javaで実現する「はじめてのバックエンド」Advent Calendar 2025」の記事もお楽しみに!

参考文献

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?