
オンプレサーバーをターゲットにしたALBリバースプロキシ環境を構築してみる
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
Application Load Balancer (ALB), Network Load Balancer (NLB) は ターゲットにローカルIPアドレス を指定できます。 VPCピアリング接続先のインスタンスや、Direct Connect・VPN接続先の オンプレのサーバーをターゲットグループに登録することができます。
今回は実際にオンプレのサーバーをターゲットに登録した ALBリバースプロキシ環境 を構築してみます。 構築した検証環境は以下の通り。

目次
背景
私が上の検証環境を構築するに至った経緯を説明します。 (スキップして 次章: 環境構築 を見ていただいて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接続周りは以前あげたブログどおりです。そちら参照ください。
ALBのCFnテンプレートについて中身を説明していきます。
ALB
下記 3リソースを作成します。
- LoadBalancer (AWS CloudFormation ドキュメント)
- TargetGroup (AWS CloudFormation ドキュメント)
- Listener (AWS CloudFormation ドキュメント)
▼— 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マネージドサービスだけで構築できることが分かって良かったです。






