AWS Network Load Balancer(NLB)は、単一または複数のアベイラビリティゾーン内のAmazon EC2インスタンスなどの複数のターゲットに受信アプリケーショントラフィックを分散する強力なツールだ。高いスループットと低レイテンシを提供し、超低レイテンシを維持しながら毎秒数百万のリクエストを処理するよう設計されている。しかし、NLBの制限の一つはHTTPヘッダーを直接変更できないことだ。この記事では、この制限を回避するための様々なテクニックを探り、AWS環境でこれらのソリューションを実装するための完全な例を提供する。

AWS Network Load Balancerの紹介

AWS Network Load Balancerは接続レベル(レイヤー4)で動作し、IPプロトコルデータに基づいて接続をターゲットにルーティングする。NLBは極端なパフォーマンスと低レイテンシを必要とするアプリケーションに理想的で、ゲーム、金融取引、動画ストリーミングなどのリアルタイムアプリケーションに適している。

NLBの主な機能:
  1. 静的IP: 各NLBには、動作するアベイラビリティゾーン(AZ)ごとに1つの静的IPが割り当てられる。
  2. Elastic IP: NLBに1つ以上のElastic IPアドレスを関連付けることができる。
  3. TLS終端: NLBはTLS終端をオフロードしてアプリケーションサーバーのCPU負荷を最小化できる。
  4. クロスゾーンロードバランシング: 有効な全AZの全ターゲットにトラフィックを均等に分散する。
  5. ターゲットヘルスモニタリング: ターゲットのヘルスを自動的にチェックし、正常なターゲットにのみトラフィックをルーティングする。

ヘッダー変更の必要性

HTTPヘッダーの変更は、以下のような様々なユースケースで不可欠であることが多い:

  • セキュリティヘッダーの追加(Content-Security-Policyなど)
  • ログ記録やトラッキング用のカスタムヘッダーの注入
  • バックエンド処理のためのUser-Agentヘッダーの変更
  • ヘッダーに基づくセキュリティポリシーの実装

NLBのレイヤー4動作を考慮すると、直接のヘッダー変更は不可能だ。しかし、AWS Lambda、Amazon API Gateway、Application Load Balancer(ALB)を使用してこれを実現できる。

ソリューション1: AWS LambdaとAmazon API Gatewayの使用

Step 1: AWS Lambda関数の作成

まず、受信リクエストのヘッダーを変更するLambda関数を作成する。

  1. AWS Lambdaコンソールに移動する
  2. 新しいLambda関数を作成する:
    • 「一から作成」を選択
    • 関数名を入力(例: ModifyHeadersFunction
    • ランタイムを選択(例: Python 3.8)
    • 基本的なLambda権限を持つ実行ロールを作成
  3. Lambda関数コードを記述する:

def lambda_handler(event, context):
    # Log the incoming event
    print("Received event: " + json.dumps(event, indent=2))
# Modify the headers
event['headers']['X-Custom-Header'] = 'CustomHeaderValue'

return {
    'statusCode': 200,
    'headers': {
        'Content-Type': 'application/json'
    },
    'body': json.dumps({
        'message': 'Header modified successfully',
        'input': event
    })
}</code></pre>
  1. 関数をデプロイする。
Step 2: Amazon API Gatewayの作成

次に、リクエストをLambda関数にルーティングするAPI Gatewayを作成する。

  1. Amazon API Gatewayコンソールに移動する
  2. 新しいAPIを作成する:
    • 「HTTP API」を選択
    • 新しいAPIをセットアップ
  3. APIをLambda関数と統合する:
    • 先ほど作成したLambda関数を選択して統合を追加
    • ルートとメソッドを設定(例: POST /modify)
  4. APIをデプロイし、エンドポイントURLをメモする。
Step 3: NLBをAPI Gatewayに向ける

最後に、API GatewayのURLをNLBのターゲットとして設定する。

  1. EC2コンソールに移動する
  2. Load Balancerに移動し、NLBを選択する
  3. ターゲットグループを設定し、API Gatewayのエンドポイントを指すようにする

このセットアップにより、すべてのトラフィックがAPI Gatewayを経由し、Lambda関数がバックエンドサービスにリクエストを転送する前にヘッダーを変更する。

ソリューション2: AWS WAFの使用

AWS WAFを使用してリクエストがバックエンドサービスに到達する前に検査・変更できるが、この方法は直接ヘッダーを変更するというよりフィルタリングに近い。

  1. AWS WAFでWeb ACLを作成する
  2. ルールを定義し、ヘッダーを検査してアクション(ブロック、許可、カウント)を実行する
  3. Web ACLをNLBに関連付ける
ルール例:
IF request.headers['User-Agent'] matches 'bad-bot'
THEN block request

このセットアップは、悪意のあるリクエストをフィルタリングしたり、特定の条件に基づいてリクエストを変更したりするのに役立つ。

まとめ

AWS Network Load Balancerは堅牢なパフォーマンスとスケーラビリティを提供するが、レイヤー4の性質上、直接のヘッダー変更は制限される。しかし、Amazon API GatewayとAWS Lambda、またはAWS WAFを活用することで、目的のヘッダー変更機能を実現できる。

各ソリューションには独自の強みがあり、異なるユースケースに適している:

  • AWS LambdaとAPI Gateway: 特定の複雑なヘッダー操作に最適
  • AWS WAF: 検査とフィルタリングが必要なセキュリティ重視のアプリケーションに理想的

これらのテクニックと実装を理解することで、AWS環境でHTTPヘッダーを効果的に管理・変更し、アプリケーションの安全性、効率性、高可用性を確保できる。

これらのソリューションの実装について質問やさらなるサポートが必要な場合は、お気軽にご連絡を。AWSでの構築を楽しもう!