十月的 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 下都安装了哪些依赖包,所以如果你看到
文件夹里的内容,也许会吓你一跳。我们只用了一个依赖,居然实际引入了这么多包。
为了运行不到十行代码,最终得上传将近 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