AWS 服务网格:App Mesh 迁移与 ECS Service Connect
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
本文缩写(英文全称与中文含义)
| 缩写 | 英文全称/名称 | 中文含义 |
|---|---|---|
| API | Application Programming Interface | 应用程序编程接口 |
| ARN | Amazon Resource Name | AWS 资源名称,用于唯一标识资源 |
| AWS | Amazon Web Services | 亚马逊云服务 |
| AZ | Availability Zone | 可用区 |
| CA | Certificate Authority | 证书颁发机构 |
| CLI | Command-Line Interface | 命令行接口 |
| CPU | Central Processing Unit | 中央处理器 |
| DNS | Domain Name System | 域名系统 |
| ECR | Elastic Container Registry | AWS 容器镜像仓库 |
| ECS | Elastic Container Service | AWS 容器编排服务 |
| EKS | Elastic Kubernetes Service | AWS 托管 Kubernetes 服务 |
| HTTP | Hypertext Transfer Protocol | 超文本传输协议 |
| JSON | JavaScript Object Notation | 一种结构化数据格式 |
| KMS | Key Management Service | 密钥管理服务 |
| SG | Security Group | 安全组 |
| SPIFFE | Secure Production Identity Framework for Everyone | 分布式工作负载身份标准 |
| TLS | Transport Layer Security | 传输层安全协议 |
| VPC | Virtual Private Cloud | 虚拟私有云网络 |
2026-09-23 核对:AWS App Mesh 将于 2026-09-30 停止支持,新项目不再以它作为建设目标。AWS 公告
| 工作负载 | 路径 | 边界 |
|---|---|---|
| EKS | Istio / Linkerd | 自行运营控制面、数据面与证书 |
| ECS | Service Connect | 服务发现、代理通信、指标、可选 TLS;不是全部 Istio 能力 |
| 跨 VPC/账号服务入口 | VPC Lattice / PrivateLink | 不等于 Pod 级 mesh 与细粒度服务授权 |
| 存量 App Mesh | 清点→并行新环境→验证→切流 | 不原地删除代理后期待流量自动恢复 |
1. 存量盘点和迁移关口#
set -euo pipefail
export AWS_REGION='REPLACE_REGION'
aws sts get-caller-identity
aws appmesh list-meshes --region "$AWS_REGION" > meshes.json
export MESH='REPLACE_EXISTING_MESH'
aws appmesh list-virtual-nodes --mesh-name "$MESH" > virtual-nodes.json
aws appmesh list-virtual-services --mesh-name "$MESH" > virtual-services.json
aws appmesh list-virtual-routers --mesh-name "$MESH" > virtual-routers.json
aws appmesh list-virtual-gateways --mesh-name "$MESH" > virtual-gateways.json继续逐项 describe 并导出 router routes/gateway routes;整理真实调用拓扑、DNS、协议、超时重试、熔断、证书/SPIFFE、出口限制、跨账号和可观测标签。为每条规则写目标实现与验收用例,尤其不要把 Service Connect TLS 当作等价的应用级调用授权。EKS 在独立试点 namespace/新集群按 Istio 篇部署;禁止同 Pod 注入 App Mesh 和 Istio 两套流量拦截。
2. ECS 企业 Hands-on 前置#
使用独立预生产 ECS cluster,已有真实 orders-api 与调用方 orders-worker 服务,ECS deployment controller、awsvpc、私有子网、多 AZ、desiredCount≥2、应用探针和 CloudWatch 日志。App Mesh 迁移使用独立新服务,先从任务定义移除旧代理/依赖和 App Mesh 专属配置。
准备:Cloud Map namespace ARN;API task definition 的 HTTP 8080 portMapping 命名 orders-http,appProtocol=http;为代理留 CPU/内存。调用方任务必须也启用 Service Connect。SG 仅允许调用方任务到 API 代理监听端口,DNS、ECR、日志、Secrets 等出口可达。禁止把 namespace 当成安全隔离边界。
TLS 使用已 ACTIVE 的企业 AWS Private CA,带 AmazonECSManaged=true 标签;基础设施角色信任 ecs.amazonaws.com,按官方 Service Connect TLS managed policy及资源范围配置。执行者仅可 PassRole 该角色。CA、Secrets Manager、KMS 有费用;密钥策略/CA 权限由平台管理员预置并验收。TLS 前提、角色策略
3. 启用服务端,再启用调用方#
export CLUSTER='REPLACE_STAGING_CLUSTER'
export NS_ARN='REPLACE_CLOUDMAP_NAMESPACE_ARN'
export CA_ARN='REPLACE_ACTIVE_PRIVATE_CA_ARN'
export TLS_ROLE_ARN='REPLACE_ECS_INFRASTRUCTURE_ROLE_ARN'
export API_TASK_DEF='REPLACE_REVIEWED_TASK_DEFINITION_ARN_WITH_REVISION'
aws ecs describe-services --cluster "$CLUSTER" --services orders-api orders-worker > services-before.json
jq -n --arg ns "$NS_ARN" --arg ca "$CA_ARN" --arg role "$TLS_ROLE_ARN" --arg region "$AWS_REGION" '{enabled:true,namespace:$ns,services:[{portName:"orders-http",discoveryName:"orders-api",clientAliases:[{dnsName:"orders-api",port:8080}],tls:{issuerCertificateAuthority:{awsPcaAuthorityArn:$ca},roleArn:$role}}],logConfiguration:{logDriver:"awslogs",options:{"awslogs-group":"/ecs/service-connect","awslogs-region":$region,"awslogs-stream-prefix":"proxy"}}}' > sc-server.json先创建 /ecs/service-connect 日志组并设置企业 retention/KMS;executionRole 可写该日志组。审核 JSON、CA 状态和代理端口后:
aws ecs update-service --cluster "$CLUSTER" --service orders-api --task-definition "$API_TASK_DEF" --deployment-configuration 'minimumHealthyPercent=100,maximumPercent=200,deploymentCircuitBreaker={enable=true,rollback=true}' --service-connect-configuration file://sc-server.json
aws ecs wait services-stable --cluster "$CLUSTER" --services orders-api
jq -n --arg ns "$NS_ARN" '{enabled:true,namespace:$ns}' > sc-client.json
aws ecs update-service --cluster "$CLUSTER" --service orders-worker --service-connect-configuration file://sc-client.json --force-new-deployment
aws ecs wait services-stable --cluster "$CLUSTER" --services orders-worker调用方配置目标为 http://orders-api:8080,随新的任务 revision 发布;服务端先创建,调用方再重建,以获取新端点配置。应用到本地代理仍可为 HTTP,代理间按 TLS 配置加密;不能凭 URL 的 http 判断跨任务未加密。组件与部署顺序
4. 企业验收和回退#
使用真实 worker 创建/查询订单,核对 API 日志、代理连接/5xx/延迟、证书签发与轮换;测试错误用户权限仍被应用拒绝、未授权 SG 调用失败。停止一台 API task,连续业务不丢单;演练 CA/KMS 权限错误时部署失败与告警。services-stable 只是调度状态,不证明 TLS/业务通过。
流量切换采用独立旧/新业务入口与 分批发布,先合成租户→小比例→全量;需要加权路由时在已验证入口实现,不假设 Service Connect 提供 App Mesh 所有路由功能。
失败先切回旧入口,核对旧环境容量;再从 services-before.json 恢复调用方旧 taskDefinition/Service Connect 配置并滚动,随后恢复服务端。不要先停新服务端导致新客户端断连。App Mesh 退休后不能把它作为长期回退方案;提前完成替代环境演练,保留可独立恢复的镜像、配置和数据备份。