オンプレサーバーをターゲットにしたALBリバースプロキシ環境を構築してみる
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マネージドサービスだけで構築できることが分かって良かったです。