0Pricing
AI Agents · レッスン

エージェント向け環境変数

os.environ、os.getenv()、ソースコードに秘密情報をハードコードしてはいけない理由を学びます。

「エージェント向け環境変数」はCoddyKit上の無料AI Agentsレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Agents学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Agentsコースには全4レッスンが含まれています。

APIキーをハードコードしてはいけない理由

ソースコードにAPIキーを直接ハードコードすることは、最も一般的で、被害の大きいセキュリティ上のミスの一つです。バージョン管理にコミットされたキーは、リポジトリへのアクセス権を持つすべての人から見える状態になります。そこには、将来のコントリビューター、CIシステム、オンラインでリポジトリを見つけた人も含まれます。

git履歴の問題

後からコードからハードコードしたキーを削除しても、キーはgit履歴に残ります。リポジトリをクローンした人は誰でも、git logやgit showを実行してキーを見つけられます。キーをバージョン管理に入れてはいけません。

import os

os.environ['OPENAI_API_KEY'] = 'sk-proj-abc123def456'  # simulate deployment env

OPENAI_API_KEY = os.environ['OPENAI_API_KEY']
print('Key loaded from environment — never hard-coded')

os.environ[]とos.getenv()の違い

環境変数を読み取る方法は2つあります。os.environ['KEY']は、変数が存在しない場合にKeyErrorを発生させるため、必須キーに適しています。os.getenv('KEY', default)は、存在しない場合にデフォルト値を返すため、オプション設定に適しています。

import os

os.environ['OPENAI_API_KEY'] = 'sk-proj-demo-key'

try:
    openai_key = os.environ['OPENAI_API_KEY']
except KeyError:
    print('ERROR: OPENAI_API_KEY environment variable is not set!')
    raise

model = os.getenv('AGENT_MODEL', 'gpt-4o-mini')
timeout = float(os.getenv('AGENT_TIMEOUT', '30'))
log_level = os.getenv('LOG_LEVEL', 'INFO')
max_steps = int(os.getenv('AGENT_MAX_STEPS', '20'))

print(f'Model: {model}, Timeout: {timeout}s, Log: {log_level}')

起動時に必須環境変数を検証する

ベストプラクティスは、起動時に必須の環境変数をすべて確認し、明確なエラーメッセージを表示して早期に失敗させることです。これにより、キーが存在しない場合にエージェントループの深い場所で発生する、原因を特定しにくい実行時エラーを防げます。

import os
import sys

REQUIRED_VARS = [
    'OPENAI_API_KEY',
    'SEARCH_API_KEY',
    'DATABASE_URL'
]

def check_required_env_vars():
    missing = [var for var in REQUIRED_VARS if not os.getenv(var)]
    if missing:
        print('FATAL: Missing required environment variables:')
        for var in missing:
            print(f'  - {var}')
        print('\nSet these in your .env file or shell environment.')
        sys.exit(1)
    print(f'All {len(REQUIRED_VARS)} required environment variables are set.')

# Call this at the very start of your agent:
# check_required_env_vars()

if __name__ == '__main__':
    for var in REQUIRED_VARS:
        os.environ.setdefault(var, 'demo-value')
    check_required_env_vars()

12-Factor Appの原則

12-Factor Appの方法論では、現代的なソフトウェアのベストプラクティスを定めています。ファクターIIIは「設定を環境に保存する」です。デプロイ環境(開発、ステージング、本番)によって変わるもの、つまりAPIキー、URL、機能フラグなどは、コードではなく環境変数から取得する必要があります。

import os

os.environ['OPENAI_API_KEY'] = 'sk-proj-demo'
os.environ['SEARCH_API_KEY'] = 'tvly-demo'
os.environ['DATABASE_URL'] = 'postgresql://user:pass@localhost/agentdb'

