はじめに
AWSが公式でスライド資料を提供するBlack-Belt。
ここにはAmazonが作り出した数々のクラウドサービスの使い方が書かれている。
その中でも、クラウド技術を代表するのが、2014年に公開された
AWS Lambda。サーバーなしでプログラミングコードを実行するサービスだ。
今日は、Black-Beltの資料を読みながら、
AWS Lambdaを触ったことのない人向けに解説を書く。
クラウドネイティブ
一昔前にクラウドと言えば、オンライン上の仮想サーバー、
GoogleComputeEngineやAmazonElasticComputeCloud (EC2) のことだったが、
これは、通常のサーバーで動作するアプリケーションをクラウドに配置したにすぎない。
クラウドネイティブとは、その先、
クラウドで提供されるサービス利用を前提にしたシステムおよびアプリケーションのこと。
概念レベルで違う。
AWS Lambdaって何?
1.インフラを一切気にせずプログラミングコード(JavaやPython,Nodeなど)を実行できる。
2.実行基盤は全てAWSが管理。
3.AWSサービスと連携させることで簡単にイベントドリブンなアプリケーションを実装可能
4.コード実行時間に対しての課金であり、非常に安い。
5.リクエスト数に対し、1,000インスタンス程度まで起動する。
つまり、急な負荷にも耐えられるし、アクセスがない場合は課金されない。
キャパシティ、耐障害性、セキュリティパッチの適用といった雑事から
エンジニアを開放するサービス!
デメリット
公式情報ではデメリットが後回しにされるが、ここでは代表的なデメリットを先に伝えておくぞ。
1.実行時間に上限がある。現在は上限15分まで。(2018年前期は5分だった。2015年は60秒だった。)
2.コールドスタンバイからの起動に3秒程要する。
3.外部からの通信コネクションの上限時間は15秒。(API Gateway)
※結果を待たない、または別のLambdaから取得するのであれば通信コネクションの上限時間は関係ないだろう。
仕組みの概要
1.リクエストが来る。
2.コンテナ(Linux)が立ちあがる。
3.プログラミングコードの実行環境が立ち上がる。
4.Lambdaプログラムが実行される。
5.リクエストがなくなり10~20分程度でコンテナを終了する。
Lambdaはスタックを持たない。
100個同時にコールしたら、
100個コンテナが立って、100個Lambdaが立つ。
同時実行数を超えたらエラーを返す。
リクエストが断続的にある場合、
1つの環境が処理を続けるため、起動時間が無くなる。
その代わり、グローバル変数の値は残るし、メモリリークもする。
マルチスレッド処理で、サブスレッドが停止した状態で残り、別ユーザの処理で動いていた!!なんてバグも遭遇したことがある。
公式のサンプルアーキテクチャ
■写真共有アプリ
イベントの写真を投稿すると、その投稿が参加者にPush通知される。
■モーションセンサー
映画館で観客がケータイを振ると、加速度センサーに応じてDBに値を登録できる。
リクエスト方法
色々な方法で呼ぶことができる。詳しくはサンプルをググる。
【例】
・JavaScriptからAjax通信で呼ぶ。
・Amazon S3(ストレージサービス)にファイルが配置されたら呼ぶ。
・DBにデータが5件登録されたら呼ぶ。
実装時のつまづきポイント
・Lambdaから他のAWSサービスを呼ぶ場合は、IAMロールの設定が必要。
・ファイルをアップロードする機能は、ZIPで全体をアプロードする選択肢しかない。
ライブラリなどを後から追加するときは、ソースコードを上書き削除しないように注意。
・Cloud9を使えば、EclipseやVSCodeのようなイメージでファイルのアップロードや編集ができる。
・バージョンやエイリアスごとに画面が微妙に切り替わり、メニューでできることも変わる。
ちょっと詳しい話
インスタンスが終了するまでの間、「/tmp」というLinuxOSの領域が一時的に500MB使える。
呼び出しモデル
PUSHモデル 条件によって他のAWSサービスからLambdaを呼ぶ。
PULLモデル Lambdaが他のサービスのデータを一定期間監視するように、
他のサービスがLambdaに要求する。
PULLモデルは順序性ありと書かれているが、Lambdaコールをする順序は順序性があっても、終了時間に順序はない。
プライベートIPアドレスがないので、インバウンドのソケット接続は不可能。
VPCアクセス機能 外部から呼ばずAWSネットワークの中で利用する場合、ONにすると良い。
これを使うとインターネット越しにアクセスしなくてもよくなる。
しかしながら、インスタンス起動時間が元々3秒だったのが、この機能を使うと10秒以上になる。
リクエスト頻度が低い場合は、使ってしまうともっさりする。