4. 环境准备:Python 3.10+ 环境搭建、依赖库安装与项目初始化

说实话,很多自动化脚本写到最后跑不起来,十有八九是环境问题。Python 版本不对、依赖冲突、路径混乱——这些坑我踩过太多次了。所以这一章,咱们把地基打牢。

我会带着你从零搭建一套干净、可复现的开发环境。你想想看,如果连环境都搞不定,后面那些密钥轮换逻辑写得再漂亮也没用,对吧?

4.1 Python 3.10+ 版本选择与安装

为什么非得是 3.10+?因为咱们要用到几个新特性:match 语句让条件分支更清晰,| 运算符让类型联合更简洁。我在一个遗留项目里试过用 3.8 跑同样的代码,结果一堆语法报错——嗯,版本这事不能将就。

推荐版本:Python 3.10.6 或 3.11.x。3.12 虽然更新,但部分第三方库(比如 hvac 的某些旧版本)兼容性还没完全跟上。

安装方式根据你的操作系统来:

操作系统 推荐方式 注意事项
macOS brew install python@3.11 系统自带 Python 别动,容易搞乱权限
Ubuntu/Debian apt install python3.11 python3.11-venv 记得装 venv 模块,后面创建虚拟环境要用
CentOS/RHEL 从 python.org 下载源码编译 先装好 gcc、make、zlib-devel 等编译依赖
Windows 从 python.org 下载安装包 安装时勾选「Add Python to PATH」

我的习惯:装完立刻验证版本:python3 --version。如果输出是 Python 3.10.x 或 3.11.x,就对了。我曾经遇到过系统里同时装了 3.8 和 3.10,结果 python 指向旧版本,折腾了半小时才发现——所以一定要用 python3 而不是 python。

4.2 虚拟环境:隔离才是王道

我见过太多人把所有依赖装到全局,结果项目一多就乱套。A 项目要 boto3 1.26,B 项目要 1.28,全局装一个版本总有人要炸。说白了,虚拟环境就是给每个项目一个独立的「小房间」。

创建虚拟环境很简单:

# 在项目根目录执行
python3 -m venv venv

这会生成一个 venv 文件夹,里面装着独立的 Python 解释器和 pip。激活它:

操作系统 激活命令
macOS / Linux source venv/bin/activate
Windows (CMD) venv\Scripts\activate.bat
Windows (PowerShell) venv\Scripts\Activate.ps1

激活后,终端前面会出现 (venv) 前缀。这时候你安装的任何包都只在这个环境里生效。

注意:千万别把 venv 文件夹提交到 Git 仓库。它体积大、跨平台不兼容。正确的做法是用 requirements.txt 记录依赖,别人拉代码后自己创建虚拟环境。

4.3 三大核心依赖库安装

咱们这个脚本要跟 AWS、本地加密、HashiCorp Vault 打交道,所以需要三个库:

  • boto3:AWS SDK,用来操作 Secrets Manager、IAM、KMS 等资源。
  • cryptography:加密库,用来生成密钥、签名、加解密数据。
  • hvac:HashiCorp Vault 的 Python 客户端,用来读写 Vault 中的密钥。

安装命令:

pip install boto3 cryptography hvac

如果你网络慢,可以换成国内镜像:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple boto3 cryptography hvac

装完后验证一下:

python3 -c "import boto3; import cryptography; import hvac; print('All good!')"

如果没报错,说明环境就绪了。

避坑指南:我曾经在生产环境遇到过 cryptography 编译失败的问题,原因是系统缺少 openssl-devel。如果你在 Linux 上遇到类似错误,先装 sudo apt install libssl-dev(Ubuntu)或 sudo yum install openssl-devel(CentOS)。

4.4 项目结构初始化

一个好的项目结构,能让你的代码清晰可维护。我个人习惯这样组织:

key-rotation/
├── venv/                    # 虚拟环境(不提交 Git)
├── src/
│   ├── __init__.py
│   ├── aws_client.py        # AWS 客户端封装
│   ├── vault_client.py      # Vault 客户端封装
│   ├── crypto_utils.py      # 加密工具函数
│   └── rotation_engine.py   # 轮换核心逻辑
├── tests/
│   ├── __init__.py
│   ├── test_aws_client.py
│   ├── test_vault_client.py
│   └── test_rotation.py
├── config/
│   └── settings.yaml        # 配置文件
├── logs/                    # 运行日志(不提交 Git)
├── requirements.txt         # 依赖清单
├── .gitignore
└── README.md

创建这些目录和文件:

mkdir -p key-rotation/src key-rotation/tests key-rotation/config key-rotation/logs
touch key-rotation/src/__init__.py key-rotation/tests/__init__.py
touch key-rotation/requirements.txt key-rotation/.gitignore key-rotation/README.md

把依赖写入 requirements.txt:

boto3==1.28.0
cryptography==41.0.0
hvac==1.2.0

固定版本号很重要。我遇到过几次「昨天还能跑,今天就不行了」的情况,查到最后都是因为依赖自动升级了。所以,永远锁定版本。

生成 requirements.txt 的快捷方式:装完依赖后,执行 pip freeze > requirements.txt,它会自动把当前环境的所有包和版本号写进去。

4.5 本章知识体系总览

下面这张图把咱们刚才做的事串起来了。你可以把它当作一个检查清单:

环境准备知识体系 环境准备知识体系 Python 3.10+ 安装 虚拟环境隔离 依赖库安装 • 选择 3.10/3.11 • 系统包管理器安装 • 验证版本 • python3 -m venv venv • 激活虚拟环境 • 不提交 venv 到 Git • boto3 (AWS SDK) • cryptography (加密) • hvac (Vault 客户端) 项目结构初始化 key-rotation/ ├── src/ # 源代码 ├── tests/ # 单元测试 ├── config/ # 配置文件 ├── requirements.txt # 依赖清单

4.6 验证环境是否就绪

最后一步,写个简单的脚本验证所有组件能否正常协作:

# test_env.py
import boto3
from cryptography.fernet import Fernet
import hvac

def test_boto3():
    # 只是验证导入和基本调用,不实际连接 AWS
    client = boto3.client('secretsmanager', region_name='us-east-1')
    print("[OK] boto3 导入成功")

def test_cryptography():
    key = Fernet.generate_key()
    cipher = Fernet(key)
    encrypted = cipher.encrypt(b"Hello, key rotation!")
    decrypted = cipher.decrypt(encrypted)
    assert decrypted == b"Hello, key rotation!"
    print("[OK] cryptography 加解密测试通过")

def test_hvac():
    # 只是验证导入,不实际连接 Vault
    client = hvac.Client(url='http://localhost:8200')
    print("[OK] hvac 导入成功")

if __name__ == "__main__":
    test_boto3()
    test_cryptography()
    test_hvac()
    print("\n所有环境验证通过,可以开始写轮换脚本了!")

运行它:

python3 test_env.py

如果看到三行 [OK],恭喜你,环境准备完毕。接下来咱们就可以真正动手写密钥轮换逻辑了。

我的经验:把这个验证脚本放在项目根目录,每次换电脑或者拉新代码后先跑一遍。花 10 秒钟确认环境,能省下后面排查问题的几小时。