【Route53】「ゾーンシフト」を活用してAZ障害からトラフィックを素早く回避させよう【ARC】

# はじめに
re:Invent2022にて、Route53のApplication Recovery Controller(ARC)の新機能として「ゾーンシフト(zonal shift)」が発表されました(プレビュー)。AZ障害発生時に、ELBへのトラフィックを問題のあるAZからルーティングを回避させることが出来る優れものです。

https://aws.amazon.com/jp/about-aws/whats-new/2022/11/amazon-route-53-application-recovery-controller-zonal-shift/

:::note info
※2023/1/11にGAとなりました！
:::

https://aws.amazon.com/jp/about-aws/whats-new/2023/01/general-availability-amazon-route-53-application-recovery-controller-zonal-shift/

# Route53 Application Recovery Controllerとは
- Route53のARCは以下の3つの機能を提供
    - 準備状況チェック
        - リソースの準備状況を監視します
    - ルーティング制御
        - **マルチリージョン**アプリケーションのフェイルオーバーのためにトラフィックを再ルーティング
    - ゾーンシフト
        - **マルチAZ**アプリケーションをAZの問題から回復

# ゾーンシフトがサポートするリソース
Route53のARCは現在、**NLB**と**ALB**のゾーンシフトをサポートしています。
※開始方法はELBかRoute53 ARCのいずれかのコンソール上で可能

## Route53 ARCの場合
![スクリーンショット_2023-01-04_0_30_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354022/6d3a9642-e942-d0e8-29b8-b883c2c5563f.png)

## ELBの場合
![スクリーンショット_2023-01-04_0_32_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354022/33168c3e-c89e-d2bd-0218-4d490d6515f8.png)

# Route53 ARCでゾーンシフトとリソースを操作するため条件
- ゾーンシフトは、**クロスゾーン負荷分散ではサポートされない**
- AWS Global AcceleratorのアクセラレータのエンドポイントであるALBではサポートされない
- ALBがNLBのターゲットである場合、NLBからゾーンシフトを開始する必要あり
- ゾーンシフトは、AWSサービスによってRoute53 ARCに登録されたマネージドリソースである必要あり
- リソースとゾーンシフトは開始するAZ或いはリージョンにデプロイする必要あり
- リソースでゾーンシフトを使用するためのIAMアクセス許可が必要あり

# ゾーンシフトの有効期限
全てのゾーンシフトは開始時に**有効期限(最大3日)を設定する必要があります**。ゾーンシフトを**更新する事で新たな有効期限を設定可能**です。

- 設定範囲として以下が用意されていました。
    - 6時間
    - 12時間
    - １日
    - ３日
    - カスタム(1分~３日)

# ゾーンシフトのベストプラクティス
- キャパシティプランニングと事前スケーリング
    - ゾーンシフトによって特定AZへのトラフィックのルーティングを回避させた場合に、ターゲットであるインスタンス或いはコンテナリソースがリクエストを処理する為に、事前にリソースに余裕を持たせる。
- 事前にゾーンシフトを開始するテスト
    - AZからトラフィックが移動することを定期的にテストする
- 全てのAZが正常にトラフィックを処理していることを確認
    - 平常時にロードバランサーのターゲットが正常であり、リージョン内のAZでトラフィックをアクティブに処理していることを確認
- DRにデータプレーンAPI操作を使用
    - 高速で信頼性の高い復旧が重要な場合は、データプレーン操作の方が適している為、AWS CLIかAPIを推奨。
- 一時的にのみゾーンシフトを使用してトラフィックを移動
    - 問題を修正するための措置を講じたらすぐに、アプリケーションのリソースを復元する

# CLIによるゾーンシフト操作
参照

https://docs.aws.amazon.com/arc-zonal-shift/latest/api/Welcome.html

|オプション|概要|
|---|---|
|--away-from|トラフィックがリソースから移動されるAZのID<br>東京リージョンの場合は、**apne1-az4**、**apne1-az1**、**apne1-az2**|
|--comment|コメント|
|--expires-in|有効期限|
|--resource-identifier|ゾーンシフトに含めるリソースの識別子で、リソースのARN|

## マッピング確認
**※ゾーンIDとAZ名はアカウントによってマッピングが異なります**。自身の環境でどのゾーンIDでゾーンシフトを開始するべきかを確認するには、以下コマンドを実行してください。

```sh
aws ec2 describe-availability-zones \
  --region ap-northeast-1 \
  --query 'AvailabilityZones[].{RegionName:RegionName, ZoneName:ZoneName, ZoneId:ZoneId}' \
  --output table
```

## マッピングコマンド結果例
```sh
----------------------------------------------------
|             DescribeAvailabilityZones            |
+----------------+-------------+-------------------+
|   RegionName   |   ZoneId    |     ZoneName      |
+----------------+-------------+-------------------+
|  ap-northeast-1|  apne1-az4  |  ap-northeast-1a  |
|  ap-northeast-1|  apne1-az1  |  ap-northeast-1c  |
|  ap-northeast-1|  apne1-az2  |  ap-northeast-1d  |
+----------------+-------------+-------------------+
```

## ゾーンシフト開始
リソース:nlb
対象ゾーン:apne1-az1
有効期限:５分

```sh
$aws arc-zonal-shift start-zonal-shift \
      --resource-identifier="arn:aws:elasticloadbalancing:ap-northeast-1:xxxxxxxxxxxx:loadbalancer/net/xxxxx/xxxxxxxxxxxx" \
      --away-from="apne1-az1" \
      --expires-in="5m" \
      --comment="Shifting traffic away from apne1-az1"
```

## コマンド結果
```sh
{
    "awayFrom": "apne1-az1",
    "comment": "Shifting traffic away from apne1-az1",
    "expiryTime": "2023-01-03T16:41:34+00:00",
    "resourceIdentifier": "arn:aws:elasticloadbalancing:ap-northeast-1:xxxxxxxxxxxx:loadbalancer/net/xxxxxx/xxxxxxxxxxxx",
    "startTime": "2023-01-03T16:36:34+00:00",
    "status": "ACTIVE",
    "zonalShiftId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx"
}
```

## コンソールで確認
![スクリーンショット_2023-01-04_1_37_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354022/3a5ae7e7-eb79-d88b-30a1-8d3ca95ba14a.png)
**sample-nlb**をリソースとしてゾーンシフトが**apne1-az1**(ap-northeast-1c)を対象に開始しているのが分かりますね。時間が経過した関係で残り4分となっている事も確認できました。※時間が５分経過するとコンソールから自動で削除されました。

# さいごに
今回はRoute53 ARCの新機能ゾーンシフトについて調査しました。AZ障害発生時に素早く簡単に問題AZへのルーティングを回避させてアプリケーションを守る事ができるので覚えておいて損はないかと思います。GA後に余裕があったらベストプラクティスにあるように実際にテストして備えておくと、いざという時落ち着いて対処出来る様になるので是非取り入れていきたいですね。

# 参照
https://docs.aws.amazon.com/r53recovery/latest/dg/what-is-route53-recovery.html