」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 在 AWS Lambda 中使用 Application Load Balancer (ALB) 時取得實際用戶端 IP

在 AWS Lambda 中使用 Application Load Balancer (ALB) 時取得實際用戶端 IP

發佈於2024-08-06
瀏覽:453

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

當我剛接觸 AWS 時,我在執行對文件進行數位簽章的任務時遇到了一個有趣的挑戰,該任務需要客戶的 IP 作為電子簽章的一部分。最初,當第一次實現似乎完美運行時,我感到很興奮。然而,我的興奮是短暫的。在測試過程中,我注意到即使我從不同的機器存取應用程序,也會返回相同的 IP 位址。就在那時,我意識到我收到的 IP 位址不是實際的客戶端 IP,而是負載平衡器的 IP。

這個發現帶領我走上了一條調查和學習的道路。我必須更深入地了解發生了什麼以及如何檢索真實的客戶端 IP。在這篇部落格中,我將分享我的經驗,並提供有關如何使用 AWS Lambda 和 Python 實現此目標的全面指南,確保您在使用應用程式負載平衡器 (ALB) 時能夠準確捕獲客戶端的 IP 位址。

了解挑戰

當客戶端透過 ALB 向您的應用程式發出請求時,負載平衡器充當中介。因此,您的應用程式看到的 IP 位址是 ALB 的 IP 位址,而不是客戶端的 IP 位址。為了解決這個問題,ALB 在 X-Forwarded-For HTTP 標頭中包含客戶端的 IP。如果請求通過多個代理,此標頭可以包含多個 IP 位址。

這是我們需要處理的:

  • 擷取客戶端IP:擷取並解析X-Forwarded-For標頭。

  • 處理多個IP:即使涉及多個代理,也確保我們獲得正確的客戶端IP。

安全考慮

由於潛在的安全風險,應謹慎使用 X-Forwarded-For 標頭。只有由網路內受到適當保護的系統所添加的條目才被認為是可信的。這確保了客戶端IP不被篡改且可靠。

選擇正確的工具

AWS Lambda 和 Python

AWS Lambda 是一種無伺服器運算服務,讓您無需預置或管理伺服器即可執行程式碼。 Python 以其簡單性和可讀性,是在 Lambda 函數中處理此任務的絕佳選擇。

關鍵零件

  1. AWS Lambda Function:處理傳入請求的核心函數。

  2. Application Load Balancer (ALB):將請求轉送至 Lambda 函數的負載平衡器。

實施細節

使用 ALB 設定 AWS Lambda

