AWS Lambda Update
2015.04.22
Amazon  Data  Service  Japan,
Solutions  Architect
Keisuke  Nishitani(@Keisuke69)
⾃自⼰己紹介
•  名前
–  ⻄西⾕谷圭介
–  @Keisuke69
•  ロール
–  ソリューションアーキテ
クト
–  WebサービスやEC、ス
タートアップを担当
–  モバイルなどアプリ寄り
なプロダクトを担当
AWS  Lambdaとは
•  クラウド上で、イベントをトリガーに独⾃自のコード
を稼働させるComputeサービス
–  EC2インスタンスやOS等インフラの管理理作業が不不要
–  毎⽇日数件から毎秒数千件のリクエストまで⾃自動的にスケール
–  従量量課⾦金金、実際にコードが稼働した時間に対してのお⽀支払
–  新たに追加された情報(イベント)に対して即座に応答するアプリ
ケーションを、特別な仕組みなく簡単に実装できる
特徴
インフラの管理理が不不要
•  ビジネスロジックにフォーカスで
きる
•  コードをアップロードするだけで、
あとはAWS  Lambdaが以下をハ
ンドリング
–  キャパシティ
–  スケール
–  デプロイ
–  耐障害性
–  モニタリング
–  ロギング
–  セキュリティパッチの適⽤用
オートスケール
•  イベントのレートに合うように
Lambdaが⾃自動でスケール
•  プロビジョニング中や完了了を気に
する必要なし
•  コードが稼働した分だけのお⽀支払
い
Bring  your  own  code
•  Node.jsで書かれたコードを実⾏行行
•  コード内では以下も可能
–  スレッド/プロセスの⽣生成
–  バッチスクリプトや何らかの実⾏行行
ファイルの実⾏行行
–  /tmpのread/write
•  各種ライブラリも利利⽤用可能
–  ネイティブライブラリも可能
–  利利⽤用するライブラリを⼀一緒にアップ
ロード
細やかな料料⾦金金体系
•  100ミリ秒単位でのコンピュート
時間に対する価格設定
•  リクエストに対する低額の課⾦金金
•  ⼗十分な無料料枠
•  アイドル状態では⼀一切切課⾦金金されな
い
発表された内容
•  ついにGAに
•  AWS  Mobile  SDKのサポート
•  Synchronous  Invoke
•  イベントソースの追加
•  アクセスモデルの簡潔化
•  リソースへのクロスアカウントアクセス
•  複数のメトリクスとAPIのエンハンス
•  コンソールの改良良
AWS  Lambda  now  Generally  Available  
•  デフォルトの制限がより⼤大きくなりました
–  同時リクエスト数が100リクエストに(*)
–  アカウントにおける1秒あたりのリクエスト数が1000に(*)
–  Invoke時のリクエストボディのサイズが6MBに
*制限緩和可能
•  プレビュー表記が外れました
–  プレビュー期間中のフィードバックを元にしたアップデート
–  ストリームとファンクションが1:1からn:nに
–  プログラミングモデルの改善
–  利利⽤用できるリージョンは変更更なし
モバイルバックエンドとしてのAWS  Lambda
•  AWS  Mobile  SDKのサポート
–  AWS  Mobile  SDK  for  iOS
–  AWS  Mobile  SDK  for  Android
•  新しいInvokeモデルのサポート
–  RequestResponse
–  簡単・即座にスケーラブルなバックエンドとして利利⽤用可能
Lambdaファンクションの呼び出し
•  モバイルもしくはWebアプリからの呼び出しが可能
–  AWS  SDKもしくはAWS  Mobile  SDKを利利⽤用
•  Invoke時にInvocation  Typeを指定
–  Event
•  ⾮非同期実⾏行行
•  レスポンス内容はリクエストが正常に受け付けられたかどうかのみ
–  RequestResponse
•  同期実⾏行行
•  実⾏行行完了了時にレスポンスが返ってくる。レスポンス内容はLambda
ファンクション内でセット可能
同期呼び出しコード例例(JavaScript)
var params = {
IdentityPoolId: "Cognito Identity Pool ID”,
};
AWS.config.region = 'us-east-1’;
AWS.config.credentials = new AWS.CognitoIdentityCredentials(params);
AWS.config.credentials.get(function(err) {
if (!err) {
var event = {
'key': 'value’
};
var params = {
FunctionName: 'Sample’,
InvocationType: 'RequestResponse’,
LogType: 'Tail’,
Payload: JSON.stringify(event)
};
var lambda = new AWS.Lambda();
lambda.invoke(params, function(err, data) {
if (err){
console.log(err, err.stack);
}else{
console.log(data.Payload);
}
});
} else {
console.log("Error:" + err);
}
});
APIサーバの代わりとして
•  例例えば、ユーザによってコンテンツの出し分けをしたい場合
•  新たにサポートされた同期呼び出しで実現
DynamoDB
S3
1.  HTML/JS
4.  URLを元にコンテンツ取得
JavaScript
SDK
4.  ユーザに基づくコンテンツ
(URL)取得
Lambda
3.  コンテンツ要求
APIサーバの代わりとして(モバイルの場合)
•  前述と同様のことをモバイルアプリからも可能
DynamoDB
S3
3.  URLを元にコンテンツ取得
2.  ユーザに基づくコンテンツ
(URL)取得
Lambda
1.  コンテンツ要求
App  with  
AWS  Mobile  
SDK
新しいイベントソース
•  Amazon  SNS
–  ⾮非常にご要望の多かった機能
–  イベントソースとしてSNSのトピックを指定可能に
–  通知先としてSNSをサポートしているAWSの他サービスとのイ
ンテグレーションが可能に
例例:CloudWatchのalarmをトリガーに
Amazon SNS Lambda function
新しいイベントソース
•  Amazon  Cognito
–  Cognito  Syncにおけるデータセットの同期のタイミングで
Lambdaファンクションをトリガーできるように
–  ゲームのステータスアップデート時に検証してレスポンスする
ようなことが可能に
Amazon Cognito Lambda function
contextパラメータの変更更
•  context.succeed(Object  result)
–  ファンクションとコールバックの正常終了了とする場合
–  ファンクションの実⾏行行結果をJSON.stringifyコンパチの形式でresultとして渡す(オプショ
ン)
–  InvocationタイプがEventの場合、CloudWatch  LogsのLogストリームにresultをメッセー
ジ出⼒力力
–  InvocaktionタイプがRequestResponseの場合、resultがレスポンスボディとしてセットさ
れる。同時にLogストリームにも出⼒力力
•  context.fail  (Object  error)
–  ファンクションとコールバックの実⾏行行結果としてエラーとする場合
–  実⾏行行結果をerrorとして渡すことができる(オプション)
–  Errorがnull以外の場合、レスポンスヘッダ(X-‐‑‒Amz-‐‑‒Function-‐‑‒Error-‐‑‒Message)およびレ
スポンスボディ(errorMessage)としてセットされ、Logストリームにも出⼒力力される
contextパラメータの変更更
•  context.done  (String  message,  Object  result)
–  ファンクションを終了了させる場合
–  エラーのサマリをmessageとして渡す(オプション)
–  実⾏行行結果をresultとしてJSON.stringifyコンパチ形式で渡す(オプション)
–  messageに値が⼊入っている場合、Lambdaはエラーとみなす
–  InvocationタイプがEventの場合、⾃自動的にmessageとresultをCloudWatch  
LogsのLogストリームに出⼒力力する
–  InvocaktionタイプがRequestResponseの場合、以下の挙動となる
•  Messageがnullの場合、resultの⽂文字列列表現がレスポンスボディとしてセットされる
•  Messageがnullでない場合、resultの⽂文字列列表現をX-‐‑‒Amz-‐‑‒Function-‐‑‒Error-‐‑‒Message
というレスポンスヘッダとしてセットし、レスポンスボディとしてerrorがセットされ
る
•  引数としてmessage飲みであった場合、その値がレスポンスヘッダ(X-‐‑‒Amz-‐‑‒
Function-‐‑‒Error-‐‑‒Message)およびレスポンスボディとしてセットされる
contextのプロパティ
•  awsRequestId
–  Lambdaファンクション呼び出しリクエストのID
•  logStreamName  
–  CloudWatch  LogsのLogストリーム名
•  clientContext
–  モバイルSDK経由で呼び出された場合、クライアントアプリおよびデバイスに関する情報
–  Nullになる場合もあり
•  Identity
–  MobileSDK経由で呼び出された場合、Amazon  CognitoのIdentity  providorに関する情報
–  Nullになる場合もあり
コード例例
console.log('Loading function');
var aws = require('aws-sdk');
var s3 = new aws.S3({apiVersion: '2006-03-01'});
exports.handler = function(event, context) {
console.log('Received event:', JSON.stringify(event, null, 2));
//渡されたイベントの情報からオブジェクトを取得しContentTypeを出力
var bucket = event.Records[0].s3.bucket.name;
var key = event.Records[0].s3.object.key;
s3.getObject({Bucket: bucket, Key: key}, function(err, data) {
if (err) {
console.log("Error getting object " + key + " from bucket " + bucket +
". Make sure they exist and your bucket is in the same region as this
function.");
context.fail('Error', "Error getting file: " + err);
} else {
console.log('CONTENT TYPE:', data.ContentType);
context.succeed();
}
});
};
新しいパーミッションモデル
•  従来のInvocation  Roleの指定は不不要に
•  ExecutionパーミッションとInvocationパーミッション
の2種類に
–  Invocationパーミッション
•  イベントソースがLambdaとやり取りするのに必要
•  Invocationモデルによる、Pull型の場合のみ
•  Execution  Role(後述)もしくはリソースポリシーとして指定
–  Executionパーミッション
•  ファンクションがどのAWSのリソースにどういったアクションを⾏行行えるか
•  実際の細かい権限はIAMロールとして⽤用意し、Execution  Roleとして設定する
Execution  Role例例(イベントソースがKinesisの場
合)
•  Kinesisの場合、Pullモデ
ルとなるため、Lambda
がKinesisにポーリングで
きるよう権限を与える
•  Lambdaの
InvokeFunctionというア
クションの許可も必要
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": [
"*"
]
},
{
"Effect": "Allow",
"Action": [
"kinesis:GetRecords",
"kinesis:GetShardIterator",
"kinesis:DescribeStream",
"kinesis:ListStreams",
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
}
]
}
クロスアカウントアクセス
•  異異なるAWSアカウントのアプリケーションからのアクセスが可能
•  LambdaファンクションのオーナーがAccess  Policyでクロスアカウ
ントアクセスを許可する設定を追加する
–  Principalとして許可するAWSアカウントのidを指定する
コンソールの改良良
•  コンソールからS3以外のイベントソースも設定
可能に
–  ただし、DynamoDBは依然として未サポート
•  ダッシュボード上で設定したいLambdaファン
クションを指定し、”Add  event  source”
イベントソースの設定
イベントソースの設定
①イベントソースを選択
②選択したイベントソースに応じ
て項⽬目の選択
※項⽬目は選択したイベントソース
により変動する
メトリクスの追加と変更更
•  CloudWatchを⽤用いたMetricsの監視
–  Invocations
•  以前のRequestCount
•  ファンクションが呼び出された回数
–  Failures
•  以前のErrorCount
•  ファンクションの実⾏行行がエラーになった回数
–  Duration
•  以前のLatency
•  コードの実⾏行行開始からの経過時間
–  Throttle
•  同時実⾏行行数の制限を越えて呼び出されたため失敗した回数
"   Web・モバイルのアプリ開発者向けイベント(AWS  Summitと併催)
"   みんな⼤大好きGithubの共同創業者によるKeynoteあります
" GithubとAmazonのサービス開発の裏裏側とかも聞けちゃいます
"   伊藤直也さん、⼤大場光⼀一郎郎さん、増井雄⼀一郎郎さん等著名登壇者も多数
"   Developers  Nightという交流流パーティもあります
http://www.awssummit.tokyo/devcon.html
6⽉月2⽇日、3⽇日はデブコンへ!
Run  Code  in  the  cloud!

AWS Lambda Update