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

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

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

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]刪除
最新教學 更多>
  • 如何同步迭代並從PHP中的兩個等級陣列打印值?
    如何同步迭代並從PHP中的兩個等級陣列打印值?
    同步的迭代和打印值來自相同大小的兩個數組使用兩個數組相等大小的selectbox時,一個包含country代碼的數組,另一個包含鄉村代碼,另一個包含其相應名稱的數組,可能會因不當提供了exply for for for the uncore for the forsion for for ytry...
    程式設計 發佈於2025-07-02
  • 如何克服PHP的功能重新定義限制?
    如何克服PHP的功能重新定義限制?
    克服PHP的函數重新定義限制在PHP中,多次定義一個相同名稱的函數是一個no-no。嘗試這樣做,如提供的代碼段所示,將導致可怕的“不能重新列出”錯誤。 但是,PHP工具腰帶中有一個隱藏的寶石:runkit擴展。它使您能夠靈活地重新定義函數。 runkit_function_renction_...
    程式設計 發佈於2025-07-02
  • Python中嵌套函數與閉包的區別是什麼
    Python中嵌套函數與閉包的區別是什麼
    嵌套函數與python 在python中的嵌套函數不被考慮閉合,因為它們不符合以下要求:不訪問局部範圍scliables to incling scliables在封裝範圍外執行範圍的局部範圍。 make_printer(msg): DEF打印機(): 打印(味精) ...
    程式設計 發佈於2025-07-02
  • 如何從PHP中的Unicode字符串中有效地產生對URL友好的sl。
    如何從PHP中的Unicode字符串中有效地產生對URL友好的sl。
    為有效的slug生成首先,該函數用指定的分隔符替換所有非字母或數字字符。此步驟可確保slug遵守URL慣例。隨後,它採用ICONV函數將文本簡化為us-ascii兼容格式,從而允許更廣泛的字符集合兼容性。 接下來,該函數使用正則表達式刪除了不需要的字符,例如特殊字符和空格。此步驟可確保slug僅包...
    程式設計 發佈於2025-07-02
  • `console.log`顯示修改後對象值異常的原因
    `console.log`顯示修改後對象值異常的原因
    foo = [{id:1},{id:2},{id:3},{id:4},{id:id:5},],]; console.log('foo1',foo,foo.length); foo.splice(2,1); console.log('foo2', foo, foo....
    程式設計 發佈於2025-07-02
  • CSS可以根據任何屬性值來定位HTML元素嗎?
    CSS可以根據任何屬性值來定位HTML元素嗎?
    靶向html元素,在CSS 中使用任何屬性值,在CSS中,可以基於特定屬性(如下所示)基於特定屬性的基於特定屬性的emants目標元素: 字體家庭:康斯拉斯(Consolas); } 但是,出現一個常見的問題:元素可以根據任何屬性值而定位嗎?本文探討了此主題。 的目標元素有任何任何屬性值,...
    程式設計 發佈於2025-07-02
  • 如何使用Python有效地以相反順序讀取大型文件?
    如何使用Python有效地以相反順序讀取大型文件?
    在python 中,如果您使用一個大文件,並且需要從最後一行讀取其內容,則在第一行到第一行,Python的內置功能可能不合適。這是解決此任務的有效解決方案:反向行讀取器生成器 == ord('\ n'): 緩衝區=緩衝區[:-1] ...
    程式設計 發佈於2025-07-02
  • 如何解決AppEngine中“無法猜測文件類型,使用application/octet-stream...”錯誤?
    如何解決AppEngine中“無法猜測文件類型,使用application/octet-stream...”錯誤?
    appEngine靜態文件mime type override ,靜態文件處理程序有時可以覆蓋正確的mime類型,在錯誤消息中導致錯誤消息:“無法猜測mimeType for for file for file for [File]。 application/application/octet...
    程式設計 發佈於2025-07-02
  • C++中如何將獨占指針作為函數或構造函數參數傳遞?
    C++中如何將獨占指針作為函數或構造函數參數傳遞?
    在構造函數和函數中將唯一的指數管理為參數 unique pointers( unique_ptr [2啟示。通過值: base(std :: simelor_ptr n) :next(std :: move(n)){} 此方法將唯一指針的所有權轉移到函數/對象。指針的內容被移至功能中,在操作...
    程式設計 發佈於2025-07-02
  • Java中假喚醒真的會發生嗎?
    Java中假喚醒真的會發生嗎?
    在Java中的浪費喚醒:真實性或神話? 在Java同步中偽裝喚醒的概念已經是討論的主題。儘管存在這種行為的潛力,但問題仍然存在:它們實際上是在實踐中發生的嗎? Linux的喚醒機制根據Wikipedia關於偽造喚醒的文章,linux實現了pthread_cond_wait()功能的Linux實現,...
    程式設計 發佈於2025-07-02
  • 如何使用Python的請求和假用戶代理繞過網站塊?
    如何使用Python的請求和假用戶代理繞過網站塊?
    如何使用Python的請求模擬瀏覽器行為,以及偽造的用戶代理提供了一個用戶 - 代理標頭一個有效方法是提供有效的用戶式header,以提供有效的用戶 - 設置,該標題可以通過browser和Acterner Systems the equestersystermery和操作系統。通過模仿像Chro...
    程式設計 發佈於2025-07-02
  • 如何修復\“常規錯誤:2006 MySQL Server在插入數據時已經消失\”?
    如何修復\“常規錯誤:2006 MySQL Server在插入數據時已經消失\”?
    How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
    程式設計 發佈於2025-07-02
  • 在Ubuntu/linux上安裝mysql-python時,如何修復\“ mysql_config \”錯誤?
    在Ubuntu/linux上安裝mysql-python時,如何修復\“ mysql_config \”錯誤?
    mysql-python安裝錯誤:“ mysql_config找不到”“ 由於缺少MySQL開發庫而出現此錯誤。解決此問題,建議在Ubuntu上使用該分發的存儲庫。使用以下命令安裝Python-MysqldB: sudo apt-get安裝python-mysqldb sudo pip in...
    程式設計 發佈於2025-07-02
  • PHP陣列鍵值異常:了解07和08的好奇情況
    PHP陣列鍵值異常:了解07和08的好奇情況
    PHP數組鍵值問題,使用07&08 在給定數月的數組中,鍵值07和08呈現令人困惑的行為時,就會出現一個不尋常的問題。運行print_r($月)返回意外結果:鍵“ 07”丟失,而鍵“ 08”分配給了9月的值。 此問題源於PHP對領先零的解釋。當一個數字帶有0(例如07或08)的前綴時,PHP將...
    程式設計 發佈於2025-07-02
  • 如何有效地選擇熊貓數據框中的列?
    如何有效地選擇熊貓數據框中的列?
    在處理數據操作任務時,在Pandas DataFrames 中選擇列時,選擇特定列的必要條件是必要的。在Pandas中,選擇列的各種選項。 選項1:使用列名 如果已知列索引,請使用ILOC函數選擇它們。請注意,python索引基於零。 df1 = df.iloc [:,0:2]#使用索引0和1 ...
    程式設計 發佈於2025-07-02

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

Copyright© 2022 湘ICP备2022001581号-3