0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

APIキーや秘密情報の安全な管理 環境変数、安全な情報読み込み。

0
Posted at

非常に重要かつ「実務で絶対にミスが許されない」トピックである 「秘密情報の管理」

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 ファイルにまとめて書く手法が一般的です。

  1. .env ファイルを作成:
DB_PASSWORD=mypassword123
STRIPE_API_KEY=sk_test_...

  1. 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の実装が必要、料金がかかる

🔰 初心者が今日からできること

  1. プロジェクトのルートに .gitignore を作り、.env と記述する。
  2. 設定情報を入れるための 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"),
    }
}

「秘密情報はコードに書かない、外から注入する」という習慣をつけるだけで、エンジニアとしての信頼性がグッと上がります!

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?