Python AWS SDK:Boto3 完全指南

在 Python 云原生开发领域,几乎绕不开一个名字:
Boto3

它是 Amazon Web Services 官方提供的 Python SDK,用于操作 AWS 的各种云服务。

无论是:

  • 操作 S3 对象存储
  • 启动 EC2 云服务器
  • 管理 IAM 权限
  • 调用 DynamoDB(亚马逊云科技(AWS)推出的一款完全托管的 NoSQL 数据库服务)
  • 上传文件
  • 管理 Lambda
  • 自动化云资源

Boto3 都是 Python 开发者的核心工具。


什么是 Boto3?

Boto3 是 AWS 官方推出的:

Python SDK for AWS

它让 Python 程序可以直接调用 AWS API。

官方文档:

Boto3 官方文档

AWS 官网:

AWS 官方网站


为什么叫 Boto3?

Boto 的历史:

名称 说明
boto 第一代 AWS Python SDK
boto2 第二代版本
boto3 当前主流版本

现在 AWS 官方推荐全部使用:

  • boto3
  • botocore

旧版 boto 已逐渐淘汰。


Boto3 能做什么?

几乎所有 AWS 服务都能调用。

常见场景:

AWS 服务 用途
S3 对象存储
EC2 云服务器
Lambda Serverless
DynamoDB NoSQL 数据库
IAM 权限管理
CloudWatch 监控
SNS(Simple Notification Service,简单通知服务) 消息通知
SQS 消息队列
EKS Kubernetes
Secrets Manager 密钥管理

Boto3 架构

Boto3 的核心结构:

Python App
    ↓
Boto3
    ↓
Botocore
    ↓
AWS REST API

其中:

组件 作用
boto3 高级 SDK
botocore 底层请求处理
AWS API 真正云服务接口

安装 Boto3

使用 pip:

pip install boto3

验证:

python -c "import boto3; print(boto3.__version__)"

AWS 凭证配置

Boto3 调用 AWS 必须具备认证信息。

常见配置方式:

方法一:AWS CLI 配置(推荐)

安装:

pip install awscli

配置:

aws configure

输入:

AWS Access Key ID
AWS Secret Access Key
Region
Output format

默认会生成:

~/.aws/credentials
~/.aws/config

方法二:环境变量

export AWS_ACCESS_KEY_ID=xxx
export AWS_SECRET_ACCESS_KEY=xxx
export AWS_DEFAULT_REGION=ap-southeast-1

方法三:代码中指定(不推荐)

import boto3

client = boto3.client(
    "s3",
    aws_access_key_id="xxx",
    aws_secret_access_key="xxx"
)

生产环境通常不建议。


Boto3 两种核心接口

Boto3 有两个重要概念:

类型 特点
client 底层 API
resource 高级对象封装

client 示例

创建 S3 Client

import boto3

s3 = boto3.client("s3")

上传文件:

s3.upload_file(
    "demo.txt",
    "my-bucket",
    "demo.txt"
)

列出 Bucket:

response = s3.list_buckets()

for bucket in response["Buckets"]:
    print(bucket["Name"])

注:bucket 是 Amazon S3(Simple Storage Service)中的一个“存储桶”(Bucket)对象,它是 AWS S3 中用于组织和存储对象(如文件)的逻辑容器。


resource 示例

import boto3

s3 = boto3.resource("s3")

遍历 Bucket:

for bucket in s3.buckets.all():
    print(bucket.name)

Client vs Resource

对比 client resource
抽象级别 低级 高级
灵活性 更强 更方便
API 完整度 全部支持 部分服务支持
推荐场景 生产系统 快速开发

很多 AWS 新服务:

只提供 client。

因此:

实际生产里 client 更常见。


S3 操作示例

创建 Bucket

import boto3

s3 = boto3.client("s3")

s3.create_bucket(
    Bucket="my-demo-bucket"
)

上传文件

s3.upload_file(
    "photo.jpg",
    "my-demo-bucket",
    "images/photo.jpg"
)

下载文件

s3.download_file(
    "my-demo-bucket",
    "images/photo.jpg",
    "local.jpg"
)

删除对象

s3.delete_object(
    Bucket="my-demo-bucket",
    Key="images/photo.jpg"
)

DynamoDB 示例

创建客户端

import boto3

dynamodb = boto3.resource("dynamodb")

获取表

table = dynamodb.Table("users")

写入数据

table.put_item(
    Item={
        "user_id": "1001",
        "name": "Tom",
        "age": 20
    }
)

查询数据

response = table.get_item(
    Key={
        "user_id": "1001"
    }
)

print(response["Item"])

EC2 示例

查看实例

import boto3

ec2 = boto3.client("ec2")

response = ec2.describe_instances()

print(response)

Lambda 示例

调用 Lambda

import boto3
import json

lambda_client = boto3.client("lambda")

