十月的 AWS 大會(huì)發(fā)布了 AWS Lambda 對(duì) Python 的支持尾膊,正好手頭有個(gè)小任務(wù)適合這個(gè)場(chǎng)景。任務(wù)的需求很簡(jiǎn)單络凿,如果給定 receipt 和 shared password骡送,訪問(wèn) Apple In-App Purchase Validation Sandbox 來(lái)驗(yàn)證。
Lambda function 本身當(dāng)然很簡(jiǎn)單:
# 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
麻煩在于使用了一個(gè) itunes-iap 模塊喷众, 需要按照 AWS 官方文檔創(chuàng)建個(gè)部署包各谚。
具體步驟是:
- 實(shí)現(xiàn) lambda function 的文件叫
lambda_function.py
,而且此文件得存在于<code_dir>
文件夾的根 pip install itunes-iap -t <code_dir>
cd <code_dir>; zip -r ../r01.zip *
然后把打包生成的 r01.zip 通過(guò) Lambda Console 上傳發(fā)布即可到千。
通常你不會(huì)去注意 site-packages 下都安裝了哪些依賴包昌渤,所以如果你看到 <code_dir>
文件夾里的內(nèi)容,也許會(huì)嚇你一跳憔四。我們只用了一個(gè)依賴膀息,居然實(shí)際引入了這么多包般眉。
為了運(yùn)行不到十行代碼,最終得上傳將近 5MB 的壓縮包潜支。如果你的網(wǎng)絡(luò)上傳到 S3 也不夠快的話甸赃,建議在 EC2 instance 上用 s3 copy
等手段來(lái)快速上傳。
完成效果如下:
? 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 模塊的依賴埠对,步驟就要更為復(fù)雜些了。
原來(lái)叫 JAWS裁替,現(xiàn)在改名為 serverless 的項(xiàng)目项玛,也正在加入對(duì) Python 的支持。等這個(gè)項(xiàng)目再完善些弱判,開發(fā)和使用 AWS Lambda 就能有更好的工具和框架支持襟沮。
參考:
- AWS Lambda 創(chuàng)建部署程序包 (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