Error while running a python script on AWS Lambda after upgrade python 3.6 to 3.7
Question:
My python function stopped working after amazon aws dropped lambda support python 3.6, I updated python to 3.7.
import boto3
import os
import random
import string
import botocore
from botocore.client import Config
AWS_REGION = os.environ['AWS_REGION']
DEBUG = false
# generate a random string of n characters, lowercase and numbers
def generate_random(n):
return ''.join(random.SystemRandom().choice(string.ascii_lowercase + string.digits) for _ in range(n))
# checks whether an object already exists in the Amazon S3 bucket
# we do a head_object, if it throws a 404 error then the object does not exist
def exists_s3_key(s3_client, bucket, key):
resp = s3_client.head_object(Bucket=bucket, Key=key)
return True
def handler(event, context):
print(event)
BUCKET_NAME = os.environ['S3_BUCKET'] # from env variable
native_url = event.get("url_long")
cdn_prefix = event.get("cdn_prefix")
### Generate a short id for the redirect
# check if short_key object already exists - collision could occur
s3 = boto3.client('s3', config=Config(signature_version='s3v4'))
while (True):
short_id = generate_random(7)
short_key = "u/" + short_id
if not(exists_s3_key(s3, BUCKET_NAME, short_key)):
break
else:
print("We got a short_key collision: " + short_key + ". Retrying.")
print("We got a valid short_key: " + short_key)
### Third step: create the redirection object in the S3 bucket
resp = s3.put_object(Bucket=BUCKET_NAME,
Key=short_key,
Body=b"",
WebsiteRedirectLocation=native_url,
ContentType="text/plain")
public_short_url = "https://" + cdn_prefix + "/" + short_id;
return { "url_short": public_short_url, "url_long": native_url }
But now when I invoke the script from AWS Lambda getting the below error, not sure if I am missing anything on the script?
What may have changed from python 3.6 to 3.7?
{
"errorMessage": "name 'false' is not defined",
"errorType": "NameError",
"stackTrace": [
" File "/var/lang/lib/python3.7/imp.py", line 234, in load_modulen return load_source(name, filename, file)n",
" File "/var/lang/lib/python3.7/imp.py", line 171, in load_sourcen module = _load(spec)n",
" File "<frozen importlib._bootstrap>", line 696, in _loadn",
" File "<frozen importlib._bootstrap>", line 677, in _load_unlockedn",
" File "<frozen importlib._bootstrap_external>", line 728, in exec_modulen",
" File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removedn",
" File "/var/task/index.py", line 10, in <module>n DEBUG = falsen"
]
}
Answers:
F should be capital in false
DEBUG = False
My python function stopped working after amazon aws dropped lambda support python 3.6, I updated python to 3.7.
import boto3
import os
import random
import string
import botocore
from botocore.client import Config
AWS_REGION = os.environ['AWS_REGION']
DEBUG = false
# generate a random string of n characters, lowercase and numbers
def generate_random(n):
return ''.join(random.SystemRandom().choice(string.ascii_lowercase + string.digits) for _ in range(n))
# checks whether an object already exists in the Amazon S3 bucket
# we do a head_object, if it throws a 404 error then the object does not exist
def exists_s3_key(s3_client, bucket, key):
resp = s3_client.head_object(Bucket=bucket, Key=key)
return True
def handler(event, context):
print(event)
BUCKET_NAME = os.environ['S3_BUCKET'] # from env variable
native_url = event.get("url_long")
cdn_prefix = event.get("cdn_prefix")
### Generate a short id for the redirect
# check if short_key object already exists - collision could occur
s3 = boto3.client('s3', config=Config(signature_version='s3v4'))
while (True):
short_id = generate_random(7)
short_key = "u/" + short_id
if not(exists_s3_key(s3, BUCKET_NAME, short_key)):
break
else:
print("We got a short_key collision: " + short_key + ". Retrying.")
print("We got a valid short_key: " + short_key)
### Third step: create the redirection object in the S3 bucket
resp = s3.put_object(Bucket=BUCKET_NAME,
Key=short_key,
Body=b"",
WebsiteRedirectLocation=native_url,
ContentType="text/plain")
public_short_url = "https://" + cdn_prefix + "/" + short_id;
return { "url_short": public_short_url, "url_long": native_url }
But now when I invoke the script from AWS Lambda getting the below error, not sure if I am missing anything on the script?
What may have changed from python 3.6 to 3.7?
{
"errorMessage": "name 'false' is not defined",
"errorType": "NameError",
"stackTrace": [
" File "/var/lang/lib/python3.7/imp.py", line 234, in load_modulen return load_source(name, filename, file)n",
" File "/var/lang/lib/python3.7/imp.py", line 171, in load_sourcen module = _load(spec)n",
" File "<frozen importlib._bootstrap>", line 696, in _loadn",
" File "<frozen importlib._bootstrap>", line 677, in _load_unlockedn",
" File "<frozen importlib._bootstrap_external>", line 728, in exec_modulen",
" File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removedn",
" File "/var/task/index.py", line 10, in <module>n DEBUG = falsen"
]
}
F should be capital in false
DEBUG = False