用 Amazon Bedrock AgentCore 构建可规模化的多智能体云迁移流水线

2026-08-21 29 预计阅读时间: 1 分钟
来源: aws.amazon.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:11 分钟

企业云迁移真正难的地方,通常不在于把一台服务器搬到云上,而在于如何持续完成资产发现、依赖分析、基础设施即代码生成、迁移治理,以及迁移后的运营。AWS Professional Services 的实践表明,可以基于 Amazon Bedrock AgentCore 组织一套多智能体框架,让不同 AI Agent 分别处理这些环节,并把结果串成端到端的迁移流程。

这种架构的价值不只是“让模型写 Terraform”。更重要的是,它把迁移工作拆成了有边界、可审计、可复用的专业任务,从而把 IaC 开发周期从数周压缩到数分钟级别,同时保留人工审批和治理控制点。

为什么要拆成多个 Agent

一个通用 Agent 很难同时理解 CMDB、网络拓扑、应用依赖、合规策略、Terraform 模块和生产运维。将所有能力堆在一个提示词里,往往会带来三个问题:上下文过长、输出难以验证,以及出现错误时无法定位责任环节。

多智能体方案可以按迁移生命周期划分职责:

  • Discovery Agent:读取资产清单、配置、日志和依赖关系,形成应用与基础设施画像。
  • IaC Agent:根据目标架构和组织模板生成 Terraform、CloudFormation 或其他 IaC 文件。
  • Governance Agent:检查命名、标签、成本、区域、权限和安全策略,并将结果提交审批。
  • Operations Agent:在迁移完成后处理健康检查、告警分析、运行手册和变更建议。

Amazon Bedrock AgentCore 可以作为这些 Agent 的运行基础,帮助团队组织模型调用、工具访问、运行时执行和企业系统集成。实际落地时,Agent 不应直接拥有无限权限,而应通过明确的工具接口访问 AWS API、代码仓库、CMDB 和工单系统。

一条迁移任务应该怎样流转

可以把一次迁移抽象为一组带状态的工件,而不是一段不可追踪的对话:

inventory.json
    -> discovery-report.json
    -> target-architecture.json
    -> terraform/
    -> governance-report.json
    -> approval
    -> deployment
    -> operations-runbook.md

每个阶段都应该满足三个条件:

  1. 输入和输出使用结构化格式,便于下一个 Agent 消费。
  2. 输出保留证据和决策理由,方便审计和人工复核。
  3. 具有幂等性,重复执行不会无意中创建重复资源或覆盖人工修改。

例如,Discovery Agent 不应只返回“这是一个三层 Web 应用”,而应输出应用 ID、发现时间、证据来源、依赖关系、置信度和待确认项。IaC Agent 也不应直接把代码部署到生产环境,而应把代码提交到分支,交给测试、策略扫描和审批流程。

可运行的多 Agent 编排示例

下面是一个不依赖 AWS 凭证的最小 Python 示例,用来演示迁移任务如何在多个专业 Agent 之间传递。它可以直接运行,也可以把各个函数替换成实际的 Bedrock AgentCore 调用、工具调用或工作流节点。

保存为 migration_pipeline.py 后运行 python migration_pipeline.py。示例中的 Agent 使用确定性逻辑模拟模型输出,接入真实环境时应增加身份认证、输入校验、策略扫描和人工审批。

from dataclasses import dataclass, field
from typing import Any, Dict, List
import json


@dataclass
class MigrationContext:
    inventory: Dict[str, Any]
    artifacts: Dict[str, Any] = field(default_factory=dict)
    audit_log: List[str] = field(default_factory=list)

    def record(self, agent: str, message: str) -> None:
        self.audit_log.append(f"{agent}: {message}")


def discovery_agent(ctx: MigrationContext) -> None:
    apps = ctx.inventory.get("applications", [])
    report = {
        "application_count": len(apps),
        "applications": [
            {
                "name": app["name"],
                "tier": app.get("tier", "unknown"),
                "dependencies": app.get("dependencies", []),
                "confidence": 0.95 if app.get("dependencies") else 0.70,
            }
            for app in apps
        ],
        "open_questions": [
            "确认生产数据库是否需要跨可用区部署",
            "确认应用是否允许在目标区域使用托管服务",
        ],
    }
    ctx.artifacts["discovery_report"] = report
    ctx.record("discovery", "generated discovery report")


