Merge pull request #955 from spulec/add-support-to-plain-text-zipfile-for-lambda

Fix CloudFormation Lambda ZipFile implementation to be plain text
This commit is contained in:
Jack Danger 2017-05-18 09:32:14 -07:00 committed by GitHub
commit fe51fadda5
2 changed files with 22 additions and 20 deletions

View File

@ -198,10 +198,26 @@ class LambdaFunction(BaseModel):
if prop in properties:
spec[prop] = properties[prop]
# when ZipFile is present in CloudFormation, per the official docs,
# the code it's a plaintext code snippet up to 4096 bytes.
# this snippet converts this plaintext code to a proper base64-encoded ZIP file.
if 'ZipFile' in properties['Code']:
spec['Code']['ZipFile'] = base64.b64encode(
cls._create_zipfile_from_plaintext_code(spec['Code']['ZipFile']))
backend = lambda_backends[region_name]
fn = backend.create_function(spec)
return fn
@staticmethod
def _create_zipfile_from_plaintext_code(code):
zip_output = io.BytesIO()
zip_file = zipfile.ZipFile(zip_output, 'w', zipfile.ZIP_DEFLATED)
zip_file.writestr('lambda_function.zip', code)
zip_file.close()
zip_output.seek(0)
return zip_output.read()
class LambdaBackend(BaseBackend):

View File

@ -1846,29 +1846,14 @@ def test_datapipeline():
data_pipelines['pipelineIdList'][0]['id'])
def _process_lamda(pfunc):
import io
import zipfile
zip_output = io.BytesIO()
zip_file = zipfile.ZipFile(zip_output, 'w', zipfile.ZIP_DEFLATED)
zip_file.writestr('lambda_function.zip', pfunc)
zip_file.close()
zip_output.seek(0)
return zip_output.read()
def get_test_zip_file1():
pfunc = """
def lambda_handler(event, context):
return (event, context)
"""
return _process_lamda(pfunc)
@mock_cloudformation
@mock_lambda
def test_lambda_function():
# switch this to python as backend lambda only supports python execution.
lambda_code = """
def lambda_handler(event, context):
return (event, context)
"""
template = {
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
@ -1876,7 +1861,8 @@ def test_lambda_function():
"Type": "AWS::Lambda::Function",
"Properties": {
"Code": {
"ZipFile": base64.b64encode(get_test_zip_file1()).decode('utf-8')
# CloudFormation expects a string as ZipFile, not a ZIP file base64-encoded
"ZipFile": {"Fn::Join": ["\n", lambda_code.splitlines()]}
},
"Handler": "lambda_function.handler",
"Description": "Test function",