首先,請確保您的 Lambda 函數已設定並與 ALB 整合。如果需要,請遵循 AWS 的官方指南:使用 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 標頭。

  • 解析Header:取第一個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?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • PART# 使用 HTTP 進行大型資料集的高效能檔案傳輸系統
    PART# 使用 HTTP 進行大型資料集的高效能檔案傳輸系統
    让我们分解提供的HTML、PHP、JavaScript和CSS代码对于分块文件上传仪表板部分。 HTML 代码: 结构概述: Bootstrap for Layout:代码使用 Bootstrap 4.5.2 创建一个包含两个主要部分的响应式布局: 分块上传部分:用于...
    程式設計 發佈於2024-11-06
  • 比較:Lithe 與其他 PHP 框架
    比較:Lithe 與其他 PHP 框架
    如果您正在為下一個專案探索 PHP 框架,很自然會遇到 Laravel、Symfony 和 Slim 等選項。但是,是什麼讓 Lithe 與這些更強大、更知名的框架區分開來呢?以下是一些突出 Lithe 如何脫穎而出的注意事項。 1. 輕量級與性能 Lithe 的設計重點在於輕量級...
    程式設計 發佈於2024-11-06
  • 程式設計風格指南:編寫簡潔程式碼的實用指南
    程式設計風格指南:編寫簡潔程式碼的實用指南
    在过去的五年里,我一直在不断尝试提高我的编码技能,其中之一就是学习和遵循最推荐的编码风格。 本指南旨在帮助您编写一致且优雅的代码,并包含一些提高代码可读性和可维护性的建议。它的灵感来自于社区中最受接受的流行指南,但进行了一些修改以更适合我的喜好。 值得一提的是,我是一名全栈 JavaScript 开...
    程式設計 發佈於2024-11-06
  • 檢查類型是否滿足 Go 中的接口
    檢查類型是否滿足 Go 中的接口
    在Go中,開發人員經常使用介面來定義預期的行為,使程式碼靈活且健壯。但是如何確保類型真正實現接口,尤其是在大型程式碼庫中? Go 提供了一種簡單有效的方法來在編譯時驗證這一點,防止執行時間錯誤的風險並使您的程式碼更加可靠和可讀。 您可能看過類似的文法 var _ InterfaceName = ...
    程式設計 發佈於2024-11-06
  • 掌握 JavaScript 中的 &#this&# 關鍵字
    掌握 JavaScript 中的 &#this&# 關鍵字
    JavaScript 中的 this 關鍵字如果不理解的話可能會非常棘手。這是即使是經驗豐富的開發人員也很難輕鬆掌握的事情之一,但一旦你掌握了,它可以為你節省大量時間。 在本文中,我們將了解它是什麼、它在不同情況下如何運作以及使用它時不應陷入的常見錯誤。 在 JavaScript...
    程式設計 發佈於2024-11-06
  • PHP 中的使用者瀏覽器偵測可靠嗎?
    PHP 中的使用者瀏覽器偵測可靠嗎?
    使用 PHP 進行可靠的用戶瀏覽器檢測確定用戶的瀏覽器對於定制 Web 體驗至關重要。 PHP 提供了兩種可能的方法: $_SERVER['HTTP_USER_AGENT'] 和 get_browser() 函數。 $_SERVER['HTTP_USER_AGENT'...
    程式設計 發佈於2024-11-06
  • 增強您的 Web 動畫:像專業人士一樣最佳化 requestAnimationFrame
    增強您的 Web 動畫:像專業人士一樣最佳化 requestAnimationFrame
    流畅且高性能的动画在现代 Web 应用程序中至关重要。然而,管理不当可能会使浏览器的主线程过载,导致性能不佳和动画卡顿。 requestAnimationFrame (rAF) 是一种浏览器 API,旨在将动画与显示器的刷新率同步,从而确保与 setTimeout 等替代方案相比更流畅的运动。但有效...
    程式設計 發佈於2024-11-06
  • 為什麼MySQL伺服器在60秒內就消失了?
    為什麼MySQL伺服器在60秒內就消失了?
    MySQL 伺服器已消失- 恰好在60 秒內在此場景中,之前成功運行的MySQL 查詢現在遇到了60 秒後逾時,顯示錯誤「MySQL 伺服器已消失」。即使調整了 wait_timeout 變量,問題仍然存在。 分析:超時正好發生在 60 秒,這表明是設置而不是資源限制是原因。直接從 MySQL 客戶...
    程式設計 發佈於2024-11-06
  • 為什麼帶有“display: block”和“width: auto”的按鈕無法拉伸以填充其容器?
    為什麼帶有“display: block”和“width: auto”的按鈕無法拉伸以填充其容器?
    了解具有“display: block”和“width: auto”的按鈕的行為當您設定“display: block”時一個按鈕,它會調整其佈局以佔據可用的整個寬度。但是,如果將其與“width: auto”結合使用,則按鈕會出現意外行為,並且無法拉伸以填充其容器。此行為源自於按鈕作為替換元素的基...
    程式設計 發佈於2024-11-06
  • 為 Bluesky Social 創作機器人
    為 Bluesky Social 創作機器人
    How the bot will work We will develop a bot for the social network Bluesky, we will use Golang for this, this bot will monitor some hashtags ...
    程式設計 發佈於2024-11-06
  • 為什麼 PHP 的浮點運算會產生意外的結果?
    為什麼 PHP 的浮點運算會產生意外的結果?
    PHP 中的浮點數計算精度:為什麼它很棘手以及如何克服它在PHP 中處理浮點數時,這一點至關重要了解其固有的準確性限制。如程式片段所示:echo("success");} else {echo("error");} 您可能會驚訝地發現,儘管值之間的差異小於0....
    程式設計 發佈於2024-11-06
  • Python中可以透過變數ID逆向取得物件嗎?
    Python中可以透過變數ID逆向取得物件嗎?
    從 Python 中的變數 ID 擷取物件參考Python 中的 id() 函數傳回物件的唯一識別。人們很容易想知道是否可以反轉此過程並從其 ID 取得物件。 具體來說,我們想要檢查取消引用變數的ID 是否會擷取原始物件:dereference(id(a)) == a瞭解引用的概念及其在Python...
    程式設計 發佈於2024-11-06
  • Go 的 Defer 關鍵字如何在函數執行順序中發揮作用?
    Go 的 Defer 關鍵字如何在函數執行順序中發揮作用?
    了解 Go 的 Defer 關鍵字的功能使用 Go 時,了解 defer 關鍵字的行為至關重要。此關鍵字允許開發人員推遲函數的執行,直到周圍的函數返回。但是,需要注意的是,函數的值和參數在執行 defer 語句時進行評估。 範例:評估 Defer Order為了說明這一點,請考慮以下內容代碼:pac...
    程式設計 發佈於2024-11-06
  • WordPress Gutenberg 全域狀態管理初學者指南
    WordPress Gutenberg 全域狀態管理初學者指南
    构建复杂的 WordPress 块编辑器 (Gutenberg) 应用程序时,有效管理状态变得至关重要。这就是 @wordpress/data 发挥作用的地方。它允许您跨 WordPress 应用程序中的不同块和组件管理和共享全局状态。 如果您不熟悉管理全局状态或使用@wordpress/data,...
    程式設計 發佈於2024-11-06
  • 亞馬遜解析簡單且完全由您自己完成
    亞馬遜解析簡單且完全由您自己完成
    I came across a script on the Internet that allows you to parse product cards from Amazon. And I just needed a solution to a problem like that. I wrac...
    程式設計 發佈於2024-11-06

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3