ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

AWS App Mesh 路由管理实战:aws-cli create-route 命令详解(gRPC / HTTP / HTTP/2 / TCP 路由配置)

2026/9/14 13:32:05 拓冰建站 浏览量
AWS App Mesh 路由管理实战:aws-cli create-route 命令详解(gRPC / HTTP / HTTP/2 / TCP 路由配置) AWS App Mesh 路由管理实战aws-cli create-route 命令详解gRPC / HTTP / HTTP/2 / TCP 路由配置【免费下载链接】aws-cliUniversal Command Line Interface for Amazon Web Services项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cliAWS App Mesh 是基于 Istio 服务网格的服务治理组件create-route是其在虚拟路由器Virtual Router上定义流量分发规则的核心操作。本文基于 aws-cli 仓库内置的官方示例文档awscli/examples/appmesh/create-route.rst和 App Mesh 服务模型定义awscli/botocore/data/appmesh/2019-01-25/service-2.json完整讲解如何通过aws appmesh create-route命令创建 gRPC、HTTP/HTTP/2、TCP 三类路由逐字段解读路由规范spec中的匹配规则、加权目标与重试策略并结合 aws-cli 源码说明--cli-input-json的工作机制。读完本文你可以直接复制示例 JSON 完成真实的路由创建并理解每个字段的取值约束与底层 API 行为。create-route 命令与 --cli-input-json 输入机制App Mesh 路由创建命令的标准用法是通过--cli-input-json传入一个 JSON 文件或 JSON 字符串作为完整请求体aws appmesh create-route \ --cli-input-json file://create-route-grpc.json--cli-input-json并非 App Mesh 特有参数而是 aws-cli 为绝大多数 API 操作注册的全局参数。其实现位于 awscli/customizations/cliinputjson.py核心行为在CliInputJSONArgument.add_to_call_parameters中调用 awscli/paramfile.py 的get_paramfile识别file://前缀——以该前缀开头则从本地文件读取内容否则直接按 JSON 字符串处理用json.loads解析解析失败会抛出形如Invalid JSON: ...的ParamError通过_update_call_parameters将 JSON 中的字段合并进调用参数且遵循命令行显式参数优先原则源码中if input_key not in call_parameters表明只有命令行未显式给出的参数才会被 JSON 值填充。因此推荐工作流是先用aws appmesh create-route --generate-cli-skeleton request生成骨架文件填写后再用file://传入。需要注意--cli-input-json不适用于带流式输出参数outfile的操作——add_cli_input_json中通过if outfile not in argument_table做了显式排除。CreateRoute 请求模型从服务模型 service-2.json 中的CreateRoute定义看该操作对应 HTTP 请求PUT /v20190125/meshes/{meshName}/virtualRouter/{virtualRouterName}/routesCreateRouteInput的字段构成如下字段类型/约束说明meshNameResourceName必填路由所属服务网格名称映射到 URI 路径routeNameResourceName必填路由名称specRouteSpec必填路由规范对象见下文详解virtualRouterNameResourceName必填路由挂载的虚拟路由器名称映射到 URI 路径meshOwnerAccountId可选网格属主的 AWS 账号 ID跨账号创建时需对方先共享网格查询参数传递clientToken幂等令牌可选至多 36 个字母、数字、连字符、下划线保证请求幂等tagsTagList可选标签列表key 最长 128 字符value 最长 256 字符该操作声明为idempotent: true可能的错误包括NotFoundException网格或虚拟路由器不存在、ConflictException路由已存在或版本冲突、LimitExceededException超出路由数量配额等排查失败时可按此对照。spec 对象四种路由类型与 priorityRouteSpec是路由规范的核心模型定义明确Specify one route type即四种路由对象四选一外加一个prioritygrpcRouteGrpcRoutegRPC 路由http2RouteHttpRouteHTTP/2 路由httpRouteHttpRouteHTTP 路由tcpRouteTcpRouteTCP 路由priorityRoutePriority路由优先级0 为最高优先级数值越小越先匹配示例文档中三个示例分别使用了priority100gRPC、200HTTP/2、300TCP体现了多路由共存时按数值从小到大依次匹配的排序惯例。创建 gRPC 路由metadata 匹配与三类重试策略gRPC 路由示例创建了一个名为grpcRoute的路由请求元数据metadata以123为前缀、服务名为com.amazonaws.services.ColorService、方法名为GetColor的 gRPC 流量全部路由到虚拟节点serviceBgrpc并配置了 gRPC/HTTP/TCP 三层重试策略——最多重试 3 次每次重试间延迟 15 秒。完整输入文件create-route-grpc.json{ meshName : apps, routeName : grpcRoute, spec : { grpcRoute : { action : { weightedTargets : [ { virtualNode : serviceBgrpc, weight : 100 } ] }, match : { metadata : [ { invert : false, match : { prefix : 123 }, name : myMetadata } ], methodName : GetColor, serviceName : com.amazonaws.services.ColorService }, retryPolicy : { grpcRetryEvents : [ deadline-exceeded ], httpRetryEvents : [ server-error, gateway-error ], maxRetries : 3, perRetryTimeout : { unit : s, value : 15 }, tcpRetryEvents : [ connection-error ] } }, priority : 100 }, virtualRouterName : serviceBgrpc }GrpcRouteMatch匹配规则字段约束来自服务模型serviceName要匹配的服务完全限定域名methodName要匹配的方法名。指定 methodName 时必须同时指定 serviceName这是模型文档明确说明的依赖关系metadatagRPC 元数据匹配列表每项含name元数据名、matchexact/prefix二选一与invert取反匹配port可选的端口匹配。retryPolicy三类重试事件各有其适用层grpcRetryEvents本例为deadline-exceeded针对 gRPC 协议错误httpRetryEventsserver-error、gateway-error针对 HTTP 层tcpRetryEventsconnection-error针对 TCP 连接层maxRetries控制最大重试次数perRetryTimeout以{unit, value}结构表达每次重试的超时/延迟本例 15 秒。命令返回的完整路由对象节选关键字段{ route: { meshName: apps, metadata: { arn: arn:aws:appmesh:us-west-2:123456789012:mesh/apps/virtualRouter/serviceBgrpc/route/grpcRoute, createdAt: 1572010806.008, lastUpdatedAt: 1572010806.008, uid: a1b2c3d4-5678-90ab-cdef-11111EXAMPLE, version: 1 }, routeName: grpcRoute, spec: { grpcRoute: { action: { weightedTargets: [ { virtualNode: serviceBgrpc, weight: 100 } ] }, match: { metadata: [ { invert: false, match: { prefix: 123 }, name: mymetadata } ], methodName: GetColor, serviceName: com.amazonaws.services.ColorService }, retryPolicy: { grpcRetryEvents: [ deadline-exceeded ], httpRetryEvents: [ server-error, gateway-error ], maxRetries: 3, perRetryTimeout: { unit: s, value: 15 }, tcpRetryEvents: [ connection-error ] } }, priority: 100 }, status: { status: ACTIVE }, virtualRouterName: serviceBgrpc } }返回值结构要点metadata.arn格式为arn:aws:appmesh:region:account:mesh/mesh/virtualRouter/router/route/route可作为后续 delete-route.rst、update-route.rst 等操作的定位依据metadata.version初始为 1每次成功更新递增App Mesh 路由采用乐观并发控制更新时需携带当前版本status.status新路由直接呈现ACTIVE状态一个小细节输入中 metadata 名为myMetadata输出中为mymetadata说明服务端对 gRPC 元数据名做了小写归一化写自动化比对逻辑时需注意。创建 HTTP / HTTP/2 路由header、method、prefix 组合匹配第二个示例创建 HTTP/2 路由其匹配条件为任意 URL 前缀prefix: / 请求头clientRequestId值以123开头 方法POST 协议http命中流量全部发到虚拟节点serviceBhttp2重试策略针对 HTTP 与 TCP 两层同样为 3 次重试、15 秒延迟。输入文件create-route-http2.json{ meshName: apps, routeName: http2Route, spec: { http2Route: { action: { weightedTargets: [ { virtualNode: serviceBhttp2, weight: 100 } ] }, match: { headers: [ { invert: false, match: { prefix: 123 }, name: clientRequestId } ], method: POST, prefix: /, scheme: http }, retryPolicy: { httpRetryEvents: [ server-error, gateway-error ], maxRetries: 3, perRetryTimeout: { unit: s, value: 15 }, tcpRetryEvents: [ connection-error ] } }, priority: 200 }, virtualRouterName: serviceBhttp2 }aws appmesh create-route \ --cli-input-json file://create-route-http2.jsonHttpRouteMatch的完整字段httpRoute与http2Route共用同一模型及约束字段说明prefix路径前缀匹配必须以/开头单独写/即匹配该虚拟服务的全部请求。示例虚拟服务my-service.local下prefix: /metrics匹配my-service.local/metrics的请求methodHTTP 方法匹配只能指定一个headers请求头匹配列表每项含name、matchexact/range/prefix、invertscheme协议匹配http/https仅对 HTTP/2 路由有效path精确路径匹配exact与prefix二选一queryParameters查询参数匹配port端口匹配注意 HTTP/2 与 HTTP 路由在 spec 层面的唯一差别就是键名将http2Route换成httpRoute即为创建 HTTP 路由官方示例原文亦如此说明其余字段结构一致但scheme字段仅在http2Route中有意义。返回结果与 gRPC 示例结构相同ARN 变为arn:aws:appmesh:us-west-2:123456789012:mesh/apps/virtualRouter/serviceBhttp2/route/http2Routestatus.status为ACTIVE。创建 TCP 路由用权重实现灰度发布TCP 路由没有 HTTP/gRPC 层的匹配条件其典型用途是按权重把流量切分到新旧两个虚拟节点。官方示例将 75% 流量路由到serviceBtcp25% 路由到serviceBv2tcp并明确指出调整权重直至 100% 流量到达新版本目标是灰度发布新版本的常用手法。输入文件create-route-tcp.json{ meshName: apps, routeName: tcpRoute, spec: { priority: 300, tcpRoute: { action: { weightedTargets: [ { virtualNode: serviceBtcp, weight: 75 }, { virtualNode: serviceBv2tcp, weight: 25 } ] } } }, virtualRouterName: serviceBtcp }aws appmesh create-route \ --cli-input-json file://create-route-tcp.json{ route: { meshName: apps, metadata: { arn: arn:aws:appmesh:us-west-2:123456789012:mesh/apps/virtualRouter/serviceBtcp/route/tcpRoute, createdAt: 1572011436.26, lastUpdatedAt: 1572011436.26, uid: a1b2c3d4-5678-90ab-cdef-11111EXAMPLE, version: 1 }, routeName: tcpRoute, spec: { priority: 300, tcpRoute: { action: { weightedTargets: [ { virtualNode: serviceBtcp, weight: 75 }, { virtualNode: serviceBv2tcp, weight: 25 } ] } } }, status: { status: ACTIVE }, virtualRouterName: serviceBtcp } }关于加权目标的通用说明action.weightedTargets是所有四类路由共用的流量分发动作GrpcRouteAction、HttpRouteAction、TcpRouteAction均引用VirtualNodeRouteTarget目标列表weight为相对权重实际流量占比由各目标权重占总权重之比决定。灰度发布后的调权操作应使用update-route而非删建官方示例 awscli/examples/appmesh/update-route.rst 展示了把 80/20 权重更新为新配比的完整流程更新后metadata.version从 1 递增到 2印证了版本递增机制。验证路由与前置条件检查创建路由前必须确保对应的 mesh 与 virtual router 已存在可参见 create-mesh.rst、create-virtual-router.rst、create-virtual-node.rst 等示例文档否则CreateRoute会因 URI 路径中的资源缺失而报NotFoundException。创建后可以用list-routes按虚拟路由器维度核对官方示例 awscli/examples/appmesh/list-routes.rst 的命令形式aws appmesh list-routes \ --mesh-name app1 \ --virtual-router-name vrServiceB返回routes列表每项包含arn、meshName、routeName、virtualRouterName可用于确认路由已挂载到正确的虚拟路由器。小结与适用前提create-route请求体必填四要素为meshName、routeName、spec、virtualRouterName推荐用--generate-cli-skeleton request生成骨架后经--cli-input-json file://...提交复杂嵌套结构metadata 匹配、重试策略用 JSON 文件远比逐个--spec参数可读四类路由通过 spec 中的键名区分grpcRoute/http2Route/httpRoute/tcpRoutepriority值越小优先级越高gRPC 路由匹配依赖serviceNamemethodName metadataHTTP 系路由匹配依赖prefix必须以/开头、method、headersscheme仅 HTTP/2 生效重试策略通过grpcRetryEvents/httpRetryEvents/tcpRetryEventsmaxRetriesperRetryTimeout组合表达命令执行基于本地服务模型版本 2019-01-25见 awscli/botocore/data/appmesh/2019-01-25/文中字段与约束均以该版本模型为准实际操作还需具备 App Mesh 的 IAM 权限与相应配额。【免费下载链接】aws-cliUniversal Command Line Interface for Amazon Web Services项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考