この記事は公開されてから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マネージドサービスだけで構築できることが分かって良かったです。