diff --git a/aws_lambda/aws_lambda.py b/aws_lambda/aws_lambda.py index 4bdff31..3dc62a3 100755 --- a/aws_lambda/aws_lambda.py +++ b/aws_lambda/aws_lambda.py @@ -171,8 +171,12 @@ def build(src, local_package=None): function_name = cfg.get('function_name') output_filename = "{0}-{1}.zip".format(timestamp(), function_name) + # Handle if we needed to add an "extra-index-url" to our requirements file + # to successfully download required packages. + extra_index_url = cfg.get('extra_index_url', None) + path_to_temp = mkdtemp(prefix='aws-lambda') - pip_install_to_target(path_to_temp, local_package) + pip_install_to_target(path_to_temp, local_package, extra_index_url) # Gracefully handle whether ".zip" was included in the filename or not. output_filename = ('{0}.zip'.format(output_filename) @@ -233,7 +237,7 @@ def get_handler_filename(handler): return '{0}.py'.format(module_name) -def pip_install_to_target(path, local_package=None): +def pip_install_to_target(path, local_package=None, extra_index_url=None): """For a given active virtualenv, gather all installed pip packages then copy (re-install) them to the path provided. @@ -252,7 +256,13 @@ def pip_install_to_target(path, local_package=None): r = r.replace('-e ','') print('Installing {package}'.format(package=r)) - pip.main(['install', r, '-t', path, '--ignore-installed']) + pip_command_arguments = ['install', r, '-t', path, '--ignore-installed'] + + # Add optional pip arguments (--extra-index-url) to the base pip command + if extra_index_url is not None and extra_index_url != '': + pip_command_arguments += ['--extra-index-url', extra_index_url] + + pip.main(pip_command_arguments) if local_package is not None: pip.main(['install', local_package, '-t', path]) @@ -357,8 +367,8 @@ def function_exists(cfg, function_name): aws_secret_access_key = cfg.get('aws_secret_access_key') client = get_client('lambda', aws_access_key_id, aws_secret_access_key, cfg.get('region')) - functions = client.list_functions().get('Functions', []) - for fn in functions: - if fn.get('FunctionName') == function_name: - return True - return False + try: + client.get_function(FunctionName=function_name) + return True + except botocore.errorfactory.ResourceNotFoundException as e: + return False diff --git a/aws_lambda/project_templates/config.yaml b/aws_lambda/project_templates/config.yaml index 7f39794..76cace0 100644 --- a/aws_lambda/project_templates/config.yaml +++ b/aws_lambda/project_templates/config.yaml @@ -10,6 +10,11 @@ description: My first lambda function aws_access_key_id: aws_secret_access_key: +# Lambda Configuration Settings +# role: lambda_basic_execution # dist_directory: dist # timeout: 15 # memory_size: 512 + +# (Optional) Pip Settings +# extra_index_url: diff --git a/requirements.txt b/requirements.txt index 683f195..a1ec6fc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ -boto3==1.4.1 -botocore==1.4.61 +boto3==1.4.4 +botocore==1.5.27 click==6.6 docutils==0.12 futures==3.0.5