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

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

2019.11.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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: HTTP 、 Port: 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: 80 、 Protocol: HTTP で受け付けます
  • DefaultActions: でアクションを設定します
    • リクエストを ALBTargetGroup へルーティング ( forward ) します。

検証

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

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

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

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

アクセスできました。

追加: エイリアス作成

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

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

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

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

おわりに

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

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事