環境設定とシークレット
12-Factorの設定、環境変数、Docker secrets
「環境設定とシークレット」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
12-factor appの設定
12-factor appの方法論では、設定をコードや設定ファイルではなく環境変数に保存することを推奨しています。これにより、コードを変更せずに開発、ステージング、本番環境へアプリを移行できます。
os.Getenv
os.Getenv(未設定の場合は""を返します)またはos.LookupEnv(値と存在を示すboolを返します)を使用して、環境変数を読み取ります:
port := os.Getenv("PORT")
if port == "" { port = "8080" }
dsn, ok := os.LookupEnv("DATABASE_URL")
if !ok { log.Fatal("DATABASE_URL not set") }環境変数ファイルの読み込み
開発環境で環境変数ファイルを読み込むには、github.com/joho/godotenvを使用します。本番環境では、プラットフォーム(Docker、Kubernetes、クラウド)経由で環境変数を注入します。
godotenv.Load() // loads .env if present; ignores error in prodenvconfig による構造化設定
github.com/kelseyhightower/envconfigを使用すると、型変換とバリデーションを行いながら環境変数を構造体のフィールドにマッピングできます。
type Config struct {
Port int `envconfig:"PORT" default:"8080"`
DBUrl string `envconfig:"DB_URL" required:"true"`
LogLevel string `envconfig:"LOG_LEVEL" default:"info"`
}
var cfg Config
envconfig.MustProcess("", &cfg)シークレット管理
本番環境では、シークレット(パスワード、API キー、TLS 証明書)を環境変数に保存しないでください。プロセス一覧やログに表示される可能性があるためです。代わりに、AWS Secrets Manager、HashiCorp Vault、またはファイルとしてマウントした Kubernetes Secrets などのシークレットマネージャーを使用します。
ファイルからのシークレットの読み込み
シークレットをファイルとしてマウントし、起動時に読み込みます。
secret, err := os.ReadFile("/run/secrets/db_password")
if err != nil { log.Fatal(err) }
dsn := fmt.Sprintf("postgres://user:%s@host/db", strings.TrimSpace(string(secret)))Kubernetes のシークレット
Kubernetes では、Secret の値を環境変数として、またはボリューム内のファイルとしてマウントします。ファイルマウントは、Pod を再起動せずにローテーションできるため、推奨されます。
フィーチャーフラグ
単純なオン/オフの切り替えには、フィーチャーフラグの名前を環境変数に保存します。複雑なフラグルール(段階的な割合ロールアウトやターゲティング)には、専用のフィーチャーフラグサービスを使用します。
起動時の設定バリデーション
必要な設定をすべて起動時に検証し、不足または無効な設定があれば即座に失敗させます。最初のリクエストを受けたときに失敗するよりも、直ちにクラッシュさせるほうが適切です。
if cfg.DBUrl == "" { log.Fatal("DB_URL required") }不変の設定
起動後の設定は不変として扱います。実行中に設定を更新する必要がある場合は、環境変数をホットリロードするのではなく、監視機構を備えたフィーチャーフラグサービスまたは設定ストアを使用します。
テストでの設定
テストの実行中だけ環境変数を設定するには、t.Setenv を使用します。これは Go 1.17 以降の並列テストでも安全です。
t.Setenv("PORT", "9090")
// test code here...クイックチェック
本番環境でシークレットを環境変数に保存してはいけないのはなぜですか。
まとめ:環境設定とシークレット
要点:
- 設定は環境変数に保存し、ローカル開発の .env ファイルには godotenv を使用します
- 型付き構造体への値の設定とデフォルト値には envconfig を使用します
- シークレットはファイルとしてマウントし、本番環境では Vault または Secrets Manager を使用します
- 設定をすべて起動時に検証し、不足があれば即座に失敗させます
よくある質問
「環境設定とシークレット」レッスンは無料ですか?
はい。「環境設定とシークレット」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「環境設定とシークレット」で何を学びますか?
12-Factorの設定、環境変数、Docker secrets ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「環境設定とシークレット」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。