Lambda

制限 環境変数

・継続的にアクセスされず、かつCPUもあまり使わない処理であれば、Pythonが速い

・継続的にアクセスされ、かつCPUをあまり使わない処理であれば、どの言語も大差ない

・CPUを大量に使うのであれば、Javaが速い

★コールドスタートを速くするには

・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)の違い

https://qiita.com/sokutou-metsu/items/5ba7531117224ee5e8af

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