【问题标题】:convert a function to Lambda将函数转换为 Lambda
【发布时间】:2016-03-02 07:19:42
【问题描述】:

我有这个函数在 python 中按预期工作。 如何将其转换为 AWS Lambda 函数?

def mymailgun(url):    
    import urllib2
    myfile=urllib2.urlopen(url)

    import requests
    print requests.post("https://api.mailgun.net/v3/XXX.mailgun.org/messages",
                        auth=("api", "key-XXX"),
                        files=[("attachment", myfile)
                               #("attachment", open("files/test.txt"))
                               ],
                        data={"from": "Excited User <excited-user@example.com>",
                              "to": "XXX@gmail.com",
                              "cc": "YYY@yahoo.com",
                              "bcc": "ZZZ@hotmail.com",
                              "subject": "Hello",
                              "text": "Testing some awesomness with attachments!",
                              "html": myfile})

【问题讨论】:

    标签: python aws-lambda


    【解决方案1】:

    您的代码必须遵循 Lambda 函数编程模型,并且您似乎需要稍微修改您的代码以适应。您的 Python 代码必须将其中一个函数标识为处理程序。这样做如下:

    def handler_name(event, context): 
        ...
        return some_value
    

    来自官方手册:

    event — AWS Lambda 使用此参数将事件数据传递到 处理程序。该参数通常是 Python dict 类型。它可以 也可以是 list、str、int、float 或 NoneType 类型。

    context—AWS Lambda 使用此参数提供运行时信息 给你的处理程序。该参数属于 LambdaContext 类型。 可选地,处理程序可以返回一个值。被退回的会发生什么 值取决于您在调用 Lambda 时使用的调用类型 功能:

    如果您使用 RequestResponse 调用类型(同步 执行),AWS Lambda 返回 Python 函数调用的结果 到调用 Lambda 函数的客户端(在对 调用请求,序列化为 JSON)。例如,AWS Lambda 控制台使用 RequestResponse 调用类型,所以当你测试 使用控制台调用函数,控制台将显示 返回值。

    • 如果处理程序没有返回任何内容,AWS Lambda 将返回 null。

    • 如果使用Event调用类型(异步执行),则丢弃该值。

    进行这些更改后,第一步是将代码连同任何依赖项一起打包到部署包中。为此,您必须创建一个

    .zip 以下列方式归档。

    首先,为您的包创建一个目录。在这种情况下,您可以将其称为 MailgunScript 或类似名称。将所有 Python 源文件保存在此目录的根目录中。

    您可以使用 pip 命令将任何所需的库(例如 requests 和 urllib2 库)安装到您选择的目录中:

    pip install requests -t /absolutePathTo/MailgunScript
    pip install urllib2 -t /absolutePathTo/MailgunScript
    

    最后,您必须从该目录的内容而非目录本身创建一个.zip存档。

    您现在已准备好将您的部署包转换为 Lambda 函数。登录您的 AWS 管理控制台并选择 Create a Lambda Function。如果提示选择蓝图,您可以选择默认的hello-world 蓝图,然后继续上传您的部署包并根据需要填写其余字段。

    然后,您只需返回主 AWS 管理控制台,选择函数并单击 test 即可测试该函数。或者,您可以使用如下命令从命令行界面手动调用新的 Lambda 函数:

    aws lambda invoke \
    --region yourRegion \
    --function-name yourFunctionName \
    --payload '{"url"}'  \
    --invocation-type RequestResponse \
    /tmp/response
    

    这将执行您的函数并将响应输出到/tmp/response 以供检查。

    【讨论】:

    • 我的 mailgun 函数有 url 作为输入。如何将其传递给事件?
    • 关于 zip,我遇到了 Linux zip fie 的问题,必须将代码复制到 windows 并使用 winzip。否则,您将不断收到“找不到模块”的错误
    【解决方案2】:

    您需要以 lambda 函数的方式设置函数。正如文献上所说:

    def handler_name(event, context): 
         return some_value
    

    event — AWS Lambda 使用此参数将事件数据传递给处理程序。该参数通常是 Python dict 类型。也可以是list、str、int、float或NoneType类型。

    context — AWS Lambda 使用此参数向您的处理程序提供运行时信息。该参数为 LambdaContext 类型。

    将代码作为 lambda 函数进行测试:

    1. 保存文件
    2. 将文件和任何依赖项打包成一个 .zip 文件More info
    3. 使用控制台或 AWS CLI 上传 .zip 文件以创建 Lambda 函数。 More info

    创建 lambda 函数的 CLI 命令:

    aws lambda create-function \
     --region us-west-2 \
     --function-name HelloPython \
     --zip-file fileb://deployment-package.zip \
     --role arn:aws:iam::account-id:role/lambda_basic_execution  \
     --handler hello_python.my_handler \
     --runtime python2.7 \
     --timeout 15 \
     --memory-size 512
    

    有关 lambda 函数的更多信息: 单击herehere。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      • 2018-06-15
      • 2019-10-20
      相关资源
      最近更新 更多