概要
TIMELINE開発部の内原です。
今回はAWS ALBに対するリクエスト時、送信先となるIPアドレスを固定する方法について調査しましたのでその共有です。そこまで一般的な要件ではない気はしますが、参考になれば幸いです。
背景
とある環境において、ALBに対する送信元側がIPアドレスのホワイトリスト形式で通信を許可する構成になっているため前述の要件を満たす必要がありました。
ただ、AWSのALBはIPアドレスが固定されておらず、状況によって変動するという仕様になっています。このため、DNSでALBを指定するにはALB DNS名をCNAMEで指定するか、Route53のAlias機能を用いて指定するのが一般的です。
このやり方だとIPアドレスが変動するため、接続元から接続先IPアドレスを固定したいというニーズは満たせません。
ALBの場合はEIPを用いて固定化することもできない仕様です。
解決策
いくつか選択肢が考えられます。
Global Accelerator(GA) を用いる
GAは本来高速化、安定化の文脈で用いられる機能ですが、副次的に固定IPアドレス(2個)が付与され、このIPアドレス経由で通信可能になるためIPアドレスの固定化をすることができます。
GAはエンドポイントとしてALB, NLB, EC2, EIPを選択することが可能です。つまりALBに対するProxyとして機能し、その中でNetwork経路の最適化やMulti-AZでのfail overといった高速化、安定化が実現できます。
構築手順は以下の通りです。
- Global Acceleratorを追加
- リスナーを指定。今回はSSLのみ対応すればよいため443, TCPを指定
- エンドポイントタイプとしてALB、ロードバランサとして既存ALBを選択
- 作成後、プロビジョニング完了を待つ
上記が完了するとGAのDNS名と固定IPアドレス(2個)が発行されます。またDNS名を解決すると2個のAレコードが返却されます。この際、片方のIPアドレスのみでも通信は可能ですが、可用性を考慮すると冗長な構成が望ましいためDNS経由での通信が適当かと考えます。
その際、SSL証明書はALBが保持しているものが利用されるため、接続する際のホスト名はSSL証明書と合致している必要があります。
Network Load Balancer(NLB) + Elastic IP(EIP) を用いる
NLBは固定IPアドレスを付与することが可能なロードバランサーです。ALBと異なり、レイヤー4のロードバランサーとなるため、SSL終端はできません。そのため、SSL終端はALBで行い、NLBはALBの前段に配置する構成となります。
構築手順は以下の通りです。
- NLBを作成
- リスナーを指定。今回はSSLのみ対応すればよいため443, TCPを指定
- ターゲットグループを作成し、既存ALBを指定
- EIPを取得し、作成済みNLBにアタッチ
上記が完了するとNLBに固定IPアドレスが付与されます。またNLBのDNS名を解決するとEIPのAレコードが返却されるため、このIPアドレス経由で通信が可能になります。
その際、SSL証明書はALBが保持しているものが利用されるため、接続する際のホスト名はSSL証明書と合致している必要があります。
EC2 + Elastic IP(EIP) を用いる
EC2インスタンスにReverse Proxy(例: Nginx)を構築し、EIPを付与する方法です。ALBの前段に配置し、ALBに対するProxyとして機能します。
構築手順は以下の通りです。
- EC2インスタンスを作成
- Nginx等のReverse Proxyをインストール
- Reverse Proxyの設定を行う
- EIPを取得し、EC2インスタンスにアタッチ
上記が完了するとEC2インスタンスに固定IPアドレスが付与されます。またDNSを解決するとEIPのAレコードが返却されるため、このIPアドレス経由で通信が可能になります。
その際、SSL証明書はEC2インスタンス上に設置する必要がありますが、ALBの証明書と異なっていてもよいことになります。
比較
それぞれの手法において特徴を確認します。
なおいずれの手法においても既存のALBの前段にアタッチする形式となるため、サービスのダウンタイムは発生しません。(ただし接続先の切り替え作業は必要です)
また機能要件としては以下を想定します。
- 接続はSSL
- 東京リージョン(送信元は日本国内)
- 100GB/月のデータ転送
- 24時間稼働
比較表
今回のユースケースにおけるコストや機能についての比較表は以下です。
なお、GAやNLBにおいて最適な利用シーンは元々差異がありますが、今回の用途において特に影響がなかった部分は無視しています。
手法 | 費用 | 冗長性 | 経路最適化 | SSL終端化 | セキュリティ保護 |
---|---|---|---|---|---|
GA | GA本体 $0.025 × 24h × 30日 = $18.00 データ転送 $0.010 × 100GB = $1.00 IPアドレス 2個 × $0.005 × 24h × 30日 = $7.20 合計約 $26.20/月 |
○ | あり | 不要 | あり |
NLB+EIP | NLB本体 $0.0243 × 24h × 30日 = $17.49 LCU $0.006 × 24h × 30日 = $4.32 EIP $0.005 × 24h × 30日 = $3.60 合計約 $25.41/月 |
○ | なし | 不要 | なし |
EC2+EIP | EC2 (t3.micro) $0.0136 × 24h × 30日 = $9.79 データ転送 $0.114 × 100GB = $11.40 EIP $0.005 × 24h × 30日 = $3.60 合計 約 $24.79/月 |
△ | なし | 必要 | なし(要実装) |
コスト的にはどの選択肢も大きな違いはないようです。
ただEC2+EIPは別途SSL終端化が必要であり、かつ別途インスタンスのメンテナンスも必要となり運用コストが高くなります。また冗長性にも課題があるため、この選択肢を採る利点は薄いように思われます。
GAとNLB+EIPとではコスト的には多少後者が低いもののほぼ同レベルです。GAのほうは経路最適化が可能ですが、日本国内間の通信であればさほど影響はないかもしれません。
GAのほうが新機能であることを踏まえると、より活発な機能追加が行われる可能性は高そうなのでやや有利と言えるかもしれません。
まとめ
ALBのIPアドレスを固定化する複数の手法について比較検討してみました。 今回のユースケースにおいてはGAを用いるのが一番適当に思われますが、状況によっては別の選択肢もあり得そうです。