response = lambda_client.invoke(
    FunctionName="demo-function",
    Payload=json.dumps({
        "hello": "world"
    })
)

print(response)

Session 概念

大型项目推荐使用 Session。

import boto3

session = boto3.Session(
    profile_name="prod",
    region_name="ap-southeast-1"
)

s3 = session.client("s3")

优势:

  • 多账号切换
  • 多 Region 管理
  • 更清晰的权限隔离

分页器(Paginator)

AWS 很多 API 默认分页。

例如:

response = s3.list_objects_v2(
    Bucket="demo"
)

数据可能不完整。

因此推荐:

paginator = s3.get_paginator("list_objects_v2")

pages = paginator.paginate(
    Bucket="demo"
)

for page in pages:
    for obj in page.get("Contents", []):
        print(obj["Key"])

Waiter(等待器)

AWS 很多资源创建是异步的。

例如:

  • EC2 启动
  • RDS 创建
  • ECS 部署

Waiter 可以等待状态完成。

waiter = ec2.get_waiter("instance_running")

waiter.wait(
    InstanceIds=["i-123456"]
)

异常处理

Boto3 的异常很重要。

import botocore

try:
    s3.create_bucket(Bucket="demo")
except botocore.exceptions.ClientError as e:
    print(e)

IAM 权限的重要性

Boto3 的本质:

用程序调用 AWS API

因此权限控制非常关键。

推荐原则:

最小权限原则

不要直接:

AdministratorAccess

应该:

  • 仅允许需要的 API
  • 限制资源范围
  • 限制 Region

常见最佳实践

使用 IAM Role

不要硬编码 AK/SK

AK/SK (Access Key/Secret Key) 是AWS的身份验证凭证,硬编码在代码中会带来严重的安全风险。

推荐的安全替代方案:

  • EC2 IAM Role - EC2 IAM角色:为EC2实例分配的IAM角色,允许实例上的应用程序安全地调用AWS服务,无需存储凭证

  • EKS IRSA - EKS IAM角色服务账户 (IAM Roles for Service Accounts):为Kubernetes服务账户分配IAM角色,使Pod能够获得临时安全凭证

  • ECS Task Role - ECS任务角色:为ECS任务定义的IAM角色,允许容器中的应用程序访问AWS服务

  • Lambda Execution Role - Lambda执行角色:为Lambda函数分配的IAM角色,提供函数执行时所需的权限

这些基于角色的方法使用临时安全凭证,大大提高了安全性,避免了长期凭证泄露的风险。


使用 Session

大型项目避免全局 client。


重试机制

AWS API 可能限流:

ThrottlingException

应做好:

  • exponential backoff
  • retry

使用连接池

高并发场景:

from botocore.config import Config

config = Config(
    max_pool_connections=50
)

s3 = boto3.client(
    "s3",
    config=config
)

Boto3 的底层:Botocore

Boto3 实际依赖:

Botocore

Botocore 负责:

  • 请求签名
  • HTTP 请求
  • Retry
  • Endpoint
  • 凭证加载

Boto3 的优势

AWS 官方支持

兼容性最好。


服务覆盖最全

AWS 新服务上线后:

Boto3 通常第一时间支持。


Python 生态集成好

适合:

  • Flask
  • Django
  • FastAPI
  • Airflow
  • Celery
  • 数据平台
  • DevOps 自动化

Boto3 的缺点

学习曲线偏陡

AWS 服务本身复杂。


API 命名较长

例如:

describe_db_cluster_snapshots

非常 AWS 风格。


文档量巨大

AWS 文档非常庞大。


常见应用场景

DevOps 自动化

自动:

  • 创建资源
  • 部署系统
  • 管理权限

数据平台

处理:

  • S3
  • Athena
  • Glue
  • Redshift

云原生系统

集成:

  • Lambda
  • EventBridge
  • SQS
  • SNS

AI/ML

调用:

  • SageMaker
  • Bedrock
  • Rekognition

与其他 AWS SDK 对比

SDK 语言
boto3 Python
aws-sdk-js JavaScript
aws-sdk-go-v2 Go
aws-sdk-java-v2 Java
aws-sdk-rust Rust

其中:

Boto3 是最流行 AWS SDK 之一。


学习路线推荐

建议顺序:

AWS 基础
    ↓
IAM 权限
    ↓
S3
    ↓
EC2
    ↓
Lambda
    ↓
DynamoDB
    ↓
自动化脚本

总结

Boto3 是 Python 世界操作 AWS 的标准方案。

它的核心价值:

  • AWS 自动化
  • 云资源管理
  • DevOps
  • Serverless
  • 数据平台
  • 云原生开发

可以理解为:

“Python 与 AWS 云平台之间的桥梁”

如果你正在:

  • 学习 AWS
  • 做云原生开发
  • 构建自动化平台
  • 编写运维脚本
  • 开发 Serverless 系统

那么 Boto3 几乎是必学技能。

更多推荐