config = {
    'openai_key': os.environ['OPENAI_API_KEY'],
    'search_key': os.environ['SEARCH_API_KEY'],
    'database_url': os.environ['DATABASE_URL'],
    'redis_url': os.getenv('REDIS_URL', 'redis://localhost:6379'),
    'enable_caching': os.getenv('ENABLE_CACHING', 'true') == 'true',
    'max_results': int(os.getenv('MAX_RESULTS', '10')),
    'log_level': os.getenv('LOG_LEVEL', 'INFO'),
    'env': os.getenv('ENV', 'development')
}

print('Config loaded from environment:', config['env'])

シェルで環境変数を設定する

ターミナルのセッションで、export(Mac/Linux)またはset(Windows)を使って環境変数を設定します。これらは、そのセッションで実行するすべてのプログラムから利用できます。

# Mac/Linux (bash/zsh):
# export OPENAI_API_KEY='sk-proj-your-key-here'
# export AGENT_MODEL='gpt-4o-mini'
# python agent.py

# Windows (Command Prompt):
# set OPENAI_API_KEY=sk-proj-your-key-here
# python agent.py

# Windows (PowerShell):
# $env:OPENAI_API_KEY = 'sk-proj-your-key-here'
# python agent.py

# One-liner (temporary, only for this command):
# OPENAI_API_KEY='sk-proj-...' python agent.py

print('Shell exports set env vars for the current session only')

コードコメントに必須変数を記載する

エージェントが必要とする環境変数を、ソースコードに直接記載します。新しい開発者がエージェントファイルの先頭を読むだけで、何を設定すべきか正確に把握できるようにします。

# agent.py
#
# REQUIRED ENVIRONMENT VARIABLES:
#   OPENAI_API_KEY       OpenAI API key (get from platform.openai.com)
#   SEARCH_API_KEY       Tavily search API key (get from tavily.com)
#
# OPTIONAL ENVIRONMENT VARIABLES:
#   AGENT_MODEL          LLM model (default: gpt-4o-mini)
#   AGENT_MAX_STEPS      Max loop iterations (default: 20)
#   LOG_LEVEL            Logging verbosity: DEBUG|INFO|WARNING (default: INFO)
#   DATABASE_URL         PostgreSQL URL (default: none, disables memory storage)
#
# EXAMPLE SETUP:
#   cp .env.example .env
#   Edit .env with your keys
#   python agent.py --query 'Your question'

print('Document required variables at the top of each agent file')

ネストされた設定に安全にアクセスする

設定項目が多いエージェントでは、すべての環境変数を1か所で読み取り、検証する設定クラスを構築します。これにより検証を一元化でき、残りのコードもすっきりします。

import os

class AgentConfig:
    def __init__(self):
        self.openai_key = self._require('OPENAI_API_KEY')
        self.search_key = self._require('SEARCH_API_KEY')
        self.model = os.getenv('AGENT_MODEL', 'gpt-4o-mini')
        self.max_steps = int(os.getenv('AGENT_MAX_STEPS', '20'))
        self.log_level = os.getenv('LOG_LEVEL', 'INFO')
        self.env = os.getenv('ENV', 'development')

    def _require(self, key: str) -> str:
        value = os.getenv(key)
        if not value:
            raise EnvironmentError(
                f'Required environment variable {key} is not set. '
                f'See .env.example for setup instructions.'
            )
        return value

# config = AgentConfig()  # raises clear error if any key is missing
# client = openai.OpenAI(api_key=config.openai_key)

if __name__ == '__main__':
    os.environ.setdefault('OPENAI_API_KEY', 'sk-demo-1234')
    os.environ.setdefault('SEARCH_API_KEY', 'demo-search-key')
    config = AgentConfig()
    print(f'Model: {config.model}, max_steps: {config.max_steps}, env: {config.env}')

ログ内のキーをマスクする

生のAPIキーをログに記録してはいけません。デバッグのために設定を記録する必要がある場合は、最後の4文字以外をすべてマスクします。これにより、キーが読み込まれていることを確認しながら、キー自体の露出を防げます。

import os

