I've got a Python script for an AWS Lambda function that does HTTP POST requests to another endpoint. Since Python's urllib2.request
, https://docs.python.org/2/library/urllib2.html , can only handle data in the standard application/x-www-form-urlencoded
format and I want to post JSON data, I used the Requests library, https://pypi.org/project/requests/2.7.0/ .
That Requests library wasn't available at AWS Lambda in the Python runtime environment, so had to be imported via from botocore.vendored import requests
. So far, so good.
Today, I get a deprecation warning on that:
DeprecationWarning: You are using the post() function from 'botocore.vendored.requests'.
This is not a public API in botocore and will be removed in the future.
Additionally, this version of requests is out of date. We recommend you install the
requests package, 'import requests' directly, and use the requests.post() function instead.
This was mentioned in this blog post from AWS too: https://aws.amazon.com/blogs/developer/removing-the-vendored-version-of-requests-from-botocore/ .
Unfortunately, changing from botocore.vendored import requests
into import requests
results in the following error:
No module named 'requests'
Why is requests
not available for the Python runtime at AWS Lambda? And how can I use / import it?
I succeeded sending HTTP POST requests using the urllib3
library, which is available at AWS Lambda without the requirements for additional installation instructions.
import urllib3
http = urllib3.PoolManager()
response = http.request('POST',
url,
body = json.dumps(some_data_structure),
headers = {'Content-Type': 'application/json'},
retries = False)
Check out the instructions here: https://docs.aws.amazon.com/lambda/latest/dg/python-package.html#python-package-dependencies
All you need to do is download the requests module locally, then include it in your Lambda function deployment package (ZIP archive).
Example (if all your Lambda function consisted of was a single Python module + requests module):
$ pip install --target ./package requests
$ cd package
$ zip -r9 ${OLDPWD}/function.zip .
$ cd $OLDPWD
$ zip -g function.zip lambda_function.py
$ aws lambda update-function-code --function-name my-function --zip-file fileb://function.zip
Answer 2020-06-18
I found a nice and easy way to use requests
inside AWS Lambda functions!
Open this link and find the region that your function is using:
https://github.com/keithrozario/Klayers/tree/master/deployments/python3.8/arns
Open the .csv
related to your region and search for the requests
row.
This is the ARN
related to requests
library:
arn:aws:lambda:us-east-1:770693421928:layer:Klayers-python38-requests:6
So now in your lambda function, add a layer using the ARN found.
Obs.: make sure your Python lambda function runtime is python3.8 .
If you are using serverless framework
Specify the plugin in serverless.yml
plugins:
- serverless-python-requirements
At the directory root create file requirements.txt
requirements.txt
requests==2.22.0
This will install the requests and packages mentioned.
requests is NOT part of core python. See https://docs.aws.amazon.com/en_pv/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html about packaging a Lambda having external dependencies (in your case the requests library)
Amazon's Serverless Application Model (SAM) provides a build command that can bundle arbitrary python dependencies into the deployment artifact.
To be able to use the requests
package in your code, add the dependency to your requirements.txt file:
requests==2.22.0
then run sam build
to get an artifact that vendors requests
. By default, your artifacts will be saved to the .aws-sam/build
directory but another destination directory can be specified with the --build-dir
option.
Consult SAM's documentation for more info.
Here's my redneck solution that works with any library, using an AWS Lambda Layer:
This has the advantage that you don't have to trust any 3rd party layers, because you can easily make it yourself.
pip install requests
and thenimport requests
to use.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.