1

问题:如果我在爱尔兰部署 lambda,则 lambda 无法使用托管在伦敦的 s3 触发器。理想情况下,我会在伦敦启动一个 cloud9 实例,但该服务在伦敦尚不可用。

Cloud9 非常适合测试和开发需要与其他 aws 服务交互的 lambda,需要在本地系统上开发的其他 aws 服务的代码需要更改以进行部署,这显然不理想。因此,我宁愿使用 cloud9 IDE 进行开发。

作为一种解决方法,我一直在开发基于爱尔兰的 EC2 实例,然后我有一个脚本,其中复制了 lambda 的基本文件并将其压缩并将其发送到 s3 存储桶。然后我可以在任何地方生成一个 lambda 并从 s3 存储桶中导入 zip。

不过,这样看起来很麻烦,一定有更好的办法吗?

这是代码示例(1)lambda

import json
import re
import boto3
import numpy    

s3 = boto3.client('s3')  

def lambda_handler(event, context):
    """DO SOMETHING"""

    return {
        'statusCode': 200,
        'body': json.dumps('lambda run sucessfully')
    }

(2)python脚本打包lambda(调用bash脚本zip)并将其发送到s3:

import os
import sys
import boto3
import subprocess


def package_lambda(packageName, pathToFiles):
    """Calls a bash script which packages the lambda function and 
        its dependencies into a zip"""

    print('calling bash script')
    subprocess.check_call(['/home/ec2-user/environment/shell_scripts/package_lambda.sh', packageName, pathToFiles])
    print('bash script finished')

    return

def moveFileToBucket(myfile, bucket):
    """pushes a file from the local system to an s3 bucket"""

    if os.path.exists(myfile):
        s3 = boto3.client('s3')
        key=str(myfile).split('/')[-1]
        s3.upload_file(myfile, bucket, key)
        print("{} uploaded sucessfully".format(myfile))
    else:
        raise Exception('No file named: '+myfile)

    return


if __name__=='__main__':
    package_lambda(sys.argv[1], sys.argv[2])
    moveFileToBucket(sys.argv[3], sys.argv[4])

(3) python脚本调用bash脚本压缩lambda:

#!/bin/bash

packageName=$1
pathToFiles=$2

ext1="_package"

# print path incase debuggin is needed
ls -lt $pathToFiles

# set variables
lambda=$pathToFiles/$packageName/$packageName/lambda_function.py
lambda_packages=$pathToFiles/$packageName/

# Remove any previous copies of the package
rm -r $pathToFiles/$packageName$ext1

# print paths for logging/debuggin purposes
ls $lambda
ls $lambda_packages

# copy the lambda
cp -r $lambda_packages $pathToFiles/$packageName$ext1
# move the lambda for packaging
cp $lambda $pathToFiles/$packageName$ext1/lambda_function.py

# remove directories and files which are not needed for zip
rm -r  $pathToFiles/$packageName$ext1/venv
rm -r  $pathToFiles/$packageName$ext1/$packageName
rm $pathToFiles/$packageName$ext1/__init__.py
rm $pathToFiles/$packageName$ext1/template.yaml
rm $pathToFiles/$packageName$ext1/requirements.txt

# move into the package copy to zip
cd $pathToFiles/$packageName$ext1
zip -r ../lambda_function.zip *

然后从命令行调用打包脚本将其发送到存储桶,以便可以将其部署到任何地方。

python3 /home/ec2-user/environment/pythonScripts/packageAndMoveFileToBucket.py myLambdaName /home/ec2-user/environment/pythonLambdaRepo /home/ec2-user/environment/pythonLambdaRepo/lambda_function.zip bucketForLambdas

可能是社区认为这是解决此问题的完美方法?但这感觉有点麻烦,我还没有看到来自亚马逊或其他地方的任何文件表明“更好”的方法?任何反馈都会很棒?

4

1 回答 1

0

听起来您想更改 AWS Cloud9 IDE 当前设置的 AWS 区域,然后将您的 AWS Lambda 函数部署到该新区域。如果是这样,请参阅以下说明,其中描述了如何更改区域:https ://docs.aws.amazon.com/cloud9/latest/user-guide/lambda-functions.html#lambda-functions-prepare-region

于 2019-01-30T21:48:04.207 回答