Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
AWS Lambda
AWS  Black  Belt  Tech  Webinar  2015  (旧マイスターシリーズ)
アマゾンデータサービスジャパン株式会社
ソリューションアーキテクト  ⻄西⾕谷圭介
2015.01.21
課題はシンプル
•  例例えば、
–  S3のバケットに画像が保存されたらサムネイルイメージを⽤用意
したい
–  DynamoDBに保存されるアドレスが全て正しい形式かチェック
したい
解決⽅方法は複雑
•  前述のサムネイルイメージの場合、
–  アップロードを検知するためのサーバと仕組みを⽤用意
–  イベントに応じて処理理を実⾏行行するサーバ群を⽤用意
–  OSの設定や⾔言語環境の構築
•  パッチ適⽤用や更更新をし続...
AWS  Lambdaとは
•  クラウド上で、イベントをトリガーに独⾃自のコードを稼働さ
せるComputeサービス
–  EC2インスタンスやOS等インフラの管理理作業が不不要
–  毎⽇日数件から毎秒数千件のリクエストまで⾃自動的にスケー...
特徴
インフラの管理理が不不要
•  ビジネスロジックにフォーカスで
きる
•  コードをアップロードするだけで、
あとはAWS  Lambdaが以下をハ
ンドリング
–  キャパシティ
–  スケール
–  デプロイ
–  耐障害性
–  モニタリ...
オートスケール
•  イベントの発⽣生レートに合わせて
⾃自動でスケール
•  プロビジョニング中や完了了を気に
する必要なし
•  コードが稼働した分だけのお⽀支払
い
Bring  your  own  code
•  Node.jsで書かれたコードを実⾏行行
•  コード内では以下も可能
–  スレッド/プロセスの⽣生成
–  バッチスクリプトや何らかの実⾏行行
ファイルの実⾏行行
–  /tmpのread...
細やかな料料⾦金金体系
•  100ミリ秒単位でのコンピュート
時間に対する価格設定
•  リクエストに対する低額の課⾦金金
•  ⼗十分な無料料枠
ユースケース
イメージリサイズ、サムネイル⽣生成  
•  S3に画像がアップロードされたときにサムネイ
ルの⽣生成やリサイズを実⾏行行
AWS LambdaAmazon S3 Bucket イベント
元画像 サムネイル画像
1
2
3
値チェックや別テーブルへのコピー
•  DynamoDBへの書き込みに応じて値チェックを
しつつ別テーブルの更更新やプッシュ通知を実⾏行行
AWS Lambda
Amazon DynamoDB
Table and Stream
プッシュ通知
別...
監査と通知
•  S3に保管されるCloudTrailのログを分析し、怪
しい⾏行行動や異異常を検知したら通知する
AWS APIコール
AWS CloudTrail Logs
AWS Lambda
Bucketイベント プッシュ通知
⼝口コミアプリ
•  投稿の書き込み/表⽰示はDynamoDBと直接
•  レートの計算はモバイルアプリから直接Lambdaを実⾏行行し⾮非
同期で実⾏行行
1.  認証・認可
・  FBアプリと連携
Cognito
DynamoDBApp  ...
Followers
写真共有モバイルアプリ
4.  メタデータをDynamoDBに登録
-‐‑‒  タイトル、コメント等
1.  認証・認可
・  FBアプリと連携
6.  Push通知
-‐‑‒  フレンドやフォロワーに通知
Cognito
...
Lambdaファンクション
Lambdaファンクション
•  JavaScript(Node.js)で記述
•  コードはZip形式にしてアップロードもしくはコンソール上で直接記述
–  各種ライブラリはZipファイルに含めることで利利⽤用可能
•  メモリ容量量はデフォ...
ネイティブライブラリ
•  ファンクション内で利利⽤用するネイティブライブラリを独
⾃自にビルドして、パッケージすることも可能
–  Node.jsがインストールされたAmazon  Linuxと同等のマシンが必要
–  Amazon  Lin...
(例例)OpenCVを導⼊入する場合
1.  LambdaがサポートするAMIを利利⽤用してEC2イ
ンスタンスを起動(⼿手順は割愛)
2.  OSアップデートと必要なライブラリ、ツール
とNode.jsをインストール
$ sudo yum u...
(例例)OpenCVを導⼊入する場合
3.  ネイティブライブラリのダウンロード
$ wget http://downloads.sourceforge.net/project/
opencvlibrary/opencv-unix/2.4.9/...
(例例)OpenCVを導⼊入する場合
5.  モジュールのビルドとインストール
6.  npmを⽤用いてパッケージのインストール
npm  install実⾏行行前にPKG_̲CONFIG_̲PATHの指定を⾏行行い、静的にコン
パイルされたバ...
コンテナのライフサイクル(開始)
•  ファンクション作成後、もしくはコードや設定
更更新後の初回実⾏行行時は新たにコンテナが作成さ
れ、ファンクション⽤用のコードがコンテナ内に
ロードされる
•  Node.js側では、ハンドラが最初に呼び出...
コンテナのライフサイクル(終了了)
•  Timeout
–  ユーザが指定した実⾏行行時間を超えた場合。その時どういう処理理が⾏行行われているかは関係なく、即時
停⽌止される
•  Controlled  termination
–  コール...
コンテナのライフサイクル(再利利⽤用)
•  実⾏行行からある程度度時間が経過した後に再度度実⾏行行され
る場合は新たにコンテナが作成される
–  初回実⾏行行時と同様
•  コードの変更更がなく前回の実⾏行行から時間が⽴立立ってい
ない場合は...
プロセスの凍結と再開
•  ファンクションの終了了時に実⾏行行中のバックグラウン
ドプロセスがある場合、Lambdaはプロセスを
freezeさせ、次回ファンクションを呼び出した際に
再開する
–  ただし、コンテナが再利利⽤用される場合だけで...
AWS  Lambdaの使い⽅方
コード
•  基本
–  ローンチ時点ではNode.jsで記述
–  AWS  SDKは組み込み済みで使えるようになっている
–  ImageMagickグラフィックライブラリを標準で利利⽤用可能
•  ステートレス
–  データを永続化するた...
プログラミングモデル
•  handler_̲nameがLambdaが呼び出す関数名となる
–  ファンクション作成時ならびにコードのアップロード時に指定する
•  イベントのデータをeventパラメータとして渡す
–  JSON形式
–  サ...
context.done()
•  context.done()を呼び出すとファンクションが終了了したものと⾒見見な
される
–  処理理終了了を明⽰示するために必ず呼び出す
–  呼び出さないと必要以上に⻑⾧長く実⾏行行されてしまう可能性があ...
コード例例
console.log('Loading event');	
var aws = require('aws-sdk');	
var s3 = new aws.S3({apiVersion: '2006-03-01'});	
	
