

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 更新/遷移至 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 的 Secret Discovery Service
<a name="spire-update"></a>

如果您使用 SPIRE (SPIFFE 執行期環境） 搭配 App Mesh 將信任憑證分發到您的服務，請確認您使用的 [SPIRE 代理](https://github.com/spiffe/spire/releases/tag/v0.12.0)程式至少為 `0.12.0` 版本 (2020 年 12 月發行）。這是第一個可在 之後支援 Envoy 版本的版本`1.16`。

## 規則表達式變更
<a name="regular-expressions"></a>

從 Envoy 開始`1.17`，App Mesh 預設會將 Envoy 設定為使用 [RE2](https://github.com/google/re2) 規則表達式引擎。此變更對大多數使用者來說很明顯，但 Routes 或 Gateway Routes 中的相符項目不再允許規則表達式中的前瞻或後退參考。

### 正面和負面前瞻
<a name="positive-look-ahead"></a>

**正 -** 正前向是以 開頭的括號表達式`?=`：

```
(?=example)
```

這些函數在執行字串取代時具有最多的公用程式，因為它們允許比對字串，而不會在比對過程中耗用字元。由於 App Mesh 不支援 regex 字串取代，我們建議您將它們取代為一般相符項目。

```
(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"
                        }
                    }
                ]
            }
        }
    }
}
```

第一個路由比對會尋找開頭為「字首」但後面沒有「尾碼」的標頭。第二個路由的作用是比對所有其他以「字首」開頭的標頭，包括以「尾碼」結尾的標頭。反之，這些也可以反轉為移除負面前瞻的方式。

```
{
    "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"
                        }
                    }
                ]
            }
        }
    }
}
```

此範例會反轉路由，為結尾為「字尾」的標頭提供更高的優先順序，而開頭為「字首」的所有其他標頭會在優先順序較低的路由中比對。

## 後端參考
<a name="back-references"></a>

回溯參考是一種透過重複到上一個括號群組來寫入較短表達式的方式。他們有此表單。

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

`\` 後面加上數字的反斜線做為表達式中第 n 個括號群組的預留位置。在此範例中， `\1` 用作`(group1)`第二次寫入的替代方法。

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

只需將反參考取代為範例中參考的群組，即可移除這些項目。