def mask_key(key: str) -> str:
    if not key or len(key) < 8:
        return '****'
    return '*' * (len(key) - 4) + key[-4:]

def log_config_summary(config: dict):
    print('Agent configuration:')
    for name, value in config.items():
        if 'key' in name.lower() or 'secret' in name.lower() or 'token' in name.lower():
            print(f'  {name}: {mask_key(value)}')
        else:
            print(f'  {name}: {value}')

config = {
    'openai_key': os.getenv('OPENAI_API_KEY', ''),
    'model': 'gpt-4o-mini',
    'max_steps': '20'
}
log_config_summary(config)
# openai_key: ****abcd
# model: gpt-4o-mini

DockerとCIで環境変数を使用する

Dockerでは、-eフラグまたは--env-fileを使って環境変数を渡します。GitHub Actionsでは、環境変数をSecretsとして保存し、ワークフローのYAMLから参照します。Dockerイメージに組み込んではいけません。

# Docker run with env vars:
# docker run -e OPENAI_API_KEY='sk-...' -e AGENT_MODEL='gpt-4o-mini' myagent:latest

# Docker with an env file:
# docker run --env-file .env myagent:latest

# GitHub Actions workflow (secrets stored in repo settings):
# env:
#   OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
#   SEARCH_API_KEY: ${{ secrets.SEARCH_API_KEY }}

# docker-compose.yml:
# services:
#   agent:
#     image: myagent:latest
#     env_file:
#       - .env

print('Never bake secrets into Docker images — always inject at runtime')

キーが漏えいした場合の対処

APIキーを公開または共有リポジトリに誤ってコミットした場合は、すぐに対処します。キーが管理下を離れた瞬間に漏えいしたものと考えてください。ボットはコミットから数秒以内にGitHubのキーをスキャンしています。

# Immediate response if a key is exposed:
# 1. REVOKE the key immediately (provider dashboard)
#    OpenAI: platform.openai.com/api-keys -> Delete key
#    Anthropic: console.anthropic.com -> API Keys
# 2. Generate a new key
# 3. Update your .env file with the new key
# 4. Rotate in all environments (staging, prod)

# Remove from git history (does NOT guarantee removal from forks/clones):
# git filter-branch or git-filter-repo to rewrite history
# Force push to all branches

# Note: Rewriting git history cannot undo exposure
# if others have already cloned or forked the repo
print('Revoke immediately. Do not just remove from code — rotate the key.')

理解度チェック:環境変数

エージェントのシークレット管理における環境変数についての理解度を確認します。

まとめ:エージェントの環境変数

これで、エージェントのシークレットを正しく管理する方法を理解できました:

  • APIキーをハードコードしてはいけません。キーはgit履歴に永久に残ります
  • 必須の環境変数にはos.environ['KEY']を、オプションの環境変数にはos.getenv('KEY', default)を使用します
  • 起動時にすべての必須変数を、明確なエラーメッセージ付きで検証します
  • 必要な変数をコードコメントと.env.exampleに記載します
  • ログ内のキーをマスクし、最後の4文字だけを表示します
  • Dockerでは実行時にシークレットを注入し、CIではGitHub Secretsを使用します
  • キーが漏えいした場合は、まず無効化し、その後すべての場所でローテーションします

よくある質問

「エージェント向け環境変数」レッスンは無料ですか?

はい。「エージェント向け環境変数」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Agentsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Agentsコースには全4レッスンが含まれています。

「エージェント向け環境変数」で何を学びますか?

os.environ、os.getenv()、ソースコードに秘密情報をハードコードしてはいけない理由を学びます。 ブラウザで直接実行するハンズオンコードでAI Agentsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

AI Agentsを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAI Agentsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「エージェント向け環境変数」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAI Agentsレッスンでコードを書いて実行できますか?

はい。すべてのAI Agentsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. エージェント向け環境変数
  2. .envファイルとpython-dotenv
  3. 秘密情報のローテーションとセキュリティ
  4. 開発環境と本番環境の設定プロファイル
← AI Agentsに戻る