本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon App Mesh 和 Amazon 入门 ECS
重要
终止支持通知:2026 年 9 月 30 日, Amazon 将停止对的支持。 Amazon App Mesh 2026 年 9 月 30 日之后,您将无法再访问 Amazon App Mesh 控制台或 Amazon App Mesh 资源。如需了解更多信息,请访问此博客文章从迁移 Amazon App Mesh 到 Amazon S ECS ervice Connect
本主题可帮助您 Amazon App Mesh 使用在 Amazon 上运行的实际服务ECS。本教程介绍了多种 App Mesh 资源类型的基本功能。
场景
为了说明如何配合使用 App Mesh,假定您有一个具有以下功能的应用程序:
-
由名为
serviceA
和serviceB
的两项服务组成。 -
这两项服务均注册到名为
apps.local
的命名空间。 -
ServiceA
与 HTTP /2、端口 8serviceB
0 进行通信。 -
您已部署
serviceB
的版本 2,并采用名称serviceBv2
在apps.local
命名空间中注册了该服务。
您的要求如下:
-
您想将 75% 的流量从发送
serviceA
到serviceB
,将 25% 的流量发送到serviceBv2
第一个。通过仅向发送25%的流量serviceBv2
,您就可以在发送来自的100%的流量之前验证它是否没有错误serviceA
。 -
您希望能够轻松调整流量权重,以便一旦证明
serviceBv2
可靠便可将 100% 的流量发送到该服务。将所有流量发送到serviceBv2
后,您希望弃用serviceB
。 -
您不想为了满足之前的要求而更改实际服务的任何现有应用程序代码或服务发现注册。
为了满足您的要求,您决定创建包含虚拟服务、虚拟节点、虚拟路由器和路由的 App Mesh 服务网格。实施您的网格后,更新使用 Envoy 代理的服务。更新后,您的服务将通过 Envoy 代理相互通信,而不是直接相互通信。
先决条件
重要
终止支持通知:2026 年 9 月 30 日, Amazon 将停止对的支持。 Amazon App Mesh 2026 年 9 月 30 日之后,您将无法再访问 Amazon App Mesh 控制台或 Amazon App Mesh 资源。如需了解更多信息,请访问此博客文章从迁移 Amazon App Mesh 到 Amazon S ECS ervice Connect
-
已了解 App Mesh 概念。有关更多信息,请参阅 什么是 Amazon App Mesh?。
-
对亚马逊ECSs概念的现有理解。有关更多信息,请参阅《亚马逊弹性容器服务开发者指南》ECS中的 “什么是亚马逊”。
-
App Mesh 支持在DNS Amazon Cloud Map、或两者中注册的 Linux 服务。要使用本入门指南,我们建议您注册三项现有服务DNS。该主题的剩余步骤假定现有服务命名为
serviceA
、serviceB
和serviceBv2
,并且可以在名为apps.local
的命名空间中发现所有服务。即使服务不存在,您也可以创建服务网格及其资源,但在部署实际服务之前,您无法使用网格。有关在 Amazon 上发现服务的更多信息ECS,请参阅服务发现。要创建带有ECS服务发现功能的 Amazon 服务,请参阅教程:使用服务发现创建服务。如果您尚未运行服务,则可以创建带有服务发现功能的 Amazon ECS 服务。
步骤 1:创建网格和虚拟服务
服务网格是一种用于驻留在其内的服务之间的网络流量的逻辑边界。有关更多信息,请参阅 服务网格。虚拟服务是实际服务的抽象。有关更多信息,请参阅 虚拟服务。
创建以下 资源:
-
名为
apps
的网格,因为此场景中的所有服务均注册到apps.local
命名空间。 -
名为
serviceb.apps.local
的虚拟服务,因为虚拟服务表示可以使用该名称发现的服务,并且您不希望更改代码以引用其他名称。稍后的步骤中将添加名为servicea.apps.local
的虚拟服务。
您可以使用或 1.18.116 Amazon Web Services Management Console 或更高 Amazon CLI 版本或 2.0.38 或更高版本来完成以下步骤。如果使用 Amazon CLI,请使用aws --version
命令检查已安装的 Amazon CLI 版本。如果您没有安装版本 1.18.116 或更高版本或者没有安装版本 2.0.38 或更高版本,则必须安装或更新 Amazon CLI。选择要使用的工具所对应的选项卡。
步骤 2:创建虚拟节点
虚拟节点充当实际服务的逻辑指针。有关更多信息,请参阅 虚拟节点。
创建名为 serviceB
的虚拟节点,因为某个虚拟节点表示名为 serviceB
的实际服务。可使用主机名 serviceb.apps.local
,通过 DNS
发现虚拟节点所表示的实际服务。或者,您可以使用发现实际的服务。 Amazon Cloud Map虚拟节点将在端口 80 上使用 HTTP /2 协议监听流量。此外,还支持其他协议和运行状况检查。您将在后面的步骤中为 serviceBv2
和 serviceA
创建虚拟节点。
步骤 3:创建虚拟路由器和路由
虚拟路由器路由网格中一个或多个虚拟服务的流量。有关更多信息,请参阅虚拟路由器 和路线。
创建以下 资源:
-
名为
serviceB
的虚拟路由器,因为serviceB.apps.local
虚拟服务不会启动与任何其他服务的出站通信。请记住,您之前创建的虚拟服务是实际serviceb.apps.local
服务的抽象。虚拟服务将流量发送到虚拟路由器。虚拟路由器在端口 80 上使用 HTTP /2 协议监听流量。此外,还支持其他协议。 -
名为
serviceB
的路由。它将 100% 的流量路由到serviceB
虚拟节点。添加serviceBv2
虚拟节点后,在稍后的步骤中出现权重。虽然本指南中未作介绍,但您可以为路由添加额外的筛选条件,并添加重试策略,从而使 Envoy 代理在遇到通信问题时会多次尝试将流量发送到虚拟节点。
步骤 4:审核并创建
根据之前的说明审核设置。
步骤 5:创建其他资源
要完成此场景,您需要执行以下操作:
-
创建名为
serviceBv2
的虚拟节点,以及名为serviceA
的虚拟节点。两个虚拟节点都通过 HTTP /2 端口 80 监听请求。对于serviceA
虚拟节点,将后端配置为serviceb.apps.local
。来自serviceA
虚拟节点的所有出站流量都将发送到名为serviceb.apps.local
的虚拟服务。虽然本指南中未作介绍,但您还可以为虚拟节点指定用于写入访问日志的文件路径。 -
另外创建一个名为的虚拟服务
servicea.apps.local
,该服务将所有流量直接发送到serviceA
虚拟节点。 -
更新在上一步中创建的
serviceB
路由,以将 75% 的流量发送到serviceB
虚拟节点,将 25% 的流量发送到serviceBv2
虚拟节点。随着时间的推移,您可以继续修改权重,直到serviceBv2
收到 100% 的流量。将所有流量发送到serviceBv2
后,您可以关闭并弃用serviceB
虚拟节点和实际服务。在更改权重时,不需要对代码进行任何修改,因为serviceb.apps.local
虚拟服务名称和实际服务名称没有改变。回想一下,serviceb.apps.local
虚拟服务将流量发送到虚拟路由器,该路由器将流量路由到虚拟节点。虚拟节点的服务发现名称可以随时更改。
网格摘要
在创建服务网格之前,您具有三个名为 servicea.apps.local
、serviceb.apps.local
和 servicebv2.apps.local
的实际服务。除实际服务之外,现在您还具有一个服务网格,其中包含用以表示实际服务的以下资源:
-
两个虚拟服务。代理通过虚拟路由器将所有流量从
servicea.apps.local
虚拟服务发送到serviceb.apps.local
虚拟服务。 -
三个名为
serviceA
、serviceB
和serviceBv2
的虚拟节点。Envoy 代理使用为虚拟节点配置的服务发现信息来查找实际服务的 IP 地址。 -
一个虚拟路由器,其路由指示 Envoy 代理将 75% 的入站流量路由到
serviceB
虚拟节点,将 25% 的流量路由到serviceBv2
虚拟节点。
步骤 6:更新服务
创建网格后,您需要完成以下任务:
-
授权您在每个 Amazon ECS 任务中部署的 Envoy 代理读取一个或多个虚拟节点的配置。有关如何向代理授权的更多信息,请参阅代理授权。
-
更新您现有的每个 Amazon ECS 任务定义以使用 Envoy 代理。
凭证
Envoy 容器需要 Amazon Identity and Access Management 凭据才能对发送到 App Mesh 服务的请求进行签名。对于使用 Amazon EC2 启动类型部署的 Amazon ECS 任务,证书可以来自实例角色或任务IAM角色。在 Linux 容器上使用 Fargate 部署的亚马逊ECS任务无法访问提供实例IAM配置文件凭证的亚马逊EC2元数据服务器。要提供凭证,您必须将IAM任务角色附加到使用 Fargate on Linux 容器类型部署的所有任务。
如果按照 Amazon EC2 启动类型部署任务并且访问亚马逊EC2元数据服务器被阻止(如任务IAM角色中的重要注释中所述),则还必须为该任务附加一个任务IAM角色。您分配给实例或任务的角色必须具有代理授权中所述的IAM策略。
要更新任务定义,请使用 Amazon CLI
您使用 Amazon ECS Amazon CLI 命令register-task-definition
。下面的示例任务定义显示了如何为您的服务配置 App Mesh。
注意
无法ECS通过控制台为亚马逊配置 App Mesh。
代理配置
要将您的亚马逊ECS服务配置为使用 App Mesh,您的服务的任务定义必须包含以下代理配置部分。将代理配置 type
设置为 APPMESH
,并 containerName
配置为 envoy
。相应地设置以下属性值。
IgnoredUID
-
Envoy 代理不会路由来自使用此用户 ID 的进程的流量。您可以为此属性值选择所需的任何用户 ID,但此 ID 必须与任务定义中的 Envoy 容器的
user
ID 相同。此匹配允许 Envoy 忽略其自己的流量,而无需使用代理。出于历史原因,我们的示例使用
。1337
ProxyIngressPort
-
这是 Envoy 代理容器的入站端口。将此值设置为
15000
。 ProxyEgressPort
-
这是 Envoy 代理容器的出口端口。将此值设置为
15001
。 AppPorts
-
指定您的应用程序容器监听的所有入站端口。在此示例中,应用程序容器在端口
上侦听。您指定的端口必须与虚拟节点侦听器上配置的端口匹配。9080
EgressIgnoredIPs
-
Envoy 不会将流量代理至这些 IP 地址。将此值设置为
169.254.170.2,169.254.169.254
,这将忽略亚马逊EC2元数据服务器和亚马逊ECS任务元数据终端节点。元数据端点为任务凭证提供IAM角色。您可以添加其他地址。 EgressIgnoredPorts
-
您可以添加以逗号分隔的端口列表。Envoy 不会将流量转发至这些端口。即使您没有列出任何端口,端口 22 也会被忽略。
注意
可以忽略的最大出站端口数为 15。
"proxyConfiguration": { "type": "APPMESH", "containerName": "envoy", "properties": [{ "name": "IgnoredUID", "value": "
1337
" }, { "name": "ProxyIngressPort", "value": "15000" }, { "name": "ProxyEgressPort", "value": "15001" }, { "name": "AppPorts", "value": "9080
" }, { "name": "EgressIgnoredIPs", "value": "169.254.170.2,169.254.169.254" }, { "name": "EgressIgnoredPorts", "value": "22
" } ] }
应用程序容器 Envoy 依赖项
您的任务定义中的应用程序容器必须等待 Envoy 代理来引导和启动之后才能启动。为了确保这种情况发生,你需要在每个应用程序容器定义中设置一个dependsOn
部分,等待 Envoy 容器报告为HEALTHY
。以下代码显示了包含此依赖项的应用程序容器定义示例。以下示例中的所有属性都是必需的。有些属性值也是必填的,但有些是必填的 replaceable
.
{ "name": "
appName
", "image": "appImage
", "portMappings": [{ "containerPort":9080
, "hostPort":9080
, "protocol": "tcp" }], "essential": true, "dependsOn": [{ "containerName": "envoy", "condition": "HEALTHY" }] }
Envoy 容器定义
您的亚马逊ECS任务定义必须包含 App Mesh Envoy 容器镜像。
- 除
me-south-1
、ap-east-1
、ap-southeast-3
、eu-south-1
、il-central-1
和af-south-1
之外的所有受支持地区。你可以更换Region-code
与me-south-1
、、、ap-east-1
ap-southeast-3
eu-south-1
il-central-1
、和以外的任何区域af-south-1
。 -
Standard
840364872350.dkr.ecr.
region-code
.amazonaws.com/aws-appmesh-envoy:v1.29.9.0-prodFIPS-符合
840364872350.dkr.ecr.
region-code
.amazonaws.com/aws-appmesh-envoy:v1.29.9.0-prod-fips me-south-1
-
Standard
772975370895.dkr.ecr.me-south-1.amazonaws.com/aws-appmesh-envoy:v1.29.9.0-prod
FIPS-符合
772975370895.dkr.ecr.me-south-1.amazonaws.com/aws-appmesh-envoy:v1.29.9.0-prod-fips
ap-east-1
-
Standard
856666278305.dkr.ecr.ap-east-1.amazonaws.com/aws-appmesh-envoy:v1.29.9.0-prod
FIPS-符合
856666278305.dkr.ecr.ap-east-1.amazonaws.com/aws-appmesh-envoy:v1.29.9.0-prod-fips
ap-southeast-3
-
Standard
909464085924.dkr.ecr.ap-southeast-3.amazonaws.com/aws-appmesh-envoy:v1.29.9.0-prod
FIPS-符合
909464085924.dkr.ecr.ap-southeast-3.amazonaws.com/aws-appmesh-envoy:v1.29.9.0-prod-fips
eu-south-1
-
Standard
422531588944.dkr.ecr.eu-south-1.amazonaws.com/aws-appmesh-envoy:v1.29.9.0-prod
FIPS-符合
422531588944.dkr.ecr.eu-south-1.amazonaws.com/aws-appmesh-envoy:v1.29.9.0-prod-fips
il-central-1
-
Standard
564877687649.dkr.ecr.il-central-1.amazonaws.com/aws-appmesh-envoy:v1.29.9.0-prod
FIPS-符合
564877687649.dkr.ecr.il-central-1.amazonaws.com/aws-appmesh-envoy:v1.29.9.0-prod-fips
af-south-1
-
Standard
924023996002.dkr.ecr.af-south-1.amazonaws.com/aws-appmesh-envoy:v1.29.9.0-prod
FIPS-符合
924023996002.dkr.ecr.af-south-1.amazonaws.com/aws-appmesh-envoy:v1.29.9.0-prod-fips
cn-north-1
-
Standard
919366029133.dkr.ecr.cn-north-1.amazonaws.com.cn/aws-appmesh-envoy:v1.29.9.0-prod
FIPS-符合
919366029133.dkr.ecr.cn-north-1.amazonaws.com.cn/aws-appmesh-envoy:v1.29.9.0-prod-fips
cn-northwest-1
-
Standard
919830735681.dkr.ecr.cn-northwest-1.amazonaws.com.cn/aws-appmesh-envoy:v1.29.9.0-prod
FIPS-符合
919830735681.dkr.ecr.cn-northwest-1.amazonaws.com.cn/aws-appmesh-envoy:v1.29.9.0-prod-fips
Public repository
-
Standard
public.ecr.aws/appmesh/aws-appmesh-envoy:v1.29.9.0-prod
FIPS-符合
public.ecr.aws/appmesh/aws-appmesh-envoy:v1.29.9.0-prod-fips
重要
仅支持将版本 v1.9.0.0-prod 或更高版本与 App Mesh 一起使用。
在 Envoy 项目团队合并支持 App Mesh 的更改之前,您必须使用 App Mesh Envoy 容器镜像。有关更多详细信息,请参阅GitHub 路线图问题
以下示例中的所有属性都是必需的。有些属性值也是必填的,但有些是必填的 replaceable
.
注意
-
Envoy 容器定义必须标记为
essential
。 -
我们建议为 Envoy 容器分配
512
CPU单位和至少64
MiB 的内存。在 Fargate 上,您可以设置的最低内存为1024
MiB。 -
Amazon ECS 服务的虚拟节点名称必须设置为
APPMESH_RESOURCE_ARN
属性的值。此属性需要版本1.15.0
或更高版本的 Envoy 镜像。有关更多信息,请参阅 Envoy 镜像。 -
user
设置的值必须与任务定义代理配置中的IgnoredUID
值匹配。在此示例中,我们使用的是
。1337
-
此处显示的运行状况检查会等待 Envoy 容器正常启动,然后再向 Amazon ECS 报告 Envoy 容器运行状况良好,可以启动应用程序容器。
-
默认情况下,当 Envoy 在指标和跟踪中引用自身时,App Mesh 使用您在
APPMESH_RESOURCE_ARN
中指定的资源的名称。您可以通过使用自己的名称设置APPMESH_RESOURCE_CLUSTER
环境变量来覆盖此行为。此属性需要版本1.15.0
或更高版本的 Envoy 镜像。有关更多信息,请参阅 Envoy 镜像。
以下代码显示 Envoy 容器定义示例。
{ "name": "envoy", "image": "
840364872350
.dkr.ecr.us-west-2
.amazonaws.com/aws-appmesh-envoy:v1.29.9.0-prod", "essential": true, "environment": [{ "name": "APPMESH_RESOURCE_ARN", "value": "arn:aws:appmesh:us-west-2
:111122223333
:mesh/apps
/virtualNode/serviceB
" }], "healthCheck": { "command": [ "CMD-SHELL", "curl -s http://localhost:9901/server_info | grep state | grep -q LIVE" ], "startPeriod":10
, "interval":5
, "timeout":2
, "retries":3
}, "user": "1337
" }
示例任务定义
以下 Amazon ECS 任务定义示例展示了如何将上面的示例合并到的任务定义中taskB
。提供了使用或不使用两种Amazon ECS 启动类型创建任务的示例 Amazon X-Ray。改变 replaceable
值(视情况而定),用于为名为taskBv2
和taskA
来自场景的任务创建任务定义。用您的网格名称和虚拟节点名称替换 APPMESH_RESOURCE_ARN
值,并用您的应用程序侦听的端口列表替换代理配置 AppPorts
值。默认情况下,当 Envoy 在指标和跟踪中引用自身时,App Mesh 使用您在 APPMESH_RESOURCE_ARN
中指定的资源的名称。您可以通过使用自己的名称设置 APPMESH_RESOURCE_CLUSTER
环境变量来覆盖此行为。以下示例中的所有属性都是必需的。有些属性值也是必填的,但有些是必填的 replaceable
.
如果您正在按照 “凭证” 部分所述运行 Amazon ECS 任务,则需要在示例中添加现有任务IAM角色。
重要
Fargate 必须使用大于 1024 的端口值。
例 JSON适用于亚马逊ECS任务定义——Linux 容器上的 Fargate
{ "family" : "
taskB
", "memory" : "1024
", "cpu" : "0.5 vCPU
", "proxyConfiguration" : { "containerName" : "envoy", "properties" : [ { "name" : "ProxyIngressPort", "value" : "15000" }, { "name" : "AppPorts", "value" : "9080
" }, { "name" : "EgressIgnoredIPs", "value" : "169.254.170.2,169.254.169.254" }, { "name": "EgressIgnoredPorts", "value": "22
" }, { "name" : "IgnoredUID", "value" : "1337
" }, { "name" : "ProxyEgressPort", "value" : "15001" } ], "type" : "APPMESH" }, "containerDefinitions" : [ { "name" : "appName
", "image" : "appImage
", "portMappings" : [ { "containerPort" :9080
, "protocol" : "tcp" } ], "essential" : true, "dependsOn" : [ { "containerName" : "envoy", "condition" : "HEALTHY" } ] }, { "name" : "envoy", "image" : "840364872350
.dkr.ecr.us-west-2
.amazonaws.com/aws-appmesh-envoy:v1.29.9.0-prod", "essential" : true, "environment" : [ { "name" : "APPMESH_VIRTUAL_NODE_NAME", "value" : "mesh/apps
/virtualNode/serviceB
" } ], "healthCheck" : { "command" : [ "CMD-SHELL", "curl -s http://localhost:9901/server_info | grep state | grep -q LIVE" ], "interval" :5
, "retries" :3
, "startPeriod" :10
, "timeout" :2
}, "memory" :500
, "user" : "1337
" } ], "requiresCompatibilities" : [ "FARGATE" ], "taskRoleArn" : "arn:aws:iam::123456789012
:role/ecsTaskRole
", "executionRoleArn" : "arn:aws:iam::123456789012
:role/ecsTaskExecutionRole
", "networkMode" : "awsvpc" }
例 JSON用于亚马逊ECS任务定义 Amazon X-Ray -Linux 容器上的 Fargate
X-Ray 允许您收集有关应用程序服务于的请求的数据,并提供可用于可视化流量的工具。使用适用于 Envoy 的 X-Ray 驱动程序,Envoy 能够向 X-Ray 报告跟踪信息。您可以使用 Envoy 配置启用 X-Ray 跟踪。根据配置,Envoy 将跟踪数据发送到作为 sidecar 容器运行的 X-Ray 进程守护程序,该进程守护程序将跟踪转发给 X-Ray 服务。在将跟踪发布到 X-Ray 后,您可以使用 X-Ray 控制台来可视化服务调用图和请求跟踪详细信息。以下JSON是启用 X-Ray 集成的任务定义。
{ "family" : "
taskB
", "memory" : "1024
", "cpu" : "512
", "proxyConfiguration" : { "containerName" : "envoy", "properties" : [ { "name" : "ProxyIngressPort", "value" : "15000" }, { "name" : "AppPorts", "value" : "9080
" }, { "name" : "EgressIgnoredIPs", "value" : "169.254.170.2,169.254.169.254" }, { "name": "EgressIgnoredPorts", "value": "22
" }, { "name" : "IgnoredUID", "value" : "1337
" }, { "name" : "ProxyEgressPort", "value" : "15001" } ], "type" : "APPMESH" }, "containerDefinitions" : [ { "name" : "appName
", "image" : "appImage
", "portMappings" : [ { "containerPort" :9080
, "protocol" : "tcp" } ], "essential" : true, "dependsOn" : [ { "containerName" : "envoy", "condition" : "HEALTHY" } ] }, { "name" : "envoy", "image" : "840364872350
.dkr.ecr.us-west-2
.amazonaws.com/aws-appmesh-envoy:v1.29.9.0-prod", "essential" : true, "environment" : [ { "name" : "APPMESH_VIRTUAL_NODE_NAME", "value" : "mesh/apps
/virtualNode/serviceB
" }, { "name": "ENABLE_ENVOY_XRAY_TRACING", "value": "1" } ], "healthCheck" : { "command" : [ "CMD-SHELL", "curl -s http://localhost:9901/server_info | grep state | grep -q LIVE" ], "interval" :5
, "retries" :3
, "startPeriod" :10
, "timeout" :2
}, "memory" :500
, "user" : "1337
" }, { "name" : "xray-daemon", "image" : "amazon/aws-xray-daemon", "user" : "1337
", "essential" : true, "cpu" : "32
", "memoryReservation" : "256
", "portMappings" : [ { "containerPort" : 2000, "protocol" : "udp" } ] } ], "requiresCompatibilities" : [ "FARGATE" ], "taskRoleArn" : "arn:aws:iam::123456789012
:role/ecsTaskRole
", "executionRoleArn" : "arn:aws:iam::123456789012
:role/ecsTaskExecutionRole
", "networkMode" : "awsvpc" }
例 JSON适用于 Amazon ECS 任务定义-EC2 启动类型
{ "family": "
taskB
", "memory": "256
", "proxyConfiguration": { "type": "APPMESH", "containerName": "envoy", "properties": [ { "name": "IgnoredUID", "value": "1337
" }, { "name": "ProxyIngressPort", "value": "15000" }, { "name": "ProxyEgressPort", "value": "15001" }, { "name": "AppPorts", "value": "9080
" }, { "name": "EgressIgnoredIPs", "value": "169.254.170.2,169.254.169.254" }, { "name": "EgressIgnoredPorts", "value": "22
" } ] }, "containerDefinitions": [ { "name": "appName
", "image": "appImage
", "portMappings": [ { "containerPort":9080
, "hostPort":9080
, "protocol": "tcp" } ], "essential": true, "dependsOn": [ { "containerName": "envoy", "condition": "HEALTHY" } ] }, { "name": "envoy", "image": "840364872350
.dkr.ecr.us-west-2
.amazonaws.com/aws-appmesh-envoy:v1.29.9.0-prod", "essential": true, "environment": [ { "name": "APPMESH_VIRTUAL_NODE_NAME", "value": "mesh/apps
/virtualNode/serviceB
" } ], "healthCheck": { "command": [ "CMD-SHELL", "curl -s http://localhost:9901/server_info | grep state | grep -q LIVE" ], "startPeriod":10
, "interval":5
, "timeout":2
, "retries":3
}, "user": "1337
" } ], "requiresCompatibilities" : [ "EC2" ], "taskRoleArn" : "arn:aws:iam::123456789012
:role/ecsTaskRole
", "executionRoleArn" : "arn:aws:iam::123456789012
:role/ecsTaskExecutionRole
", "networkMode": "awsvpc" }
例 JSON适用于带有 Amazon X-Ray -EC2 启动类型的 Amazon ECS 任务定义
{ "family": "
taskB
", "memory": "256
", "cpu" : "1024
", "proxyConfiguration": { "type": "APPMESH", "containerName": "envoy", "properties": [ { "name": "IgnoredUID", "value": "1337
" }, { "name": "ProxyIngressPort", "value": "15000" }, { "name": "ProxyEgressPort", "value": "15001" }, { "name": "AppPorts", "value": "9080
" }, { "name": "EgressIgnoredIPs", "value": "169.254.170.2,169.254.169.254" }, { "name": "EgressIgnoredPorts", "value": "22
" } ] }, "containerDefinitions": [ { "name": "appName
", "image": "appImage
", "portMappings": [ { "containerPort":9080
, "hostPort":9080
, "protocol": "tcp" } ], "essential": true, "dependsOn": [ { "containerName": "envoy", "condition": "HEALTHY" } ] }, { "name": "envoy", "image": "840364872350
.dkr.ecr.us-west-2
.amazonaws.com/aws-appmesh-envoy:v1.29.9.0-prod", "essential": true, "environment": [ { "name": "APPMESH_VIRTUAL_NODE_NAME", "value": "mesh/apps
/virtualNode/serviceB
" }, { "name": "ENABLE_ENVOY_XRAY_TRACING", "value": "1" } ], "healthCheck": { "command": [ "CMD-SHELL", "curl -s http://localhost:9901/server_info | grep state | grep -q LIVE" ], "startPeriod":10
, "interval":5
, "timeout":2
, "retries":3
}, "user": "1337
" }, { "name": "xray-daemon", "image": "amazon/aws-xray-daemon", "user": "1337
", "essential": true, "cpu": 32, "memoryReservation": 256, "portMappings": [ { "containerPort": 2000, "protocol": "udp" } ] } ], "requiresCompatibilities" : [ "EC2" ], "taskRoleArn" : "arn:aws:iam::123456789012
:role/ecsTaskRole
", "executionRoleArn" : "arn:aws:iam::123456789012
:role/ecsTaskExecutionRole
", "networkMode": "awsvpc" }
高级主题
使用 App Mesh 进行金丝雀部署
金丝雀部署和版本可帮助您在应用程序的旧版本和新部署的版本之间切换流量。它还会监控新部署版本的运行状况。如果新版本有任何问题,金丝雀部署可以自动将流量切换回旧版本。利用金丝雀部署,能够更多地控制在应用程序版本之间切换流量。
有关如何使用 App Mesh 为亚马逊实施金丝雀部署的更多信息,请参阅ECS使用 App Mesh 为亚马逊ECS创建带有金丝雀部署的管道
注意
有关 App Mesh 的更多示例和演练,请参阅 App Mesh 示例存储库