簡體   English   中英

無法在 AWS Lambda 上使用請求模塊

[英]Cannot use Requests-Module on AWS Lambda

我需要在每天運行一次的 python 腳本中進行休息調用。 我無法使用 AWS Lambdas 將“請求”包打包到我的 python 包中。 我收到錯誤消息:“無法導入模塊‘lambda_function’:沒有名為 lambda_function 的模塊”

我將其分解為 hello_world 預定義腳本。 我可以將它打包成一個 zip 文件並上傳。 一切正常。 一旦我將“導入請求”放入文件中,就會收到此錯誤。

這是我已經做過的:

  1. zip 和項目文件夾(包括子文件夾)的權限設置為“chmod 777”。 所以權限應該不是問題。
  2. 腳本本身位於根文件夾中。 當您打開 zip 文件時,您會直接看到它。
  3. 我使用 `sudo pip install requests -t PATH_TO_ROOT_FOLDER` 將請求包安裝到項目的根文件夾中

一切的命名看起來像這樣:

  • 壓縮文件:lambda_function.zip
  • py文件:lambda_function.py
  • 處理程序方法:lambda_handler(event, context)
  • “webconfig 中的處理程序定義:lambda_function.lambda_handler

我最終要運行的文件如下所示:

import requests
import json


def lambda_handler(event, context):
    url = 'xxx.elasticbeanstalk.com/users/login'
    headers = {"content-type": "application/json", "Authorization": "Basic Zxxxxxxxxx3NjxxZxxxxzcw==" }
    response = requests.put(url, headers=headers, verify=False)
    return 'hello lambda_handler'

我很高興能提供任何幫助。 我已經在這個問題上使用了多個小時。

編輯:在 2019 年 10 月 21 日,Botocore 刪除了請求的供應商版本: https : //github.com/boto/botocore/pull/1829

編輯 2:(2020 年 3 月 10 日):Lambda 服務在 AWS 開發工具包中捆綁請求模塊的棄用日期現在是 2021 年 1 月 30 日。https: //aws.amazon.com/blogs/compute/upcoming-changes -to-the-python-sdk-in-aws-lambda/

要使用 requests 模塊,您可以簡單地從botocore.vendored導入requests 例如:

from botocore.vendored import requests

def lambda_handler(event, context):
   response = requests.get("https://httpbin.org/get", timeout=10)
   print(response.json())

您可以查看此要點以了解更多可以直接在 AWS lambda 中導入的模塊。

如果您在 AWS Lambda 上使用 Python,並且需要使用requests ,則最好使用urllib3 ,AWS Lambda 目前支持它,您可以直接導入它,查看 urllib3 站點上的示例。

import urllib3

http = urllib3.PoolManager()
r = http.request('GET', 'http://httpbin.org/robots.txt')

r.data
# b'User-agent: *\nDisallow: /deny\n'
r.status
# 200

我終於解決了這個問題:我的 zip 文件中的結構被破壞了。 重要的是,python 腳本和打包的依賴項(作為文件夾)位於 zip 文件的根目錄中。 這解決了我的問題。

如果您在數小時的嘗試和失敗后發現如此簡單的錯誤,這有點令人沮喪。

我相信您在 Lambda 控制台上有lambda_function.py 您需要先創建 Lambda 函數部署包,然后使用控制台上傳包。

  • 您在系統上創建一個目錄,例如project-dir (本地)
  • project-dir創建lambda_function.py ,從 lambda 控制台復制lambda_function.py的內容並將其粘貼到project-dir/lambda_function.py
  • pip install requests -t /path/to/project-dir
  • 壓縮project-dir目錄的內容,也就是你的部署包(壓縮目錄內容,不是目錄)

轉到 Lambda 控制台,在代碼條目類型中選擇上傳 zip 文件並上傳您的部署包。 導入請求應該可以正常工作而不會出現任何錯誤。

使用此命令下載文件夾包

pip install requests -t .

在您的本地機器上運行此命令,然后壓縮您的工作目錄,然后上傳到 aws。

蟒蛇 3.8 視窗 10

lambda 正在尋找特定的文件夾結構,我們將在以下步驟中以這種方式重新創建 ( https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-創建): https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-create

  1. 在桌面上創建一個名為“python”的文件夾,打開一個 cmd 終端:cd desktop
  2. pip install --target python 請求
  3. 右鍵單擊您的 python 文件夾並將其壓縮並將 zip 重命名為 'requests.zip' - 現在如果您查看 zip 內部,您應該會看到 python 文件夾。
  4. aws 控制台 > lambda > 層 > 創建層 => 命名層/上傳 requests.zip
  5. aws 控制台 > 函數 > 創建函數 => 在“設計器”框中選擇圖層,然后“添加圖層”。 選擇自定義圖層並選擇您的圖層。
  6. 單擊設計器框中的 lambda 符號返回函數屏幕。 現在您可以再次看到“功能代碼”。 單擊 lambda_function.py

現在您可以像這樣導入請求:

import json
import requests

def lambda_handler(event, context):
    # TODO implement
    response = requests.get('your_URL')
    return {
        'statusCode': 200,
        'body': json.dumps(response.json())
    }
  1. 從 AWS lambda 控制台復制lambda_function中的任何內容並將其粘貼到新的 python 腳本中,並將其另存為lambda_function.py

  2. 創建一個新文件夾(我將其命名為package )並通過在終端中運行以下代碼將requests模塊保存在其中: pip install -t package requests

  3. lambda_function.py移動到文件夾 ( package ) 中。

  4. 轉到文件夾並選擇所有內容並壓縮它們。

  5. 返回 AWS Lambda 控制台。 選擇函數並在函數代碼部分下,單擊“操作”(在右側)並選擇Upload a .zip file

  6. 上傳文件夾。 lambda_function 應該自動上傳。

  7. 運行和享受。

大多數在某種程度上是正確的,但對於 AWS 初學者來說信息量不夠。 這是我的長篇簡歷,訪問請求功能需要做什么:

1. 為 AWS Lambda 函數創建根文件夾
% mkdir lambda-function
2. 進入 cred 根文件夾
% cd lambda-function
3. 為 AWS Lambda 創建入口點 Python 文件。
% vi lambda_function.py
4. 將代碼粘貼到 lambda_function.py 中
import requests
def lambda_handler(event, context):   
    response = requests.get("https://www.test.com/")
    print(response.text)
    return response.text 
5. 安裝請求庫。 注意:包文件夾已創建
% pip install --target ./package requests
6.進入包裹
% cd package
7. 壓縮包
zip -r ../deployment-package.zip .
8.進入父文件夾
% cd ..
9.壓縮部署包和lambda函數文件
% zip -g deployment-package.zip lambda_function.py
  1. 在 AWS Lambda 函數中,點擊“上傳自”並選擇“ .zip 文件”。 導航到您的 zip 包 zip 文件:deployment-package.zip。
  2. 上傳后,所有文件都將在 AWS Lambda 函數中。

在此處輸入圖片說明

通過指定此 arn (ap-south-1) 向您的 lambda 函數添加一個層

 arn:aws:lambda:ap-south-1:770693421928:layer:Klayers-p38-requests-html:10

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM