【发布时间】:2019-06-19 13:08:14
【问题描述】:
问题:如果我在爱尔兰部署 lambda,则 lambda 无法使用托管在伦敦的 s3 触发器。理想情况下,我会在伦敦启动一个 cloud9 实例,但该服务在伦敦尚不可用。
Cloud9 非常适合测试和开发需要与其他 aws 服务交互的 lambda,需要更改在本地系统上开发的其他 aws 服务的代码以进行部署,这显然不理想。因此,我宁愿使用 cloud9 IDE 进行开发。
作为一种解决方法,我一直在开发基于爱尔兰的 EC2 实例,然后我有一个脚本,其中复制了 lambda 的基本文件并将其压缩并将其发送到 s3 存储桶。然后我可以在任何地方生成 lambda 并从 s3 存储桶中导入 zip。
不过,这看起来很麻烦,一定有更好的办法吗?
这里是代码示例(一)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脚本压缩)并发送到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
可能是社区认为这是解决此问题的完美方法?但这感觉有点麻烦,我还没有看到来自亚马逊或其他地方的任何文件表明“更好”的方法?任何反馈都会很棒?
【问题讨论】:
-
不确定这是否有帮助,但是一旦您在一个区域部署该函数,您就无需重新打包它以将其部署到其他地方...... Lambda API 中的
GetFunction操作及其CLI 等效aws lambda get-function为您提供了一个预签名 URL,用于下载部署包以及其余的功能配置。 -
这听起来可能像我正在寻找的东西,但通过快速阅读这里实现它非常复杂:docs.aws.amazon.com/cli/latest/reference/lambda/… 如果你有时间,你可以展示一个逐步的例子吗?不用担心,谢谢指点
标签: python bash amazon-ec2 aws-lambda aws-cloud9