0Pricing
AI Agents · บทเรียน

ตัวแปรสภาพแวดล้อมสำหรับตัวแทน

os.environ, os.getenv() และเหตุผลที่ไม่ควรฝังข้อมูลลับไว้ในซอร์สโค้ด

ตัวแปรสภาพแวดล้อมสำหรับตัวแทน เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงไม่ควรเขียนคีย์ส่วนต่อประสานโปรแกรมประยุกต์ไว้ตายตัว

การเขียนคีย์ส่วนต่อประสานโปรแกรมประยุกต์ไว้โดยตรงในโค้ดต้นฉบับเป็นหนึ่งในข้อผิดพลาดด้านความปลอดภัยที่พบบ่อยและสร้างความเสียหายสูงสุด คีย์ที่บันทึกลงในการควบคุมเวอร์ชันจะมองเห็นได้โดยทุกคนที่เข้าถึง repository ได้ รวมถึงผู้ร่วมพัฒนาในอนาคต ระบบผสานรวมอย่างต่อเนื่อง และผู้ที่พบคลังโค้ดออนไลน์

ปัญหาของประวัติ Git

แม้ว่าภายหลังคุณจะลบคีย์ที่เขียนไว้ตายตัวออกจากโค้ด คีย์นั้นก็ยังคงอยู่ในประวัติ Git ใครก็ตามที่โคลน repository แล้วเรียกใช้ 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()

มีสองวิธีในการอ่านตัวแปรสภาพแวดล้อม os.environ['KEY'] จะทำให้เกิด KeyError หากไม่พบตัวแปร ซึ่งเหมาะสำหรับคีย์ที่จำเป็น ส่วน os.getenv('KEY', default) จะคืนค่าเริ่มต้นเมื่อไม่พบตัวแปร ซึ่งเหมาะสำหรับ Settings ที่ไม่จำเป็น

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 ปัจจัย

ระเบียบวิธีแอปแบบ 12 ปัจจัยกำหนดแนวทางปฏิบัติที่ดีสำหรับซอฟต์แวร์สมัยใหม่ ปัจจัยที่ III: จัดเก็บการกำหนดค่าไว้ในสภาพแวดล้อม ทุกสิ่งที่แตกต่างกันระหว่างสภาพแวดล้อมการติดตั้ง (การพัฒนา การเตรียมใช้งาน และการใช้งานจริง) เช่น คีย์ส่วนต่อประสานโปรแกรมประยุกต์ ที่อยู่ และแฟล็กความสามารถ ควรมาจากตัวแปรสภาพแวดล้อม ไม่ใช่จากโค้ด

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')

การเข้าถึงการกำหนดค่าแบบซ้อนอย่างปลอดภัย

สำหรับเอเจนต์ที่มีตัวเลือกการกำหนดค่าจำนวนมาก ให้สร้างคลาสการกำหนดค่าที่อ่านและตรวจสอบตัวแปรสภาพแวดล้อมทั้งหมดไว้ในที่เดียว วิธีนี้รวมศูนย์การตรวจสอบและทำให้โค้ดส่วนที่เหลือสะอาดขึ้น

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}')

การปิดบังคีย์ในบันทึก

ห้ามบันทึกคีย์ส่วนต่อประสานโปรแกรมประยุกต์จริงลงในบันทึก หากจำเป็นต้องบันทึกการกำหนดค่าเพื่อดีบัก ให้ปิดบังทุกส่วนยกเว้นอักขระ 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 และระบบผสานรวมต่อเนื่อง

ใน Docker ให้ส่งตัวแปรสภาพแวดล้อมด้วยแฟล็ก -e หรือ --env-file ใน GitHub Actions ให้จัดเก็บตัวแปรเหล่านี้เป็นข้อมูลลับและอ้างอิงในไฟล์ 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')

สิ่งที่ควรทำเมื่อคีย์รั่วไหล

หากคุณเผลอบันทึกคีย์ส่วนต่อประสานโปรแกรมประยุกต์ลงใน repository สาธารณะหรือที่ใช้ร่วมกัน ให้ดำเนินการทันที ให้ถือว่าคีย์ถูกบุกรุกตั้งแต่วินาทีที่อยู่นอกการควบคุมของคุณ บอตจะสแกน 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.')

ตรวจสอบความรู้: ตัวแปรสภาพแวดล้อม

ทดสอบความเข้าใจเกี่ยวกับตัวแปรสภาพแวดล้อมสำหรับการจัดการข้อมูลลับของเอเจนต์

สรุปทบทวน: ตัวแปรสภาพแวดล้อมสำหรับเอเจนต์

ขณะนี้คุณเข้าใจแนวทางที่ถูกต้องในการจัดการข้อมูลลับสำหรับเอเจนต์แล้ว:

  • ห้ามเขียนคีย์ส่วนต่อประสานโปรแกรมประยุกต์ไว้ตายตัว เพราะคีย์จะอยู่ในประวัติระบบควบคุมเวอร์ชันตลอดไป
  • ใช้ os.environ['KEY'] สำหรับตัวแปรที่จำเป็น และใช้ os.getenv('KEY', default) สำหรับตัวแปรที่ไม่จำเป็น
  • ตรวจสอบตัวแปรที่จำเป็นทั้งหมดเมื่อเริ่มต้น พร้อมข้อความข้อผิดพลาดที่ชัดเจน
  • ระบุตัวแปรที่จำเป็นไว้ในความคิดเห็นของโค้ดและ .env.example
  • ปิดบังคีย์ในบันทึก โดยแสดงเฉพาะอักขระ 4 ตัวสุดท้าย
  • แทรกข้อมูลลับขณะทำงานใน Docker และใช้ข้อมูลลับของ GitHub ในระบบผสานรวมต่อเนื่อง
  • หากคีย์รั่วไหล: เพิกถอนก่อน แล้วจึงเปลี่ยนคีย์ใหม่ในทุกแห่ง

คำถามที่พบบ่อย

บทเรียน “ตัวแปรสภาพแวดล้อมสำหรับตัวแทน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ตัวแปรสภาพแวดล้อมสำหรับตัวแทน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ตัวแปรสภาพแวดล้อมสำหรับตัวแทน”

os.environ, os.getenv() และเหตุผลที่ไม่ควรฝังข้อมูลลับไว้ในซอร์สโค้ด คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “ตัวแปรสภาพแวดล้อมสำหรับตัวแทน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม

ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ตัวแปรสภาพแวดล้อมสำหรับตัวแทน
  2. ไฟล์ .env และ python-dotenv
  3. การหมุนเวียนข้อมูลลับและความปลอดภัย
  4. โปรไฟล์การกำหนดค่าสำหรับสภาพแวดล้อมพัฒนาและใช้งานจริง
← กลับไปที่ AI Agents