ex...
Lambdaファンクションの作成
•  コンソールに組み込まれたコードエディタ
–  サンプルテンプレートを⽤用いて簡単に始めることが可能
–  名前とIAM  roleを設定するだけという簡単な設定
•  Zipファイルによるコードのアップロ...
イベントソース
•  イベントの発⽣生元となるAWSリソース
•  現時点では3種類に対応
–  Amazon  S3
–  Amazon  Kinesis
–  Amazon  DynamoDB  Stream(Preview)
•  イベン...
Pushモデル
•  Amazon  S3とカスタムイベント
•  順不不同
•  サービスもしくはアプリがInvokeAsyncを呼んで直接実⾏行行
•  3回までリトライ
Pullモデル
•  Amazon  DynamoDB  と  Amazon  Kinesis
•  順序性あり。ストリームに⼊入ってきた順に処理理される
•  イベントソースとして登録したストリームに対してLambdaが⾃自動的に取得しにいく...
イベントソースの設定
•  S3
–  AWS  Lambdaのコンソール上でS3
のバケットを選択
–  S3のコンソール上でバケットイベン
トに対応するLambdaファンクショ
ンを選択する
•  DynamoDB
–  DynamoDBの...
Amazon DynamoDB Console
(Preview)
Amazon S3 Console
イベントソースの設定
イベントソースの設定(CLI)
$ aws lambda add-event-source 
--region us-east-1
--function-name ProcessKinesisRecords 
--role invocation...
イベント例例(S3)
{
"Records": [
   -- 省略 –
   "s3": {
"s3SchemaVersion": "1.0",
"configurationId": "testConfigRule",
"bucket": {...
イベント例例(Kinesis)
{
"Records": [
{
"awsRegion": "us-east-1",
"sequenceNumber": "196800000000000000000374",
"partitionKey": "...
IAMロール
•  Invocation  RoleとExecution  Roleの2種類
–  Invocation  Role
•  誰がファンクションを実⾏行行できるかを決定
–  Execution  Role
•  ファンクションが...
Invocation  Role
•  イベントソースのタイプによって必要な権限が異異な
る
–  Access  PolicyとTrust  Policyが必要
•  Pushモデルの場合
–  イベントソースがLambdaファンクションを起...
Invocation  Role例例(Pushモデル、Access  Policy)
•  Amazon  S3に対してlambda:InvokeAsyncを許可
{
"Version": "2012-10-17",
"Statement": ...
Invocation  Role例例(Pushモデル、Trust  Policy)
•  Amazon  S3にsts:AssumeRoleを許可
•  条件として特定のバケットから発信される場合のみAmazon  S3がイ
ベント発⾏行行する...
Invocation  Role例例(Pullモデル、Access  Policy)
•  Amazon  Kinesisのストリームに対する読み取りを許可
{
"Version": "2012-10-17",
"Statement": [
{...
Invocation  Role例例(Pullモデル、Trust  Policy)
•  AWS  Lambdaに対してsts:AssumeRoleを許可
{
"Version": "2012-10-17",
"Statement": [
{
...
ExecutionRole
•  必要なAWSリソースへのアクセスを許可するIAMロール
–  Access  PolicyとTrust  Policyの2種類をアタッチする
•  Lambdaファンクション実⾏行行の際、指定されたIAMロー
...
Execution  Role例例(Access  Policy)
•  Amazon  CloudWatch  Logsの全てのログアクション
(logs:*)を許可
•  必要に応じてその他リソースへのアクセスも許可する
{
"Statem...
Execution  Role例例(Trust  Policy)
•  AWS  Lambdaが引き受けられるように許可
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effec...
モニタリング
•  ダッシュボード
–  全てのLambdaファンク
ションのリスト
–  可視化されたメトリクス
•  CloudWatchを⽤用いた
Metricsの監視
–  リクエスト数
–  エラー数
–  レイテンシ
デバッグ
exports.handler  =
    function(event,  context)    {
        console.log('Received  event:');
        var  bucket  =...
Lambdaファンクション作成時の注意事項
•  ロールを正しくセットアップする
–  Execution  rolesはLambdaファンクションができることを決定
する
–  Invocation  rolesは誰がファンクションを実⾏行行...
制限事項
•  Lambdaファンクションのリソース
リソース 制限
/tmpスペース 512MB
ファイルディスクリプタ数 1024
プロセス数およびスレッド数(合計) 1024
同時リクエスト数(プレビュー期間中) 25リクエスト/秒
1リ...
料料⾦金金体系
•  リクエスト  (全リージョン)
–  ⽉月間100万リクエストまでは無料料
–  超過分は$0.20/100万リクエスト
(1リクエストあたり$0.0000002)
•  実⾏行行時間  (全リージョン)
–  100ms...
参考資料料
•  ブログ
–  https://aws.amazon.com/blogs/compute/
•  ドキュメント
–  http://docs.aws.amazon.com/lambda/latest/dg/
Run  Code  in  the  cloud!
ご参加ありがとうございました。
Upcoming SlideShare
Loading in …5
×

AWS Black Belt Techシリーズ AWS Lambda

14,729 views

Published on

AWS Black Belt Tech Webinar 2014
(旧マイスターシリーズ)

AWS Lambda

Published in: Technology
  • Be the first to comment

AWS Black Belt Techシリーズ AWS Lambda

  1. 1. AWS Lambda AWS  Black  Belt  Tech  Webinar  2015  (旧マイスターシリーズ) アマゾンデータサービスジャパン株式会社 ソリューションアーキテクト  ⻄西⾕谷圭介 2015.01.21
  2. 2. 課題はシンプル •  例例えば、 –  S3のバケットに画像が保存されたらサムネイルイメージを⽤用意 したい –  DynamoDBに保存されるアドレスが全て正しい形式かチェック したい
  3. 3. 解決⽅方法は複雑 •  前述のサムネイルイメージの場合、 –  アップロードを検知するためのサーバと仕組みを⽤用意 –  イベントに応じて処理理を実⾏行行するサーバ群を⽤用意 –  OSの設定や⾔言語環境の構築 •  パッチ適⽤用や更更新をし続ける必要もある –  予測困難なリクエスト数に対し、スケールや耐障害性を⾼高める 仕組みを⾃自⾝身で構成 –  キャパシティや状態、セキュリティなどを24時間365⽇日モニタ リング
  4. 4. AWS  Lambdaとは •  クラウド上で、イベントをトリガーに独⾃自のコードを稼働さ せるComputeサービス –  EC2インスタンスやOS等インフラの管理理作業が不不要 –  毎⽇日数件から毎秒数千件のリクエストまで⾃自動的にスケール –  従量量課⾦金金、実際にコードが稼働した時間に対してのお⽀支払 –  新たに追加された情報(イベント)に対して即座に応答するアプリケーションを、 特別な仕組みなく簡単に実装できる –  2014年年11⽉月に発表され、現在はPreviewとして提供
  5. 5. 特徴
  6. 6. インフラの管理理が不不要 •  ビジネスロジックにフォーカスで きる •  コードをアップロードするだけで、 あとはAWS  Lambdaが以下をハ ンドリング –  キャパシティ –  スケール –  デプロイ –  耐障害性 –  モニタリング –  ロギング –  セキュリティパッチの適⽤用
  7. 7. オートスケール •  イベントの発⽣生レートに合わせて ⾃自動でスケール •  プロビジョニング中や完了了を気に する必要なし •  コードが稼働した分だけのお⽀支払 い
  8. 8. Bring  your  own  code •  Node.jsで書かれたコードを実⾏行行 •  コード内では以下も可能 –  スレッド/プロセスの⽣生成 –  バッチスクリプトや何らかの実⾏行行 ファイルの実⾏行行 –  /tmpのread/write •  各種ライブラリも利利⽤用可能 –  ネイティブライブラリも可能 –  利利⽤用するライブラリを⼀一緒にアップ ロード
  9. 9. 細やかな料料⾦金金体系 •  100ミリ秒単位でのコンピュート 時間に対する価格設定 •  リクエストに対する低額の課⾦金金 •  ⼗十分な無料料枠
  10. 10. ユースケース
  11. 11. イメージリサイズ、サムネイル⽣生成   •  S3に画像がアップロードされたときにサムネイ ルの⽣生成やリサイズを実⾏行行 AWS LambdaAmazon S3 Bucket イベント 元画像 サムネイル画像 1 2 3
  12. 12. 値チェックや別テーブルへのコピー •  DynamoDBへの書き込みに応じて値チェックを しつつ別テーブルの更更新やプッシュ通知を実⾏行行 AWS Lambda Amazon DynamoDB Table and Stream プッシュ通知 別テーブルを更新
  13. 13. 監査と通知 •  S3に保管されるCloudTrailのログを分析し、怪 しい⾏行行動や異異常を検知したら通知する AWS APIコール AWS CloudTrail Logs AWS Lambda Bucketイベント プッシュ通知
  14. 14. ⼝口コミアプリ •  投稿の書き込み/表⽰示はDynamoDBと直接 •  レートの計算はモバイルアプリから直接Lambdaを実⾏行行し⾮非 同期で実⾏行行 1.  認証・認可 ・  FBアプリと連携 Cognito DynamoDBApp  with   AWS  Mobile   SDK 2.  ⼝口コミの投稿 ・  投稿内容とレーティング 4.  過去の全データを元に平均値の計算と     結果のDynamoDBへの登録等 3.  Lambda  functionの起動 Lambda
  15. 15. Followers 写真共有モバイルアプリ 4.  メタデータをDynamoDBに登録 -‐‑‒  タイトル、コメント等 1.  認証・認可 ・  FBアプリと連携 6.  Push通知 -‐‑‒  フレンドやフォロワーに通知 Cognito Mobile  Analytics DynamoDB S3 SNS7.  画像をポストしたことをAnalyticsに登録 3.  画像のリサイズ 2.  S3への画像アップロード 5.  結果をSNSへ通知 App  with   AWS  Mobile   SDK
  16. 16. Lambdaファンクション
  17. 17. Lambdaファンクション •  JavaScript(Node.js)で記述 •  コードはZip形式にしてアップロードもしくはコンソール上で直接記述 –  各種ライブラリはZipファイルに含めることで利利⽤用可能 •  メモリ容量量はデフォルトで128MB –  64MBごとに設定可能 –  容量量に応じてCPU能⼒力力なども変動 •  実⾏行行時間のタイムアウトはデフォルトで3秒、最⼤大60秒まで •  Lambdaファンクションの起動と実⾏行行でそれぞれIAM  Roleを設定 •  /tmpに対してread/write可能 •  それぞれが隔離離されたコンテナ内で実⾏行行される
  18. 18. ネイティブライブラリ •  ファンクション内で利利⽤用するネイティブライブラリを独 ⾃自にビルドして、パッケージすることも可能 –  Node.jsがインストールされたAmazon  Linuxと同等のマシンが必要 –  Amazon  Linuxに含まれるライブラリを使⽤用してビルドする必要がある –  ライブラリおよび依存関係はスタティックにコンパイルするかダイナミッ クリンクを指定してコンパイルする必要がある –  ドキュメントに記載のあるAmazon  LinuxのAMIを使って起動したEC2イン スタンスを利利⽤用するとよい http://docs.aws.amazon.com/lambda/latest/dg/lambda-‐‑‒ introduction.html
  19. 19. (例例)OpenCVを導⼊入する場合 1.  LambdaがサポートするAMIを利利⽤用してEC2イ ンスタンスを起動(⼿手順は割愛) 2.  OSアップデートと必要なライブラリ、ツール とNode.jsをインストール $ sudo yum update $ sudo yum install gcc44 gcc-c++ libgcc44 cmake python26-devel –y $ wget http://nodejs.org/dist/v0.10.33/node-v0.10.33.tar.gz $ tar -zxvf node-v0.10.33.tar.gz $ cd node-v0.10.33 && ./configure && make $ sudo make install $ sudo easy_install pip $ pip install numpy
  20. 20. (例例)OpenCVを導⼊入する場合 3.  ネイティブライブラリのダウンロード $ wget http://downloads.sourceforge.net/project/ opencvlibrary/opencv-unix/2.4.9/opencv-2.4.9.zip $ mkdir opencv_install $ mkdir opencv_example $ unzip opencv-2.4.9.zip –d ./opencv_install/ && cd opencv_install 4.  スタティックライブラリ⽤用に設定 $ cmake -D CMAKE_BUILD_TYPE=RELEASE -D BUILD_SHARED_LIBS=NO - D CMAKE_INSTALL_PREFIX=~/opencv opencv-2.4.9/
  21. 21. (例例)OpenCVを導⼊入する場合 5.  モジュールのビルドとインストール 6.  npmを⽤用いてパッケージのインストール npm  install実⾏行行前にPKG_̲CONFIG_̲PATHの指定を⾏行行い、静的にコン パイルされたバージョンのOpenCVを⽤用いてOpenCVライブラリをコ ンパイル $ export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:~/opencv/lib/ pkgconfig/ $ npm install –prefix=~/opencv_example opencv $ make && make install
  22. 22. コンテナのライフサイクル(開始) •  ファンクション作成後、もしくはコードや設定 更更新後の初回実⾏行行時は新たにコンテナが作成さ れ、ファンクション⽤用のコードがコンテナ内に ロードされる •  Node.js側では、ハンドラが最初に呼び出され る前に初期化コードがコンテナの⽣生成ごとに⼀一 度度だけ実⾏行行される
  23. 23. コンテナのライフサイクル(終了了) •  Timeout –  ユーザが指定した実⾏行行時間を超えた場合。その時どういう処理理が⾏行行われているかは関係なく、即時 停⽌止される •  Controlled  termination –  コールバックの1つがcontext.done()を呼び出して終了了した場合。この時点で他のコールバックが 実⾏行行されてるかに関わらず終了了する •  Default  termination –  全てのコールバックが終了了してファンクション⾃自体が終了了した場合。この時、context.done()を 実⾏行行していなくてもログに“Process  exited  before  completing  request”と出⼒力力される •  クラッシュもしくはprocess.exit()を呼び出すことでも終了了 –  例例えば不不具合のあるライブラリが含まれていて、セグメンテーション違反を起こした場合、そのコ ンテナは実⾏行行終了了となる –  ログには以下のようなメッセージが出⼒力力される “Process  exited  before  completing  request”
  24. 24. コンテナのライフサイクル(再利利⽤用) •  実⾏行行からある程度度時間が経過した後に再度度実⾏行行され る場合は新たにコンテナが作成される –  初回実⾏行行時と同様 •  コードの変更更がなく前回の実⾏行行から時間が⽴立立ってい ない場合は以前のコンテナを再利利⽤用することがある –  Node.jsの初期化処理理をスキップできるなどパフォーマンス上のア ドバンテージ –  再利利⽤用された場合は最後に/tmpに書き込んだ内容も残っている
  25. 25. プロセスの凍結と再開 •  ファンクションの終了了時に実⾏行行中のバックグラウン ドプロセスがある場合、Lambdaはプロセスを freezeさせ、次回ファンクションを呼び出した際に 再開する –  ただし、コンテナが再利利⽤用される場合だけであり保証はされていな い •  この場合、バックグラウンドプロセスは残っていて も処理理は⾏行行われていない –  プロセス再作成のオーバーヘッドを減らせる
  26. 26. AWS  Lambdaの使い⽅方
  27. 27. コード •  基本 –  ローンチ時点ではNode.jsで記述 –  AWS  SDKは組み込み済みで使えるようになっている –  ImageMagickグラフィックライブラリを標準で利利⽤用可能 •  ステートレス –  データを永続化するためにはS3、DynamoDBもしくはその他のインターネット経由 で利利⽤用可能なストレージを利利⽤用すること –  実際に実⾏行行されるサーバは毎回異異なり、ログインもできない •  その他 –  プロセス、スレッド、/tmp、ソケットの利利⽤用可能 –  各種ライブラリを利利⽤用可能 –  インバウンドのソケット接続は不不可能
  28. 28. プログラミングモデル •  handler_̲nameがLambdaが呼び出す関数名となる –  ファンクション作成時ならびにコードのアップロード時に指定する •  イベントのデータをeventパラメータとして渡す –  JSON形式 –  サービスごとに異異なる –  カスタムイベントの場合はInvokeAsync発⾏行行時の引数として渡した任意のJSON形式の値 •  終了了時にはcontext.done()を呼び出す(後述) exports.handler_name = function(event, context) { console.log("value1 = " + event.key1); console.log("value2 = " + event.key2); ... context.done(null, "some message"); }
  29. 29. context.done() •  context.done()を呼び出すとファンクションが終了了したものと⾒見見な される –  処理理終了了を明⽰示するために必ず呼び出す –  呼び出さないと必要以上に⻑⾧長く実⾏行行されてしまう可能性がある •  第1引数 –  成功の場合はnullにする。値が⼊入っているとエラーとして解釈される –  null以外の値は⽂文字列列化されて⾃自動的にCloudWatchのログに記録され、リトライが⾏行行われ る場合がある •  第2引数(オプション) –  メッセージ⽂文字列列 –  テスト実⾏行行の際、コンソール画⾯面下部のログ出⼒力力に表⽰示される –  成功/失敗両⽅方で使える
  30. 30. コード例例 console.log('Loading event'); var aws = require('aws-sdk'); var s3 = new aws.S3({apiVersion: '2006-03-01'}); exports.handler = function(event, context) { console.log('Received event:'); console.log(JSON.stringify(event, null, ' ')); 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.done('error','error getting file'+err); } else { console.log('CONTENT TYPE:',data.ContentType); context.done(null,''); } } ); };
  31. 31. Lambdaファンクションの作成 •  コンソールに組み込まれたコードエディタ –  サンプルテンプレートを⽤用いて簡単に始めることが可能 –  名前とIAM  roleを設定するだけという簡単な設定 •  Zipファイルによるコードのアップロード –  ZipファイルのアップロードはSDKならびにCLIもサポート –  ライブラリを含める場合 –  ディレクトリが含まれない形でZipファイルにまとめる必要あり •  コードのあるディレクトリに移動した上で以下のようなコマンドで圧縮するのがおすすめ zip  -‐‑‒r  lambda-‐‑‒sample.zip  . •  リソースサイズの設定 –  128MBから1GBの範囲で64MBごとにメモリサイズを設定 –  使ったメモリ量量はログに出⼒力力されるため後から調整が可能 –  タイムアウトは1秒から60秒の間で設定(デフォルトは3秒)
  32. 32. イベントソース •  イベントの発⽣生元となるAWSリソース •  現時点では3種類に対応 –  Amazon  S3 –  Amazon  Kinesis –  Amazon  DynamoDB  Stream(Preview) •  イベントソースによってファンクション起動の挙動に違 いあり –  Pushモデル/Pullモデルの2種類 •  イベント –  JSON形式 –  イベントごとにファンクションが起動される
  33. 33. Pushモデル •  Amazon  S3とカスタムイベント •  順不不同 •  サービスもしくはアプリがInvokeAsyncを呼んで直接実⾏行行 •  3回までリトライ
  34. 34. Pullモデル •  Amazon  DynamoDB  と  Amazon  Kinesis •  順序性あり。ストリームに⼊入ってきた順に処理理される •  イベントソースとして登録したストリームに対してLambdaが⾃自動的に取得しにいく •  イベントごとに複数のレコード •  データが期限切切れになるまでリトライ
  35. 35. イベントソースの設定 •  S3 –  AWS  Lambdaのコンソール上でS3 のバケットを選択 –  S3のコンソール上でバケットイベン トに対応するLambdaファンクショ ンを選択する •  DynamoDB –  DynamoDBのコンソール上で Streamを作成し、それに対応する Lambdaファンクションを選択する •  Kinesis –  AWS  SDKもしくはCLIを利利⽤用して Kinesis  Stream内のメッセージを処 理理するようLambdaを設定すること も可能
  36. 36. Amazon DynamoDB Console (Preview) Amazon S3 Console イベントソースの設定
  37. 37. イベントソースの設定(CLI) $ aws lambda add-event-source --region us-east-1 --function-name ProcessKinesisRecords --role invocation-role-arn --event-source kinesis-stream-arn --batch-size 100 ※実際は一行で実行
  38. 38. イベント例例(S3) { "Records": [    -- 省略 –    "s3": { "s3SchemaVersion": "1.0", "configurationId": "testConfigRule", "bucket": { "name": "sourcebucket", "ownerIdentity": { "principalId": "A3NL1KOZZKExample" }, "arn": "arn:aws:s3:::mybucket" }, "object": { "key": "sourcebucket/HappyFace.jpg", "size": 1024, "eTag": "d41d8cd98f00b204e9800998ecf8427e" } } } ] }
  39. 39. イベント例例(Kinesis) { "Records": [ { "awsRegion": "us-east-1", "sequenceNumber": "196800000000000000000374", "partitionKey": "2efdb0ea22685b46993e42a67302a001", "eventSource": "aws:kinesis", "data": "SOME CUSTOM DATA 1" }, { "awsRegion": "us-east-1", "sequenceNumber": "196800000000000000000571", "partitionKey": "2efdb0ea22685b46993e42a67302a003", "eventSource": "aws:kinesis", "data": "{ "key": "value" }" } ] }
  40. 40. IAMロール •  Invocation  RoleとExecution  Roleの2種類 –  Invocation  Role •  誰がファンクションを実⾏行行できるかを決定 –  Execution  Role •  ファンクションができること(どのAWSのリソースにどういったアクションを⾏行行えるか)を 決定 –  実際の細かい権限はそれぞれIAMロールとして⽤用意し、それぞれに対して割り当て –  それぞれ別個のIAMロールを割り当てることが可能 •  イベントソースのタイプ(PushもしくはPull)によって必要となる 権限やポリシーの設定⽅方法が異異なる •  Lambdaファンクション作成時にAWS  Lambda側で⾃自動で作成す ることも可能 –  ただし、簡単なものになってしまうため、細かく制御したい場合は⾃自⾝身で設定する必要あ り
  41. 41. Invocation  Role •  イベントソースのタイプによって必要な権限が異異な る –  Access  PolicyとTrust  Policyが必要 •  Pushモデルの場合 –  イベントソースがLambdaファンクションを起動できる権限が必要 –  Trust  Policyはイベントソースに対して許可 •  Pullモデルの場合 –  AWS  LambdaがストリームからイベントをPullできる権限が必要 –  Trust  PolicyはAWS  Lambdaに対して許可
  42. 42. Invocation  Role例例(Pushモデル、Access  Policy) •  Amazon  S3に対してlambda:InvokeAsyncを許可 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Resource": "*", "Action": [ "lambda:InvokeAsync" ] } ] }
  43. 43. Invocation  Role例例(Pushモデル、Trust  Policy) •  Amazon  S3にsts:AssumeRoleを許可 •  条件として特定のバケットから発信される場合のみAmazon  S3がイ ベント発⾏行行するよう制限 { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals":{ "sts:ExternalId": "arn:aws:s3:::bucket name" } } } ] }
  44. 44. Invocation  Role例例(Pullモデル、Access  Policy) •  Amazon  Kinesisのストリームに対する読み取りを許可 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Resource": "*", "Action": [ "kinesis:ReadStream"] } ] }
  45. 45. Invocation  Role例例(Pullモデル、Trust  Policy) •  AWS  Lambdaに対してsts:AssumeRoleを許可 { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  46. 46. ExecutionRole •  必要なAWSリソースへのアクセスを許可するIAMロール –  Access  PolicyとTrust  Policyの2種類をアタッチする •  Lambdaファンクション実⾏行行の際、指定されたIAMロー ルにそってAWSのリソースへのアクセスが許可される •  Access  Policy –  ファンクションが必要とするAWSリソースへのアクセスを許可 –  Amazon  CloudWatch  Logsにログを書き込む許可 –  その他ファンクション内でアクセスする先(Amazon  S3など) •  Trust  Policy –  AWS  Lambdaがそのロールを引き受けられるよう許可
  47. 47. Execution  Role例例(Access  Policy) •  Amazon  CloudWatch  Logsの全てのログアクション (logs:*)を許可 •  必要に応じてその他リソースへのアクセスも許可する { "Statement": [ { "Action": [ "logs:*" ], "Effect": "Allow", "Resource": "arn:aws:logs:*:*:*" } ] }
  48. 48. Execution  Role例例(Trust  Policy) •  AWS  Lambdaが引き受けられるように許可 { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  49. 49. モニタリング •  ダッシュボード –  全てのLambdaファンク ションのリスト –  可視化されたメトリクス •  CloudWatchを⽤用いた Metricsの監視 –  リクエスト数 –  エラー数 –  レイテンシ
  50. 50. デバッグ exports.handler  =    function(event,  context)    {        console.log('Received  event:');        var  bucket  =            event.Records[0].s3.bucket.name;        var  key  =            event.Records[0].s3.object.key;        console.log(ʻ‘Bucket:  ʻ‘+bucket);        console.log(ʻ‘Key:        ʻ‘+key);        … •  実⾏行行ログがAmazon  CloudWatch  Logs に出⼒力力される –  各Lambdaファンクションごとのロググ ループ •  実⾏行行開始/終了了と消費したリソースに関す るデフォルトのログエントリ –  メモリ使⽤用量量(Max  Memory  Used) –  実⾏行行時間(Duration) –  課⾦金金対象時間(Billed  Duration) •  カスタムログエントリの追加も可能 –  ファンクション内でconsole.logを⽤用いて 出⼒力力
  51. 51. Lambdaファンクション作成時の注意事項 •  ロールを正しくセットアップする –  Execution  rolesはLambdaファンクションができることを決定 する –  Invocation  rolesは誰がファンクションを実⾏行行できるかを決定 する •  再帰処理理は慎重に –  イベントハンドラ内部でS3やDynamoDBへオブジェクトの書 き込みを⾏行行うと、別のイベントがトリガーされ無限ループに陥 る可能性がある
  52. 52. 制限事項 •  Lambdaファンクションのリソース リソース 制限 /tmpスペース 512MB ファイルディスクリプタ数 1024 プロセス数およびスレッド数(合計) 1024 同時リクエスト数(プレビュー期間中) 25リクエスト/秒 1リクエストあたりの実行時間(プレビュー期間中) 60秒 •  インプット インプット 制限 zipファイル(圧縮) 30MB zipファイル(無圧縮) 250MB InvokeAsyncのリクエストボディ(JSON) 128KB
  53. 53. 料料⾦金金体系 •  リクエスト  (全リージョン) –  ⽉月間100万リクエストまでは無料料 –  超過分は$0.20/100万リクエスト (1リクエストあたり$0.0000002) •  実⾏行行時間  (全リージョン) –  100ms単位で課⾦金金 –  100ms以下は繰り上げで計算 –  メモリー容量量により単価および無 料料時間が異異なる Memory (MB) Price per 100ms ($) Free tier seconds per month 128 0.000000208" 3,200,000 192 0.000000313" 2,133,333 256 0.000000417" 1,600,000 320 0.000000521" 1,280,000 384 0.000000625" 1,066,667 448 0.000000729" 914,286 512 0.000000834" 800,000 576 0.000000938" 711,111 640 0.000001042" 640,000 704 0.000001146" 581,818 768 0.00000125" 533,333 832 0.000001354" 492,308 896 0.000001459" 457,143 960 0.000001563" 426,667 1024 0.000001667" 400,000
  54. 54. 参考資料料 •  ブログ –  https://aws.amazon.com/blogs/compute/ •  ドキュメント –  http://docs.aws.amazon.com/lambda/latest/dg/
  55. 55. Run  Code  in  the  cloud!
  56. 56. ご参加ありがとうございました。

×