尝试 AWS Lambda for Python

尝试 AWS Lambda for Python_第1张图片

十月的 AWS 大会发布了 AWS Lambda 对 Python 的支持,正好手头有个小任务适合这个场景。任务的需求很简单,如果给定 receipt 和 shared password,访问 Apple In-App Purchase Validation Sandbox 来验证。

Lambda function 本身当然很简单:

# lambda_function.py
import itunesiap

def lambda_handler(event, context):
    receipt = event['receipt-data']
    password = event.get('password')
    with itunesiap.env.sandbox:
         r = itunesiap.verify(receipt, password)._
    return r

麻烦在于使用了一个 itunes-iap 模块, 需要按照 AWS 官方文档创建个部署包。
具体步骤是:

  • 实现 lambda function 的文件叫 lambda_function.py,而且此文件得存在于 文件夹的根
  • pip install itunes-iap -t
  • cd ; zip -r ../r01.zip *

然后把打包生成的 r01.zip 通过 Lambda Console 上传发布即可。

通常你不会去注意 site-packages 下都安装了哪些依赖包,所以如果你看到 文件夹里的内容,也许会吓你一跳。我们只用了一个依赖,居然实际引入了这么多包。

尝试 AWS Lambda for Python_第2张图片
r01.zip 里的内容

为了运行不到十行代码,最终得上传将近 5MB 的压缩包。如果你的网络上传到 S3 也不够快的话,建议在 EC2 instance 上用 s3 copy 等手段来快速上传。

完成效果如下:

» http POST https://u0m4f1nca2.execute-api.us-west-2.amazonaws.com/sandbox/test_iap < test.json

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 626
Content-Type: application/json
Date: Mon, 28 Dec 2015 15:02:24 GMT
Via: 1.1 b84e1462f13daaeb732c61ea2aa9b852.cloudfront.net (CloudFront)
X-Amz-Cf-Id: XWSIdlbxL6Y32aTNrkQ79AZ6VafoV5WgTDsw4oa1zAAc38Iwg6A0iQ==
X-Cache: Miss from cloudfront
x-amzn-RequestId: ff58ec27-ad73-11e5-9c46-f75ab4034ce2

{
    "receipt": {
        "bid": "com.vanillabreeze.igunbattle",
        "bvrs": "1.0",
        "item_id": "554499305",
        "original_purchase_date": "2012-09-21 01:31:38 Etc/GMT",
        "original_purchase_date_ms": "1348191098192",
        "original_purchase_date_pst": "2012-09-20 18:31:38 America/Los_Angeles",
        "original_transaction_id": "1000000056161764",
        "product_id": "BattleGold50",
        "purchase_date": "2012-09-21 01:31:38 Etc/GMT",
        "purchase_date_ms": "1348191098192",
        "purchase_date_pst": "2012-09-20 18:31:38 America/Los_Angeles",
        "quantity": "1",
        "transaction_id": "1000000056161764",
        "unique_identifier": "42c1b3d45563820dd9a59c79a75641001fc85e39"
    },
    "status": 0
}

其他:

还好这段代码的依赖树中都是纯 Python 包。如果是有 C 模块的依赖,步骤就要更为复杂些了。

原来叫 JAWS,现在改名为 serverless 的项目,也正在加入对 Python 的支持。等这个项目再完善些,开发和使用 AWS Lambda 就能有更好的工具和框架支持。

参考:

  • AWS Lambda 创建部署程序包 (Python)
  • Running Python with compiled code on AWS Lambda
  • Serverless (formerly JAWS): The serverless application framework – Use bleeding-edge AWS services to redefine how to build massively scalable (and cheap) apps!
  • serverless looking for Python rockstar

你可能感兴趣的:(尝试 AWS Lambda for Python)