オンプレサーバーをターゲットにしたALBリバースプロキシ環境を構築してみる

Application Load Balancer (ALB), Network Load Balancer (NLB) は ターゲットにローカルIPアドレス を指定できます。 VPCピアリング接続先のインスタンスや、Direct Connect・VPN接続先の オンプレのサーバーをターゲットグループに登録することができます。

今回は実際にオンプレのサーバーをターゲットに登録した ALBリバースプロキシ環境 を構築してみます。 構築した検証環境は以下の通り。

目次

  1. 背景
  2. 環境構築
  3. 検証
  4. おわりに

背景

私が上の検証環境を構築するに至った経緯を説明します。 (スキップして 次章: 環境構築 を見ていただいてOKです)

Direct Connect(DX) 先の外部サービスの通信制限で、 接続元VPCの CIDRは指定値 にしないとイケないケースを考えます。

この要件を満たすために、 前々回のブログ前回のブログ自前でプロキシサーバーを構築 していました。

が、通信要件次第では AWSマネージドサービス で構成できることが分かりました。

想定する本番環境

ゴールは既存環境(VPC) のAPPサーバーから 外部サービスのローカルIPに対して HTTP(S) 通信 を行えることです。

新規VPCを作成し、その上に Application Load Balancer(ALB) を使ったリバースプロキシ環境 を構築します。 ALBのターゲットには 外部サービスのローカルIP を指定します。

環境構築

検証環境を再掲します。

  • 外部サービスは VPN接続先のオンプレ(自宅)のサーバーとします
  • ALBを配置し ターゲットに オンプレサーバーのローカルIP を指定します
  • APPサーバーが ALB経由でオンプレサーバーに http(s)通信 できることを確認します

構築は CloudFormation(CFn)で行いました。 こちら に作成した CFnテンプレートを上げています。

  • 00-network.yaml: ネットワークリソース作成用
  • 01-sg.yaml: セキュリティグループ作成用
  • 02-ec2-app.yaml: アプリサーバー (Windows) 作成用
  • 03-alb.yaml: ALB 作成用

VPN接続周りは以前あげたブログどおりです。そちら参照ください。

自宅とAWSをVPN接続してみた (Ciscoルータ編)

ALBのCFnテンプレートについて中身を説明していきます。

ALB

下記 3リソースを作成します。

▼— LoadBalancer ---

Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties: 
  Type: application
  Scheme: internal
  IpAddressType: ipv4
  Subnets: 
    - Fn::ImportValue: !Sub ${Prefix}-subnet2-a
    - Fn::ImportValue: !Sub ${Prefix}-subnet2-c
  SecurityGroups:
    - Fn::ImportValue: !Sub ${Prefix}-sg-alb
  Name: !Sub ${Prefix}-alb
  • ALBを作成するので Type: application とします
  • 内部向けを想定しているので Scheme: internal とします
  • 2サブネットに設置するための設定を Subnets: に記載します

▼— TargetGroup ---

Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties: 
  Name: !Sub ${Prefix}-alb-tg
  TargetType: ip
  Protocol: HTTP
  Port: 80
  VpcId:
    Fn::ImportValue: !Sub ${Prefix}-vpc2
  Targets:
    - AvailabilityZone: all
      Id: !Ref TargetIP
      Port: 80
  Tags:
    - Key: Name
      Value: !Sub ${Prefix}-alb-tg
  • ローカルIPアドレスをターゲットとするので TargetType: ip とします
  • ターゲットへの通信は Protocol: HTTPPort: 80 とします
  • Targets: にターゲットを登録していきます
    • Id: !Ref TargetIP でオンプレサーバーのIPアドレスを指定します

▼— Listener ---

Type: AWS::ElasticLoadBalancingV2::Listener
Properties: 
  LoadBalancerArn: !Ref ALB
  Port: 80
  Protocol: HTTP
  DefaultActions: 
    - Type: forward
      TargetGroupArn: !Ref ALBTargetGroup
  • クライアントからのリクエストを Port: 80Protocol: HTTP で受け付けます
  • DefaultActions: でアクションを設定します
    • リクエストを ALBTargetGroup へルーティング ( forward ) します。

検証

まず、ターゲットのステータスを見てみます。

登録したターゲット(オンプレサーバー) のステータスは healthy になっています。

APPサーバーにログインして、オンプレサーバーのサービスを利用できるか検証します。 (オンプレサーバーには Webサービス(http) を立ち上げておきます)

APPサーバーにログインして、ALBにアクセスしてみます。

アクセスできました。

追加: エイリアス作成

検証内容が味気ないので、 オンプレサーバーへのアクセスの別名(エイリアス)を作成してみます。

Route53 にて新規ホストゾーンを作成します。 VPC のプライベートホストゾーン とします。

レコードを作成します。 エイリアス先に ALB を指定します。

エイリアスでアクセスできました。

おわりに

オンプレサーバーをターゲットにしたALBリバースプロキシ環境を構築してみました。 今までプロキシサーバーを自前で作成する構成を検討していたため、運用・監視周りの課題が多かったです。 AWSマネージドサービスだけで構築できることが分かって良かったです。