My Home NW Lab

逸般の誤家庭のネットワーク

Meraki vMX向けの冗長化切り替え用AWS Lambdaスクリプトの挙動

Meraki vMX向けのAWS Quick Startsには、冗長化切り替え用のAWS Lambdaスクリプトが用意されておりますが、 実案件で使用するには挙動を把握しておく必要があるため各種情報を整理しました。

CloudFormationのテンプレートを用いたデプロイは下記の記事を参照してください。

myhomenwlab.hatenablog.com

本記事は2022年04月頃の情報に基づいています。今後、スクリプトに改修が入った場合は本記事と内容と差異が出る可能性があります。

AWS Lambdaスクリプト本体の公開先

AWS Lambdaスクリプトの動作イメージ

AWS Lambdaスクリプトからの各種ステータス情報の取得や設定の更新があるため、関連要素との連携箇所を整理します。

f:id:myhomenwlab:20220413204441j:plain
AWS Lambdaスクリプトの動作イメージ

  1. Amazon CloudWatch Events (Amazon EventBridge)から、AWS Lambdaスクリプトを定期的に実行します。
  2. AWS LambdaスクリプトAWS Secrets ManagerからMeraki Dashboard APIAPI Keyを入手します。
  3. AWS LambdaスクリプトMeraki Dashboard APIによりAuto VPN Routeの情報を取得します。
  4. Meraki vMXのEC2 Instanceのステータス情報を取得して、AWS Lambdaスクリプトは障害状況の判断を行います。
  5. 障害状況を加味して、Transit Gateway Route TableとRoute Tableに対して、AWS LambdaスクリプトがAuto VPN Routeを反映します。

Amazon CloudWatch Events (Amazon EventBridge)による定期実行

Amazon CloudWatch Events (Amazon EventBridge)にて定期的にAWS Lambdaスクリプトを呼び出します。 CloudFormationのテンプレートでは、実行間隔のデフォルト値が10分間隔となっております。そして、最短でも1分間隔になります。

f:id:myhomenwlab:20220414093907j:plain
Amazon CloudWatch Events (Amazon EventBridge)のEvent scheduleの設定

f:id:myhomenwlab:20220414093917j:plain
Amazon CloudWatch Events (Amazon EventBridge)のEvent scheduleの実行間隔の指定箇所

f:id:myhomenwlab:20220414093926j:plain
Amazon CloudWatch Events (Amazon EventBridge)からのAWS Lambdaスクリプトの呼び出し指定

AWS Lambdaスクリプトの設定確認

CloudFormationのテンプレートからデプロイすると複数のFuntionが設定されます。 冗長化切り替え用のFunction名は接頭辞が Cisco-Meraki-Sd-Wan-Vmx-W-vMXTransitGatewayRTLambd- になります。

f:id:myhomenwlab:20220414094306j:plain
AWS Lambdaスクリプトの設定確認 (1/2)

f:id:myhomenwlab:20220414094519j:plain
AWS Lambdaスクリプトの設定確認 (2/2)

AWS Lambdaスクリプト環境変数

環境変数を用いてAWS Lambdaスクリプトに環境個別の情報を与えます。
CloudFormationでデプロイすると、テンプレートに入力した項目が自動的に反映されます。

f:id:myhomenwlab:20220414095049j:plain
AWS Lambdaスクリプト環境変数

設定項目 設定例 備考
MERAKI_ORG_ID MerakiのOrganization IDを指定
RT_ID (例) rtb-xxxx Route TableのIDを指定します。
TGW_ATTACH_ID (例) tgw-attach-xxxx Transit Gateway AttachmentのIDを指定します。
TGW_RT_ID (例) tgw-rtb-xxxx Transit Gateway Route TableのIDを指定します。
vMX1Tag (例) AWS_vMX1 CloudFormationのテンプレートを用いた場合のTagのデフォルト値は vMX1 です。複数セット構築する場合は一意な値になるように調整します。
vMX2Tag (例) AWS_vMX2 CloudFormationのテンプレートを用いた場合のTagのデフォルト値は vMX2 です。複数セット構築する場合は一意な値になるように調整します。

筆者がCloudFormationでデプロイした際は、環境変数MERAKI_API_KEY が存在してMeraki Dashboard API Keyが設定されていました。 ですが、API KeyはAWS Secrets Managerによる管理となるため本来は MERAKI_API_KEY の設定は不要となります。

EC2 InstanceとMeraki Dashbaord上のTag情報の紐付け

Meraki vMXのEC2 Instanceと、Meraki Dashboard上のNetworkに同名のTagを付与して、Primary vMXとSecondary vMXを紐付ける必要があります。

