【AWS】Gateway Load Balancerについてのメモ ※CFnテンプレート付き

# 1. はじめに
Amazon ELBといえばALBやNLBを連想する方が多いかと思いますが(CLBは流石にもういないかな)、それらとは別にGateway Load Balancer(GWLB)という種類のロードバランサーがあります。

ALBやNLBと違って、用途が大分限定されており、主にサードパーティ製のセキュリティ製品をAWSにマイグレーションする際に使用されます。

本記事では、Gateway Load Balancerに関して管理人が調査した内容をメモ代わりに記載していくものになります。

# 2. Gateway Load Balancerとは?
Gateway Load Balancerとは、2020年11月のRE:inventにて発表されたAWSの新しいロードバランサーです。

主にサードパーティ製のセキュリティ製品をAWSにマイグレーションする際に使用されます。

具体的には、サードパーティ製のセキュリティ製品をAWS上にデプロイする際、監視対象のサーバに対して、VPC PeeringやTransit Gatewayなどでネットワークをつないでルーティングしたり、NATして連携したりしていましたが、GWLBの登場によってそれら全ての手法をGWLBに代替することができます。

一言で言うと、クラウド上のセキュリティ製品との連携が楽になったというわけです。

### [参照]

※以下の記事はGWLBとはなんぞやということがざっくりとまとめられています
- [[Qiita] - Gateway Load Balancer とは](https://qiita.com/miyuki_samitani/items/f5a9b12f39d1b237fced)

# 3. 他のロードバランサーとの違い
他のロードバランサー(ALB,NLB)とのざっくりとした違いとしては、以下の通りとなります。
- <b>ALB</b>
    - NW層：L7
    - HTTP,HTTPSに対応
- <b>NLB</b>
    - NW層：L4
    - TCPに対応
- <b>GWLB</b>
    - NW層：L3
    - Genevaに対応

GWLBはポート6081でGENEVEプロトコルを使用されます。
GENEVEとは簡単に言うとトラフィックをカプセル化する際に使用されるプロトコルです。
GWLBeが受け取ったプロトコルをこのGENEVEプロトコルがカプセル化してターゲットまで中継してくれるわけです。

# 4. ロードバランサーとしての理解
GWLBは従来のロードバランサーとしての考え方というよりはPrivateLinkの概念に近い存在です。
なので、そもそもPrivatelinkやゲートウェイ型エンドポイントの理解が無いとイメージが付きにくいです・・

というのも、先述の通り、GWLB自体はプロトコルを受け取りません。
GWLBエンドポイント(GWLBe)というVPCエンドポイントがプロトコルを受け取ります。
GENEVEプロトコルがGWLBeで受け取ったプロトコルを中継してくれるわけです。

なので、ロードバランサーというよりは、Privatelinkの概念の一つとして理解しておくと良いでしょう。

### [参照]
PrivateLinkの概要については以下の記事がオススメです。
- [AWS PrivateLinkの使い方と注意点 ～VPCピアリングとの使い分け～](https://devlog.arksystems.co.jp/2018/05/11/4896/#)

ゲートウェイ型エンドポイントの概要については以下の記事がオススメです。
- [2つのVPCエンドポイントの違いを知る](https://dev.classmethod.jp/articles/vpc-endpoint-gateway-type/#toc-1)

# 5. GWLBの使用例
繰り返しにはなりますが、GWLBは主にサードパーティ製のセキュリティ製品をAWSにマイグレーションする際に使用されます。

AWSもその目的で開発しています。

なので、GWLBを経由してのWebサービスの構築だとかそういう用途には全く向いていません。
むしろ、GWLBの実態はただのゲートウェイ型VPCエンドポイントなので、そもそもHTTP(s)プロトコルは運んでくれない気がする・・・

なので、GWLBのリリースから1年以上経った今でも、誰でもできるような簡易的なハンズオン系の記事はありません。
(セキュリティ製品前提のサービスなので、どうしても個人で調達できるレベルではない)

実際にセキュリティ製品との連携方法等、GWLBの使用例をまとめてくださっている記事を以下にまとめます。
以下の記事を読んで、GWLBの使用イメージを固めて下さればと思います。

### [参照]

クラスメソッドさんが以下の記事で、PaloAltoをベースとしたGWLBに関するハンズオン内容をまとめてくれていますので、一読しておくことをオススメします。
- [Gateway Load BalancerとPalo Alto VM-Seriesを利用した透過型侵入防御の実装をやってみた](https://dev.classmethod.jp/articles/transparently-ips-with-gwlb-and-paloalto-vm-series/)

AWSの公式ドキュメントで、GWLBの使用方法があがっています。
※ 現状、この経路くらいでしかGWLBの使用用途はないです。
- [Gateway Load Balancer の使用開始方法](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/gateway/getting-started.html)

「AWSの基礎を学ぼう Gateway Load Balancer」というハンズオンセミナーに参加された方のブログです。
セミナーの資料を用いて、GWLBの使用方法について解説して下さっていて、GWLBの使用法についてとても分かりやすくまとめられているので、是非一読しておくことをオススメします。
- [AWSの基礎を学ぼう Gateway Load Balancerに参加しました](https://cloud-aws-gcp.hateblo.jp/entry/2021/09/04/164839)

# 6. CloudFormationテンプレート
CloudFormationでGWLBを構築する場合のテンプレートを以下に記載します。

### Gateway Load Balancer

```yaml
# ------------------------------------------------------------
# Gateway Load Balancer
# ------------------------------------------------------------
### GWLB ###
  GWLB:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Name: "GWLB"
      Type: gateway
      Subnets:
        - !Ref PrivateSubnet
      Tags:
      - Key: Name
        Value: "GWLB"
        
### Target Group(GWLB) ###
  GWLBTargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      Name: "GWLB-TG"
      Port: 6081
      Protocol: GENEVE
      TargetGroupAttributes:
      - Key: deregistration_delay.timeout_seconds
        Value: 20
      VpcId: !Ref VPC
      HealthCheckPort: 80
      HealthCheckProtocol: TCP
      TargetType: instance
      Targets:
        - Id: !Ref EC2Web
      Tags:
      - Key: Name
        Value: "GWLB-TG"
        
### GWLB リスナー ###
  GWLBListener: 
    Type: "AWS::ElasticLoadBalancingV2::Listener"
    Properties: 
      DefaultActions: 
        - TargetGroupArn: !Ref GWLBTargetGroup
          Type: forward
      LoadBalancerArn: !Ref GWLB
```

### EndPoint Service

```yaml
# ------------------------------------------------------------
# EndPointService
# ------------------------------------------------------------
  VPCEndpointService:
    Type: AWS::EC2::VPCEndpointService
    Properties: 
      AcceptanceRequired: true
      GatewayLoadBalancerArns:
        - !Ref GWLB


# ------------------------------------------------------------
# Output Parameter
# ------------------------------------------------------------
Outputs:
  VPCEndpointService:
    Value: { "Fn::Sub": "com.amazonaws.vpce.${AWS::Region}.${VPCEndpointService}" }
    Export:
      Name: "VPCEndpointService"
```

### EndPoint
 
```yaml
# ------------------------------------------------------------
# EndPoint
# ------------------------------------------------------------
  GWLBe:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      VpcId: !Ref VPC
      ServiceName: { "Fn::ImportValue": !Sub "VPCEndpointService" }
      VpcEndpointType: GatewayLoadBalancer
      SubnetIds:
       - !Ref SubnetId
```

# 7. 参考
### GWLBで利用できるパートナー
https://aws.amazon.com/jp/elasticloadbalancing/partners/

・Aviatrix
・Check Point
・Cisco Systems
・ePlus Technology
・cPacket Networks
・Glasnostic
・Fortinet
・HashiCorp
・NETSCOUT
・Palo Alto Networks
・Radware
・Trend Micro
・Valtix

# 8. まとめ
単純にロードバランサーが一つ増えた的な感じで軽く考えていましたが、中身を突き詰めていくとそんな単純なものではないと気付かされました。

本記事はまだ記事として完成しているわけではなく、これからもGWLBについて調査を進めて、その結果を追記していこうと思います。

また、本記事について、情報が誤りがある場合は、是非コメント欄よりご指摘下さい。