AWS Lambda is an event-driven service that you can upload your code to it and run those code on-demand without having your own servers.
ref:
http://aws.amazon.com/lambda/
http://docs.aws.amazon.com/lambda/latest/dg/limits.html
API Gateway 就是 URL routing
Lambda 則是那些 route (endpoint) 對應的 handler
如果你是用 event 或 schedule 的方式呼叫 Lambda function 的話
可以不用 API Gateway
AWS Lambda 有兩種 invocation type
一是 RequestResponse,同步(例如綁定 API Gateway 和你在 Lambda Management Console 操作的時候)
二是 Event,非同步
Runtimes
AWS Lambda supports the following runtime versions:
nodejs
(Node v0.10)nodejs4.3
java
python
ref:
http://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html
Node.js
const aws = require('aws-sdk');
exports.handle = (event, context, callback) => {
doYourShit();
callback(null, 'DONE');
};
每個 Lambda function 會接收三個參數 event
、context
和 callback
event
是從外部的 input
可能是來自 S3 object event、DynamoDB stream 或是由 API Gateway POST 進來的 JSON payload
context
則會包含當前這個 Lambda fuction 的一些 metadata
例如 context.getRemainingTimeInMillis()
callback
參數只有 Node.js runtime v4.3 才支援
v0.10 的話得用 context.succeed()
、context.fail()
和 context.done()
不過誰他媽還在用 Node.js v0.10
ref:
http://docs.aws.amazon.com/lambda/latest/dg/programming-model.html
http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html
http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html
http://docs.aws.amazon.com/lambda/latest/dg/best-practices.html
Calling another Lambda function in a Lambda function.
要注意的是
你的 Lambda function 的 role 得要有 invoke 其他 Lambda function 的權限才行
const util = require('util');
const aws = require('aws-sdk');
const params = {
FunctionName: 'LambdaBaku_syncIssue',
InvocationType: 'Event', // means asynchronous execution
Payload: JSON.stringify({ issue_number: curatedIssue.number }),
};
lambda.invoke(params, (err, data) => {
if (err) {
console.log('FAIL', params);
console.log(util.inspect(err));
} else {
console.log(data);
}
});
ref:
http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html
http://stackoverflow.com/questions/31714788/can-an-aws-lambda-function-call-another
完整的程式碼放在 GitHub 上
https://github.com/CodeTengu/lambdabaku
Users and Roles
如果你是用 apex 來管理 Lambda functions 的話
確保你用的 AWS credential (User) 擁有 AWSLambdaFullAccess
和 AWSLambdaRole
這兩個 permissions
以 project 為單位建立 Role 即可
例如 lambdabaku_role
你可以在 IAM Management Console 找到那些你建立的 roles
基本上用 Basic execution role 就夠了
反正之後可以隨時修改 Role 的 permission / policy
Lambda function 屬於哪個 VPC 是額外指定的
跟 Role 沒有關係
也就是說你用 Basic execution role 還是可以支援 VPC
如果想在 Lambda function 裡存取 DynamoDB
要記得在 Role 裡新增對應的設定
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
},
{
"Sid": "Stmt1428341300017",
"Effect": "Allow",
"Action": [
"dynamodb:*"
],
"Resource": [
"arn:aws:dynamodb:ap-northeast-1:004615714446:table/CodeTengu_Preference",
"arn:aws:dynamodb:ap-northeast-1:004615714446:table/CodeTengu_WeeklyIssue",
"arn:aws:dynamodb:ap-northeast-1:004615714446:table/CodeTengu_WeeklyPost"
]
}
]
}
Scheduled Events
ref:
http://docs.aws.amazon.com/lambda/latest/dg/with-scheduled-events.html
API Gateway
單純一點的話
Security 可以選 Open with access key
然後到 API Gateway 介面的 API Keys 底下新增一組 access key
然後分配一個 API stage 給它
使用的時候在 HTTP header 加上 x-api-key: YOUR_API_KEY
即可
ref:
http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-api-keys.html
Related Projects
ref:
https://github.com/serverless/serverless
https://github.com/apex/apex
https://github.com/claudiajs/claudia
https://github.com/garnaat/kappa
https://github.com/Miserlou/Zappa
https://github.com/nficano/python-lambda
淺析 serverless 架構與實作
http://abalone0204.github.io/2016/05/22/serverless-simple-crud/
Deploy Lambda Functions via apex
$ curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sh
$ apex deploy
$ apex invoke syncPublishedIssues --logs
$ echo -n '{"issue_number": 43}' | apex invoke syncIssue --logs