

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 更新/迁移到 Envoy 1.17
<a name="1.17-migration"></a>

**重要**  
终止支持通知：2026 年 9 月 30 日， AWS 将停止对的支持。 AWS App Mesh 2026 年 9 月 30 日之后，您将无法再访问 AWS App Mesh 控制台或 AWS App Mesh 资源。有关更多信息，请访问此博客文章[从迁移 AWS App Mesh 到 Amazon ECS Service Connect](https://aws.amazon.com/blogs/containers/migrating-from-aws-app-mesh-to-amazon-ecs-service-connect)。

## 带有 SPIRE 的密钥发现服务
<a name="spire-update"></a>

如果您使用带 App Mesh 的 SPIRE（SPIFFE 运行时系统环境）向您的服务分发信任证书，请确认您使用的是版本至少为 `0.12.0` 的 [SPIRE 代理](https://github.com/spiffe/spire/releases/tag/v0.12.0)（2020 年 12 月发布）。这是之后第一个可以支持 Envoy 版本的版本 `1.16`。

## 正则表达式更改
<a name="regular-expressions"></a>

从 Envoy 开始`1.17`，App Mesh 将 Envoy 配置为默认使用[RE2](https://github.com/google/re2)正则表达式引擎。对于大多数用户来说，这种变化是显而易见的，但是路由或网关路由中的匹配不再允许在正则表达式中进行正向或反向引用。

### 正向和负向展望
<a name="positive-look-ahead"></a>

**正向 —** 正向前看是一个带括号的表达式，开头为：`?=`。

```
(?=example)
```

它们在进行字符串替换时最有用，因为它们允许匹配字符串而不必在匹配中消耗字符。由于 App Mesh 不支持替换正则表达式字符串，因此我们建议您将其替换为常规匹配项。

```
(example)
```

**负向 —** 负向前看是一个带括号的表达式，开头为：`?!`。

```
ex(?!amp)le
```

带圆括号的表达式用于断言表达式的部分与给定输入不匹配。在大多数情况下，你可以用零量词替换它们。

```
ex(amp){0}le
```

如果表达式本身是一个字符类，则可以 `?` 使用否定整个类并将其标记为可选。

```
prefix(?![0-9])suffix => prefix[^0-9]?suffix
```

根据您的用例，您也可以更改路线来处理此问题。

```
{
    "routeSpec": {
        "priority": 0,
        "httpRoute": {
            "match": {
                "headers": [
                    {
                        "name": "x-my-example-header",
                        "match": {
                            "regex": "^prefix(?!suffix)"
                        }
                    }
                ]
            }
        }
    }
}

{
    "routeSpec": {
        "priority": 1,
        "httpRoute": {
            "match": {
                "headers": [
                    {
                        "name": "x-my-example-header",
                        "match": {
                            "regex": "^prefix"
                        }
                    }
                ]
            }
        }
    }
}
```

第一个路由匹配会查找以“prefix”开头但后面不是“suffix”的标头。第二条路由的作用是匹配所有其他以“prefix”开头的标头，包括那些以“suffix”结尾的标头。取而代之的是，也可以将其逆转，以消除负向前看。

```
{
    "routeSpec": {
        "priority": 0,
        "httpRoute": {
            "match": {
                "headers": [
                    {
                        "name": "x-my-example-header",
                        "match": {
                            "regex": "^prefix.*?suffix"
                        }
                    }
                ]
            }
        }
    }
}

{
    "routeSpec": {
        "priority": 1,
        "httpRoute": {
            "match": {
                "headers": [
                    {
                        "name": "x-my-example-header",
                        "match": {
                            "regex": "^prefix"
                        }
                    }
                ]
            }
        }
    }
}
```

此示例反转路由，为以“suffix”结尾的标头提供更高的优先级，而所有其他以“prefix”开头的标头在优先级较低的路由中都匹配。

## 反向引用
<a name="back-references"></a>

反向引用是一种通过向前一个带括号的组重复来编写较短表达式的方法。他们有这样的表格。

```
(group1)(group2)\1
```

反斜杠后 `\` 跟一个数字充当表达式中第 n 个带括号的组的占位符。在此示例中，`\1` 被用作第二次写入 `(group1)` 的替代方式。

```
(group1)(group2)(group1)
```

只需将反向引用替换为所引用的组即可将其删除，如示例所示。