ホームページ  >  記事  >  バックエンド開発  >  AWS Lambda で Application Load Balancer (ALB) を使用する場合の実際のクライアント IP の取得

AWS Lambda で Application Load Balancer (ALB) を使用する場合の実際のクライアント IP の取得

王林
王林オリジナル
2024-07-21 04:25:19681ブラウズ

Getting the Actual Client IP When Using Application Load Balancer (ALB) in AWS Lambda

私が AWS を初めて使用したとき、ドキュメントにデジタル署名するタスクに取り組んでいたときに、電子署名の一部としてクライアントの IP を必要とする興味深い課題に直面しました。最初は、実装が初めて完璧に機能したように見えたときに興奮しました。しかし、私の興奮も長くは続きませんでした。テスト中に、別のマシンからアプリケーションにアクセスした場合でも、同じ IP アドレスが返されることに気付きました。そのとき、受け取っていた IP アドレスが実際のクライアント IP ではなく、ロード バランサーの IP であることに気づきました。

この発見は私を調査と学習の道に導きました。何が起こっているのか、そして実際のクライアント IP を取得する方法を理解するには、さらに深く掘り下げる必要がありました。このブログでは、私の経験を共有し、AWS Lambda と Python を使用してこれを実現し、Application Load Balancer (ALB) を使用するときにクライアントの IP アドレスを正確にキャプチャできるようにする方法に関する包括的なガイドを提供します。

課題を理解する

クライアントが ALB を通じてアプリケーションにリクエストを送信すると、ロード バランサーが仲介者として機能します。したがって、アプリケーションが認識する IP アドレスは、クライアントの IP アドレスではなく、ALB の IP アドレスになります。これに対処するために、ALB はクライアントの IP を X-Forwarded-For HTTP ヘッダーに含めます。リクエストが複数のプロキシを通過した場合、このヘッダーには複数の IP アドレスを含めることができます。

処理する必要があるものは次のとおりです:

  • クライアント IP を抽出します: X-Forwarded-For ヘッダーを取得して解析します。

  • 複数の IP を処理する: 複数のプロキシが関係している場合でも、正しいクライアント IP を取得できるようにします。

セキュリティの考慮事項

X-Forwarded-For ヘッダーは、潜在的なセキュリティ リスクがあるため、注意して使用する必要があります。エントリは、ネットワーク内で適切に保護されたシステムによって追加された場合にのみ信頼できると見なされます。これにより、クライアント IP が改ざんされず、信頼できることが保証されます。

適切なツールの選択

AWSラムダとPython

AWS Lambda は、サーバーのプロビジョニングや管理を行わずにコードを実行できるサーバーレス コンピューティング サービスです。 Python は、そのシンプルさと読みやすさにより、Lambda 関数内でこのタスクを処理するのに最適な選択肢です。

主要コンポーネント

  1. AWS Lambda 関数: 受信リクエストを処理するコア関数。

  2. Application Load Balancer (ALB): リクエストを Lambda 関数に転送するロードバランサー。

実装の詳細

ALB を使用した AWS Lambda のセットアップ

まず、Lambda 関数がセットアップされ、ALB と統合されていることを確認します。必要に応じて、AWS の公式ガイドに従ってください: Application Load Balancer のターゲットとしての Lambda 関数の使用。

Lambda関数コード

Lambda 関数の Python コードを見てみましょう。この関数は、X-Forwarded-For ヘッダーからクライアントの IP アドレスを抽出します。

import json

def lambda_handler(event, context):
    # Extract the 'X-Forwarded-For' header
    x_forwarded_for = event['headers'].get('x-forwarded-for')

    if x_forwarded_for:
        # The first IP in the list is the client's IP
        client_ip = x_forwarded_for.split(',')[0]
    else:
        # Fallback if header is not present
        client_ip = event['requestContext']['identity']['sourceIp']

    # Log the client IP
    print(f"Client IP: {client_ip}")

    # Respond with the client IP
    return {
        'statusCode': 200,
        'body': json.dumps({'client_ip': client_ip})
    }

説明

  • ヘッダーの抽出: 受信リクエストから X-Forwarded-For ヘッダーを取得します。

  • ヘッダーを解析します。クライアントの元の IP を表す最初の IP を取得します。

  • フォールバック メカニズム: ヘッダーが存在しない場合は、リクエスト コンテキストのソース IP を使用します。

  • ログと応答: 検証のためにクライアントの IP をログに記録して返します。

リクエストとレスポンスの例

リクエスト:

{
    "headers": {
        "x-forwarded-for": "203.0.113.195, 70.41.3.18, 150.172.238.178"
    },
    "requestContext": {
        "identity": {
            "sourceIp": "70.41.3.18"
        }
    }
}

応答:

{
    "client_ip": "203.0.113.195"
}

結論

ALB の背後にある AWS Lambda 関数で実際のクライアント IP を特定するには、X-Forwarded-For ヘッダーを慎重に処理する必要があります。このアプローチにより、正確な IP ログが確保され、ユーザー操作をパーソナライズして安全にするアプリケーションの機能が強化されます。

参考文献

  • AWS ALB ドキュメント:

  • AWS Lambda の Python:

  • HTTP ヘッダーの説明

以上がAWS Lambda で Application Load Balancer (ALB) を使用する場合の実際のクライアント IP の取得の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。