def iac_agent(ctx: MigrationContext) -> None:
    report = ctx.artifacts["discovery_report"]
    resources = []
    for app in report["applications"]:
        resources.append({
            "resource": "aws_ecs_service",
            "name": app["name"].replace("-", "_"),
            "desired_count": 2,
            "depends_on": app["dependencies"],
        })

    ctx.artifacts["iac_plan"] = {
        "format": "terraform-plan-input",
        "resources": resources,
        "requires_review": bool(report["open_questions"]),
    }
    ctx.record("iac", f"generated {len(resources)} infrastructure resources")


def governance_agent(ctx: MigrationContext) -> None:
    plan = ctx.artifacts["iac_plan"]
    violations = []
    for resource in plan["resources"]:
        if resource["desired_count"] < 2:
            violations.append(f"{resource['name']}: desired_count must be at least 2")

    ctx.artifacts["governance_report"] = {
        "status": "pass" if not violations else "fail",
        "violations": violations,
        "approval_required": plan["requires_review"],
    }
    ctx.record("governance", ctx.artifacts["governance_report"]["status"])


def operations_agent(ctx: MigrationContext) -> None:
    ctx.artifacts["operations_runbook"] = {
        "health_checks": ["service availability", "error rate", "latency", "database connections"],
        "rollback": "restore the previous deployment and verify data consistency",
        "owner": "cloud-platform-team",
    }
    ctx.record("operations", "generated post-migration runbook")


def main() -> None:
    inventory = {
        "applications": [
            {"name": "orders-api", "tier": "backend", "dependencies": ["orders-db"]},
            {"name": "orders-db", "tier": "database", "dependencies": []},
        ]
    }
    ctx = MigrationContext(inventory=inventory)
    discovery_agent(ctx)
    iac_agent(ctx)
    governance_agent(ctx)

    if ctx.artifacts["governance_report"]["status"] == "pass":
        operations_agent(ctx)
    else:
        ctx.record("orchestrator", "blocked deployment because governance failed")

    print(json.dumps({"artifacts": ctx.artifacts, "audit_log": ctx.audit_log}, indent=2))


if __name__ == "__main__":
    main()

在真实的 AgentCore 工作流中,可以把 discovery_agentiac_agent 等函数映射为独立 Agent,把 inventory、代码仓库、Terraform 校验器和审批系统作为受控工具。编排器只负责传递任务状态和工件,不负责替每个 Agent 做所有领域判断。

从自动生成到可治理交付

迁移自动化的边界必须提前定义。适合交给 Agent 的工作包括:

  • 根据标准模块生成重复性的 Terraform 资源。
  • 汇总 CMDB、日志和扫描结果,形成资产画像。
  • 对 IaC 运行格式化、静态检查、成本估算和策略验证。
  • 根据监控指标生成运行手册初稿和常见故障处理建议。

需要人工参与或更严格保护的工作包括:

  • 生产网络、身份权限和数据迁移策略的最终批准。
  • 无法确认依赖关系时的架构选择。
  • 涉及删除资源、修改数据或扩大权限的操作。
  • 低置信度发现结果的确认。

建议为每个 Agent 设置最小权限 IAM 角色,并把“生成”和“执行”分成两个阶段。生成阶段可以创建分支和计划文件;执行阶段必须经过自动化测试、策略扫描和明确审批。对于高风险工具,可以要求 Agent 只生成命令,由人工或受控流水线执行。

落地时的检查清单

  • 先定义迁移工件格式,再选择 Agent 数量。
  • 给发现结果记录证据来源、置信度和待确认问题。
  • 为 IaC Agent 提供组织认可的模块、命名规则和标签策略。
  • 将 Terraform plan、策略扫描、成本估算和安全检查放入交付流水线。
  • 使用版本化提示词、工具定义和模型配置,保证结果可回放。
  • 记录每次 Agent 调用、工具参数、输出和人工决策。
  • 为删除、权限变更和生产部署设置人工审批或双重确认。
  • 用成功率、返工率、人工审批耗时和迁移后故障率衡量实际收益。

多智能体架构并不会自动消除云迁移的复杂性。它的作用是把复杂工作拆成可验证的专业步骤,并让重复劳动变得更快。当 AgentCore 与结构化工件、最小权限、自动化测试和人工治理结合起来时,企业才能在扩大迁移规模的同时控制风险,而不是把风险一起自动化。


相关推荐