CloudNative Days Tokyo 2022 に「謎は全て解けた! 安楽椅子探偵に捧げる AWS ネットワーク分析入門」というタイトルで登壇してきました
こんにちは、チェシャ猫です。
先日開催された CloudNative Days Tokyo 2022 で、SMT ソルバを用いた AWS のネットワーク検査機能、VPC Rechability Analyzer と VPC Network Access Analyzer について話してきました。公募 CFP 枠です。
イベントサイトにて録画も視聴可能です。
今回の登壇は「事前録画を提出」「当日リモートで登壇」「現地で登壇」のいずれの方式が選択可能だったのですが、自分は現地で登壇しました。
現地参加者全員が一つの部屋に集まる Keynote では意外と人がいるなという印象でしたが、午後のブレイクアウトセッションでは 6 部屋あったこともあり、自分のセッションの現地参加者は 10 数人程度でした。
完全オフラインだった頃の熱気には及びませんが、対面でお話しする場は数年ぶりで、聴衆の反応を見ながらプレゼンできる体験はやはり良いものです。
講演概要
ネットワークのトラブルシューティングは辛い作業になりがちです。特に AWS の VPC ネットワークは多数の設定が必要であり、疎通ができない場合にその原因を発見・修正するためには往々にして高いスキルが必要となります。
このような状況に対処し、誰でも体系的にネットワーク不通の原因を解消できる助けにするため、AWS は VPC Reachability Analyzer と VPC Network Access Anazlyer という二つの機能を提供しています。前者は、プロトコルやポート番号を指定することで二つのコンポーネント間の疎通を確認し、到達可能でない場合はその原因となっているコンポーネントを指摘します。また後者は、あらかじめクエリを登録しておくことで条件に合致する経路を一覧表示・分析し、コンプライアンス準拠等の目的に役立てることができます。
この機能には「到達不可能な場合であっても、その原因部分を含め送信元から送信先への完全な経路が得られる」という特徴があります。一般によく用いられるパケットを送出するタイプの疎通確認 (Packet Probing) において、不通となっているコンポーネントから先の経路情報は得られません。すなわち、VPC Rechability Analyzer はパケット送出によって経路を探索しているわけではない、ということがわかります。
今回の講演ではこの点について、AWS から公開されている 2 本の論文をベースにして解説を行いました。VPC Rechability / Network Access Analyzer は内部的には AWS Tiros と呼ばれるエンジンがクエリ処理を担っており、さらにそのバックエンドとして SMT ソルバの MonoSAT を使用しています。これに加え「不通の原因部分を含む完全な経路」をユーザに提示するため、与えられた制約をいくつかのクラスに分類し、段階的に Minimal Correction Subset (MCS) を計算する手法が用いられています。
補足
講演動画を見た方向けの補足です。スライド中に、MonoSAT のパフォーマンスについて「10 万(EC2)インスタンスで数 100 秒 〜 1,000 秒」と記載した部分があります。この情報について、講演では咄嗟に「単位の間違いでは」と言ってしまいましたが、グラフを見ればわかる通り間違いではありません。このデータは MonoSAT の規模的な限界性能、かつ Soufflé では解けないベンチマークの例として挙げられています。
Twitter の反応
現地登壇ということもあってか、今回はなんだか語り口が好評でした。この記事を読まれている方は、スライドだけでなく動画をご覧いただくと良いかもしれません。
VPC Reachability Analyzer と VPC Network Access Analyzer 知らなかった... 使いどころによってはこの二つもとても便利そう #CNDT2022 #CNDT2022_B
— Kei IWASAKI (@laugh_k) 2022年11月22日
実際に疎通しているわけではなく、ある変更を加えると通る。ある変更はユーザ変更可能箇所を MCS で特定する。から、traceroute のように断箇所でプツリと切れずにフィードバックされる…(最初の疑問)。後でもう一回見直そう。。。#CNDT2022 #CNDT2022_B
— Keisuke SAKASAI (@k6s4i53rx) 2022年11月22日
まさに「推理」という内容だった。スライドとチェシャ猫さんの話語りで楽しく聞けたしめっちゃおもしろかったです! #CNDT2022 #CNDT2022_B
— Kei IWASAKI (@laugh_k) 2022年11月22日
高度な内容を推理小説ばりに面白く解説頂きました!#CNDT2022 #CNDT2022_B
— yusuke nishikawa (@ukun2190_) 2022年11月22日
VPC Network Analyzerめっちゃ有能やん。その背後の学術的手法を丁寧に解説してくれてめちゃくちゃ面白かった。 🗣️(初歩的なことだよ、ワトソン君) #CNDT2022 #CNDT2022_B https://t.co/i5tojxqVCq
— なべ (@iho9z2qywfzt20w) 2022年11月22日
職人技ではなく数理による問題解決おもしろい👀#CNDT2022 #CNDT2022_B
— trunkatree (@trunkatree) 2022年11月22日
参考文献
- VPC Reachability Analyzer
- VPC Network Access Analyzer
- MonoSAT
- Backes, John, Sam Bayless, Byron Cook, Catherine Dodge, Andrew Gacek, Alan J. Hu, Temesghen Kahsai, et al. 2019. “Reachability Analysis for AWS-Based Networks.” In Computer Aided Verification, 231–41. Springer International Publishing. https://doi.org/10.1007/978-3-030-25543-5_14
- Bayless, S., J. Backes, D. DaCosta, B. F. Jones, N. Launchbury, P. Trentin, K. Jewell, S. Joshi, M. Q. Zeng, and N. Mathews. 2021. “Debugging Network Reachability with Blocked Paths.” In Computer Aided Verification, 851–62. Springer International Publishing. https://doi.org/10.1007/978-3-030-81688-9_39
おまけ:デモ環境の作成
以下の CloudFormation テンプレートを使用することで、VPC Reachability Analyzer と VPC Network Access Analyzer による分析を実際に試してみることができます。
このテンプレートの使用によって発生した問題には責任は持てません。特に、小さいとはいえ ECS インスタンスを実際に立てること、および両 Analyzer ともに有料(特に Reachability Analyzer は実行ごとに 0.1 USD と高価)である点にはご注意ください。
--- Description: 'Demo for CloudNative Days Tokyo 2022' AWSTemplateFormatVersion: 2010-09-09 Mappings: RegionMap: ap-northeast-1: execution: ami-02892a4ea9bfa2192 Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 172.0.0.0/16 InternetGateway: Type: AWS::EC2::InternetGateway InternetGatewayAttachement: Type: AWS::EC2::VPCGatewayAttachment Properties: InternetGatewayId: !Ref InternetGateway VpcId: !Ref VPC SubnetX: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC CidrBlock: 172.0.1.0/24 SubnetY: Type: AWS::EC2::Subnet DependsOn: InternetGateway Properties: VpcId: !Ref VPC CidrBlock: 172.0.2.0/24 MapPublicIpOnLaunch: true PublicRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref VPC PublicRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: RouteTableId: !Ref PublicRouteTable SubnetId: !Ref SubnetY PublicRoute: Type: AWS::EC2::Route Properties: RouteTableId: !Ref PublicRouteTable GatewayId: !Ref InternetGateway DestinationCidrBlock: 0.0.0.0/0 SecurityGroup1: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: 'Sample SG 1' VpcId: !Ref VPC SecurityGroupIngress: - CidrIp: !GetAtt VPC.CidrBlock IpProtocol: 'tcp' FromPort: 22 ToPort: 22 SecurityGroupEgress: - CidrIp: 0.0.0.0/0 IpProtocol: '-1' SecurityGroup2: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: 'Sample SG 2' VpcId: !Ref VPC SecurityGroupIngress: - CidrIp: !GetAtt VPC.CidrBlock IpProtocol: 'tcp' FromPort: 22 ToPort: 22 SecurityGroupEgress: - CidrIp: 127.0.0.1/32 IpProtocol: '-1' InstanceA: Type: AWS::EC2::Instance Properties: ImageId: Fn::FindInMap: - RegionMap - !Ref AWS::Region - execution InstanceType: 't3.nano' SubnetId: !Ref SubnetX SecurityGroupIds: - !Ref SecurityGroup1 Tags: - Key: Name Value: InstanceA InstanceB: Type: AWS::EC2::Instance Properties: ImageId: Fn::FindInMap: - RegionMap - !Ref AWS::Region - execution InstanceType: 't3.nano' SubnetId: !Ref SubnetX SecurityGroupIds: - !Ref SecurityGroup2 Tags: - Key: Name Value: InstanceB InstanceC: Type: AWS::EC2::Instance Properties: ImageId: Fn::FindInMap: - RegionMap - !Ref AWS::Region - execution InstanceType: 't3.nano' SubnetId: !Ref SubnetY SecurityGroupIds: - !Ref SecurityGroup1 Tags: - Key: Name Value: InstanceC ReachablePath: Type: AWS::EC2::NetworkInsightsPath Properties: Source: !Ref InstanceA Destination: !Ref InstanceC DestinationPort: 22 Protocol: tcp Tags: - Key: Name Value: 'Reachable Path' BlockedPath: Type: AWS::EC2::NetworkInsightsPath Properties: Source: !Ref InstanceB Destination: !Ref InstanceC DestinationPort: 22 Protocol: tcp Tags: - Key: Name Value: 'Blocked Path' AccessToInternet: Type: AWS::EC2::NetworkInsightsAccessScope Properties: MatchPaths: - Destination: ResourceStatement: ResourceTypes: - AWS::EC2::InternetGateway Tags: - Key: Name Value: 'All Access To Internet'