非常に重要かつ「実務で絶対にミスが許されない」トピックである 「秘密情報の管理」
APIキーやデータベースのパスワードなどの秘密情報(シークレット)をソースコードに直接書き込む(ハードコードする)ことは、絶対に避けなければなりません。Go言語での具体的な管理手法を3つのステップで解説します。
1. なぜ「ハードコード」はいけないのか?
// 絶対にやってはいけない例
const apiKey = "12345-abcde-super-secret"
- GitHub経由の漏洩: ソースコードをリポジトリにプッシュした瞬間、全世界(またはチーム内)にキーが公開されます。
- 環境の切り替えが困難: 開発用、テスト用、本番用で異なるキーを使いたい場合、コードを書き換える必要が出てきます。
2. 初級編:環境変数(Environment Variables)
最も一般的で基本的な方法です。OS側に情報を保存し、プログラム実行時に読み込みます。
Goでの読み込み方
標準ライブラリの os パッケージを使います。
package main
import (
"fmt"
"os"
)
func main() {
// 環境変数 "DB_PASSWORD" を取得
dbPass := os.Getenv("DB_PASSWORD")
if dbPass == "" {
fmt.Println("警告: DB_PASSWORD が設定されていません")
} else {
fmt.Printf("取得成功: %s\n", dbPass)
}
}
開発を便利にする .env ファイル
ローカル開発では、たくさんの環境変数を設定するのが大変なため、.env ファイルにまとめて書く手法が一般的です。
-
.envファイルを作成:
DB_PASSWORD=mypassword123
STRIPE_API_KEY=sk_test_...
-
godotenvライブラリで読み込む:
Goで.envを扱うデファクトスタンダードです。
go get github.com/joho/godotenv
import "github.com/joho/godotenv"
func main() {
// .envファイルを読み込んで環境変数にセットする
err := godotenv.Load()
if err != nil {
log.Fatal(".envの読み込みに失敗しました")
}
apiKey := os.Getenv("STRIPE_API_KEY")
// ...
}
⚠️ 超重要: .env ファイルは絶対にGitにコミットしてはいけません。必ず .gitignore に追加してください。
3. 中級・本番編:AWS Secrets Manager
本番環境(AWSなど)では、環境変数だけでは管理が不十分(誰でも見れてしまう、更新が大変など)な場合があります。そこで、専用の管理サービスを使います。
AWS Secrets Managerを使うメリット
- 強力な暗号化: 安全に保管される。
- アクセス制御: 「このGoアプリ(IAMロール)だけがこのキーを読める」という制限が可能。
- ローテーション: 定期的にパスワードを自動変更できる。
Goでの実装イメージ
AWS SDK for Go を使用します。
// ※イメージコードです。実際にはSDKのセットアップが必要です。
import (
"context"
"github.com/aws/aws-sdk-go-v2/service/secretsmanager"
)
func getSecret(secretName string) (string, error) {
// AWS SDKを使ってSecrets Managerから値を取得
input := &secretsmanager.GetSecretValueInput{
SecretId: &secretName,
}
// APIを叩いて取得
result, err := svc.GetSecretValue(context.TODO(), input)
if err != nil {
return "", err
}
return *result.SecretString, nil
}
安全な管理のまとめ
| 手法 | 利用シーン | メリット | 注意点 |
|---|---|---|---|
環境変数 (os.Getenv) |
どこでも利用可能 | 最もシンプルで標準的 | サーバー上で丸見えになる場合がある |
.env ファイル |
ローカル開発 | 開発者ごとに設定を変えやすい | .gitignore に必ず入れる! |
| Secrets Manager | 本番環境 (AWS) | セキュリティが最強、自動更新が可能 | SDKの実装が必要、料金がかかる |
🔰 初心者が今日からできること
- プロジェクトのルートに
.gitignoreを作り、.envと記述する。 - 設定情報を入れるための
configパッケージを作り、os.Getenvで値を読み込んで構造体に詰める処理を書く。
// config/config.go のイメージ
type Config struct {
APIKey string
DBPass string
}
func New() *Config {
return &Config{
APIKey: os.Getenv("API_KEY"),
DBPass: os.Getenv("DB_PASSWORD"),
}
}
「秘密情報はコードに書かない、外から注入する」という習慣をつけるだけで、エンジニアとしての信頼性がグッと上がります!