Strands Agents SDK 上手:用 Python 写一个能调 AWS 服务的 AI Agent

Strands Agents SDK 上手:用 Python 写一个能调 AWS 服务的 AI Agent

"我想写一个 Agent,能帮我查 CloudWatch 告警、拉 S3 文件、顺便总结一下。"

这个需求说起来简单,但自己从零撸一个 Agent 框架要处理的事一大堆——工具注册、上下文管理、多轮对话状态、错误重试、token 限制……

亚马逊云科技最近开源了 Strands Agents SDK,我试了一下,核心卖点是:用 Python 写 Agent 像写普通函数一样简单,底层帮你处理了所有编排逻辑

先看效果

from strands import Agent
from strands.models.bedrock import BedrockModel
from strands_tools import retrieve_from_knowledge_base, current_time

# 一行创建 Agent
agent = Agent(
    model=BedrockModel(model_id="anthropic.claude-sonnet-4-20250514-v1:0"),
    tools=[retrieve_from_knowledge_base, current_time]
)

# 直接对话
response = agent("帮我查一下知识库里关于 S3 生命周期策略的最佳实践")
print(response)

就这么几行。SDK 自动处理了:

  • 模型调用和流式响应
  • 工具发现和参数匹配
  • 多轮对话上下文维护
  • 工具调用结果注入

安装

pip install strands-agents strands-agents-tools

依赖很轻,核心包不到 5MB。strands-agents-tools 是官方工具集,包含文件操作、Shell 执行、知识库检索等常用工具。

核心概念

Strands 的设计哲学是模型驱动的编排——不用你写 if/else 决定"什么时候该调什么工具",让模型自己决定。

1. Agent = Model + Tools + System Prompt

from strands import Agent
from strands.models.bedrock import BedrockModel

model = BedrockModel(
    model_id="anthropic.claude-sonnet-4-20250514-v1:0",
    region_name="us-east-1"
)

agent = Agent(
    model=model,
    system_prompt="你是一个 AWS 运维助手,帮用户排查云上问题。回答要简洁直接。",
    tools=[...]
)

2. 自定义工具用装饰器

from strands import tool

@tool
def check_ec2_status(instance_id: str) -> dict:
    """检查 EC2 实例的运行状态
    
    Args:
        instance_id: EC2 实例 ID,格式如 i-0123456789abcdef0
    """
    import boto3
    ec2 = boto3.client("ec2")
    response = ec2.describe_instances(InstanceIds=[instance_id])
    state = response["Reservations"][0]["Instances"][0]["State"]["Name"]
    return {"instance_id": instance_id, "state": state}


@tool
def get_cloudwatch_alarms(state: str = "ALARM") -> list:
    """获取当前触发的 CloudWatch 告警列表
    
    Args:
        state: 告警状态过滤,默认只看 ALARM 状态
    """
    import boto3
    cw = boto3.client("cloudwatch")
    response = cw.describe_alarms(StateValue=state)
    return [
        {"name": a["AlarmName"], "reason": a["StateReason"]}
        for a in response["MetricAlarms"]
    ]

关键点:

  • @tool 装饰器自动从 docstring 和类型标注生成工具描述
  • 函数名就是工具名
  • 返回值会被序列化后注入模型上下文

3. 多轮对话

# Agent 默认维护对话历史
agent("我有个 EC2 实例 i-0abc123 好像挂了")
# → Agent 调用 check_ec2_status,返回 stopped

agent("帮我看看有没有相关的告警")
# → Agent 调用 get_cloudwatch_alarms,关联上下文返回结果

agent("重启它")
# → Agent 知道"它"是 i-0abc123,调用对应操作

上下文自动维护,不用手动管 message history。

实战:运维巡检 Agent

把上面的工具组合起来,搭一个能做日常巡检的 Agent:

from strands import Agent, tool
from strands.models.bedrock import BedrockModel
import boto3

@tool
def list_unhealthy_targets(target_group_arn: str) -> list:
    """检查 ALB Target Group 中不健康的目标"""
    elb = boto3.client("elbv2")
    response = elb.describe_target_health(TargetGroupArn=target_group_arn)
    unhealthy = [
        t for t in response["TargetHealthDescriptions"]
        if t["TargetHealth"]["State"] != "healthy"
    ]
    return unhealthy


@tool
def get_recent_errors(log_group: str, minutes: int = 30) -> list:
    """从 CloudWatch Logs 获取最近的 ERROR 级别日志"""
    import time
    logs = boto3.client("logs")
    end_time = int(time.time() * 1000)
    start_time = end_time - (minutes * 60 * 1000)
    
    response = logs.filter_log_events(
        logGroupName=log_group,
        startTime=start_time,
        endTime=end_time,
        filterPattern="ERROR"
    )
    return [{"message": e["message"][:200], "timestamp": e["timestamp"]} 
            for e in response["events"][:10]]


# 组装 Agent
ops_agent = Agent(
    model=BedrockModel(model_id="anthropic.claude-sonnet-4-20250514-v1:0"),
    system_prompt="""你是 AWS 运维巡检助手。职责:
1. 检查服务健康状态
2. 发现异常时主动排查根因
3. 给出修复建议(但不自动执行危险操作)
回答用中文,简洁直接。""",
    tools=[check_ec2_status, get_cloudwatch_alarms, 
           list_unhealthy_targets, get_recent_errors]
)

# 使用
result = ops_agent("帮我做一轮巡检,看看有没有告警和不健康的服务")
print(result)

和 LangChain / CrewAI 的区别

特性 Strands LangChain CrewAI
编排方式 模型驱动 代码驱动(Chain/Graph) 角色驱动
学习曲线 低(装饰器 + 对话) 高(大量抽象层)
AWS 集成 原生(Bedrock 直连) 需额外适配 需额外适配
适合场景 工具调用型 Agent 复杂 DAG 工作流 多角色协作

Strands 的定位很明确:不做复杂编排,就把"模型+工具"这件事做好。如果你的 Agent 主要是调工具干活,Strands 够用而且上手快。如果需要复杂的 DAG 流程编排,还是得看 Step Functions 或者 LangGraph。

部署到 AgentCore

写完 Agent 可以直接部署到 Bedrock AgentCore 托管运行:

# 打包
strands deploy \
  --agent-name "ops-patrol" \
  --runtime python3.12 \
  --entry main.py \
  --region us-east-1

部署后通过 AgentCore API 调用,自带负载均衡、版本管理、监控。

参考链接

posted @ 2026-06-10 20:08  亚马逊云开发者  阅读(12)  评论(0)    收藏  举报