Lambda
★コールドスタートを速くするには
・Lambda関数に対してポーリング(ウォームスタートの可能性)
・コンピューティングリソースを増やす
・ランタイムを変える
・Amazon VPC内のリソースにアクセスしない
・パッケージサイズを小さくする
・POJOではなくバイトストリームを使う(Javaのみ)
・グローバル変数の遅延ロード
client = None
def lambda_handler(event, context):
global client
if not client:
client = boto3.client('s3')
...
http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/best-practices.html
★ローカルで実行
Python例
def lambda_handler(event, context):
pass
if __name__ == '__main__':
with open('event.json') as f:
event = json.load(f)
context = ''
lambda_handler(event, context)
Node.js例
exports.handler = (event, context, callback) => {...}
event = '';
context = '';
callback = (error, result) => {
if(error != null){
console.log(result);
process.exit(1);
}
console.log(result);
process.exit(0);
}
this.handler(event, context, callback);
★LambdaからLambdaの呼び方
import boto3
def lambda_handle(event, context):
client = boto3.client("lambda")
client.invoke(
FunctionName = "...",
InvocationType = "Event",
Payload = json.dumps(event)
)
※Eventは非同期、RequestResponseは同期
★boto3 低レベルなAPI(client)と高レベルなAPI(resource)の違い
Node.js例
'use strict';
var AWS = require('aws-sdk');
var dynamodb = new AWS.DynamoDB();
exports.handler = (event, context, callback) => {
var params = {
Key: {id: {"S": "test"}},
TableName: "mytest"
};
dynamodb.getItem(params, function (err, data) {
if (err) {
console.log(err);
context.fail('Failed');
} else {
console.log(data);
// callback(null, data);
// context.done(null, {message: "..."});
context.succeed('Succeeded');
}
});
};
Python例
import boto3
import logging
from boto3.dynamodb.conditions import Key
logger = logging.getLogger()
logger.setLevel(logging.INFO)
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('mytest')
def handle_request(event, context):
response = table.query(
KeyConditionExpression=Key('id').eq('test')
)
logger.info(response)
logger.info("Succeeded")
★Lambda Layerについて
一般的にアップロードしたものの置く場所
例:/var/task/node_modules/casperjs/bin/casperjs
Layerでアップロードしたものの置く場所
例:/opt/nodejs/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs
例:/opt/nodejs/node_modules/casperjs/bin/casperjs
フォルダ構成(*.zip)
python場合
python
- my package
- __init__.py
- other.py
- other package
nodejs場合
nodejs
- node_modules