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 本章知识体系总览
下面这张图把咱们刚才做的事串起来了。你可以把它当作一个检查清单:
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 秒钟确认环境,能省下后面排查问题的几小时。