如何在AWS Lambda Python 3.6环境中运行aws-cli?
问题描述:
我想在AWS Lambda函数中使用运行时版本的Python 3.6调用aws s3 sync
命令。我怎样才能做到这一点?如何在AWS Lambda Python 3.6环境中运行aws-cli?
你为什么不只是使用包括boto3 SDK?
- boto3 does not have an equivalent to the
sync
command - boto3 does not automatically find MIME types( “如果你不提供的ContentType到ExtraArgs什么,到底内容类型将永远是二进制/八位字节流”。)
- aws cli does automatically find MIME types(“默认情况下,当它被上载“)
的文件的mime类型推测
对于我的使用情况下,我觉得很有道理建筑和财政,但我接受的替代品。 My Lambda function:
- 下载Git和雨果
- 下载my repository
- 运行雨果产生我的小(< 100页)网站
- 上传生成的文件到S3
眼下,我可以在大约1-2秒内在1536 MB(最强大的)Lambda函数上完成上述所有操作。这个功能只有在我改变我的网站时才会触发,所以运行起来很便宜。
也许它已经被安装在lambda环境?
在编写这本书的时候,其实不然。
答
从Running aws-cli Commands Inside An AWS Lambda Function:
import subprocess
command = ["./aws", "s3", "sync", "--acl", "public-read", "--delete",
source_dir + "/", "s3://" + to_bucket + "/"]
print(subprocess.check_output(command, stderr=subprocess.STDOUT))
的AWS CLI没有安装在默认情况下LAMBDA,所以你必须把它列入您的部署。尽管运行在Python 3.6 Lambda环境中,但Python 2.7仍然可用于该环境中,因此the article中概述的方法将继续有效。
要试验Lambda系统,请看lambdash。
不幸的是,这个帖子中的方法在这种情况下不起作用。我会在我的问题上详细阐述我已经尝试了什么。 AWS CLI仍未安装在Python Lambda实例上,尽管我还没有尝试其他环境。 – pjgranahan
引用的文章显示了如何使用Lambda函数打包AWS CLI。 –
谢谢你的帮助约翰。你的评论促使我重新审视这篇文章,并利用博客的方法开展工作。我做了两件关键的事情,其他人应该注意: 1)我试图在亚马逊Linux上构建aws-cli以努力匹配Lambda环境。这失败了奇怪的PyYaml错误,但在Ubuntu上构建完美无缺。 2)我没有意识到Python 2.7在Python 3.6 Lambda环境中仍然可用,并且我试图将博客中给出的脚本改编为Python 3.6。我认为这种方法最终可能奏效,但我现在已经放弃了。 – pjgranahan