設定対象 Key Value 備考
Primary vMXのEC2 Instance MerakiTag (例) AWS_vMX1 CloudFormationのテンプレートを用いた場合のTagのデフォルト値は vMX1 です。複数セット構築する場合は一意な値になるように調整します。
Secondary vMXのEC2 Instance MerakiTag (例) AWS_vMX2 CloudFormationのテンプレートを用いた場合のTagのデフォルト値は vMX2 です。複数セット構築する場合は一意な値になるように調整します。

vMX1TagvMX2Tag はPrimary vMXとSecondary vMXの識別に使われているので別々の値を指定してください。
また当たり前の話になりますが、冗長化対象のペアとなるPrimary vMXとSecondary vMXはAvailability Zoneを分けてください。

f:id:myhomenwlab:20220414104747j:plain
Primary vMXのEC2 Instanceに対するTagの例
f:id:myhomenwlab:20220414104759j:plain
Secondary vMXのEC2 Instanceに対するTagの例

f:id:myhomenwlab:20220402125721j:plain
MerakiのNetworkに対するTag

EC2 Instanceのイメージが破損するなどして再デプロイした際は、Tagの設定をし忘れないように留意してください。

AWS Secrets ManagerにAPI Keyを格納

AWS Secrets ManagerにはMeraki Dashboard APIで情報を取得するためのAPI Keyが格納されます。

設定項目 設定名
Secret Name MerakiAPIKey

f:id:myhomenwlab:20220413224057j:plain
AWS Secrets ManagerのAPI Key (1/2)

Secret key Secret value
merakiapikey Meraki Dashboard APIAPI Key を格納します。

f:id:myhomenwlab:20220413224106j:plain
AWS Secrets ManagerのAPI Key (2/2)

Meraki Dashboard API

Meraki Dashboard APIは大まかに分けて下記の2つのAPIによって、Auto VPN Routeの情報を取得しています。

Meraki Dashboard APIにはMeraki vMXのルーティング テーブルの情報を直接取得する手段がないため、 Auto VPNに関わる情報からMeraki vMXが学習しているAuto VPN Routeを割り出しています。

処理内容を例えるなら、Cisco IOS系で言うところの show ip route が実装されていないので、 show running-config の設定情報からルーティング テーブルを理論的に構築するような挙動になっています。

また、Meraki Dashboard APIの呼び出しは、下記のPythonのライブラリ経由で行っております。

github.com

上記の処理内容に関わる補足ですが、 AWS LambdaスクリプトのAuto VPN Routeの取得対象は、Spoke側のMXがHubsでPrimary vMXとSecondary vMXを直接指定している場合に限ります。 そのため、現状のAWS LambdaスクリプトではFull MeshやPartial Meshの環境には適用できません。

f:id:myhomenwlab:20220414151522j:plain
Auto VPN Routeの取得対象とMeraki Dashboard上の設定の関連性

そして、Meraki MXおよびvMXのDC-DC Failover構成ではHub間のループを無効化する必要があり、 DC-DC Failover構成では事実上のFull MeshやPartial Meshがサポートされないにも等しい状況となります。 そのため想定動作を正とするならば、スクリプトの改修でMesh対応にするのは実質的に不可能となります。

myhomenwlab.hatenablog.com

障害検知の仕組み

Meraki vMXの障害の検知では、Boto3の describe_instance_status のMethodを用いてEC2 Instanceのステータス情報を取得して障害の有無を判断しています。

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html#EC2.Client.describe_instance_status

そのため、OSがクラッシュしてEC2 Instanceが停止するような障害が想定されています。 表現を変えると、NICに割り当てられているIPアドレスに対してpingを打つような実トラフィックを伴う動作にはなっていない点に留意してください。

Primary vMXの障害復旧時のPreemptの動作

AWS Lambdaのスクリプトは、VRRPで言うところのPreemptが有効になってるような挙動となります。

具体的には、まずvMX1が障害になると、vMX2にNext hopが書き換わります。 その状態でvMX1が障害から復旧すると、Next hopがvMX2からvMX1に自動的に書き換わる挙動になります。

AWS Lambdaスクリプトの該当処理ですが、 get_all_vpn_routes の関数内にて、 vMX1 に該当するAuto VPN Routeが見つかると for ループを break して抜けるため、 vMX2が同一のAuto VPN Routeを学習していてもNext hopがvMX2に上書きされないようになっています。

https://github.com/aws-quickstart/quickstart-cisco-meraki-sd-wan-vmx/blob/main/functions/source/lambda_function.py

補足

AWS LambdaスクリプトMerakiのサポートは受けられないため、実導入する際は必ず挙動を把握しておく必要があります。

また、一例となりますが、Firmware Upgrade時のルーティングの片寄せには対応していないため、サービス断時間を極限までに短くしたいような要件があると改修が必要になってきます。 ただし、そもそも改修が必要なほど厳格な要件がある環境には、シンプルが売りのMerakiの導入は向かない可能性があります。