「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > AWS Lambda で Application Load Balancer (ALB) を使用する場合の実際のクライアント IP の取得

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

2024 年 8 月 6 日に公開
ブラウズ:944

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 ヘッダーの説明

リリースステートメント この記事は次の場所に転載されています: https://dev.to/rkj180220/getting-the-actual-client-ip-when-using-application-load-balancer-alb-in-aws-lambda-4fcn?1If there's侵害がある場合は、削除するには[email protected]までご連絡ください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3