狠狠撸
Submit Search
AWS LambdaとAPI Gatewayでサーバレスなシステム構築に踏み出してみる
?
36 likes
?
13,707 views
Takashi Makino
AWS LambdaとAPI Gatewayでサーバレスなシステム構築に踏み出してみる
Read less
Read more
1 of 29
Download now
Downloaded 66 times
More Related Content
AWS LambdaとAPI Gatewayでサーバレスなシステム構築に踏み出してみる
1.
AWS ?LambdaとAPI ?Gatewayでサー バレスなシステム構築に踏み出してみる @makinog3 1
2.
アジェンダ p??AWS ?Lambdaって? n??おきまりのHello ?Lambda! n??さらに、イベントドリブンアプリケーション p??S3への書き込みイベントで発動 p??SNSでメールも送ってみる p??Amazon
?API ?Gatewayって? n??API ?GatewayからLambdaを叩く 2
3.
AWS ?Lambdaって? p??「イベント発?生時にお客様のコードを実?行行し、 コンピューティングリソースを?自動的に管理理す るコンピューティングサービス」 3 イベント 発動 ユーザ
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? アプリケーション
4.
イベントって? 4 Amazon S3 バケットのオブジェクト Amazon SNS から送信された通知 Amazon
Kinesis ストリームが受信した メッセージ Amazon DynamoDB テーブルの更新
5.
5 ようは なんかメッセージが飛んできたり データの更新とかがあったら プログラムを実行するしくみ あぁ、電子メールの.forwardとかRDBのトリガーで動くストアドプロシジャみたいなもんね
6.
何がうれしいのか<教科書的に> p???面倒なインフラの構築とかしないでも、スケー ラブル(!?)でイベントドリブンなアプリ ケーションを作れる n??数ミリ秒で起動 n??負荷に応じて勝?手にスケール n??処理理できるリクエストの数に制限なし p??S3、DynamoDBの更更新に合わせたカスタム処 理理ができる n??S3にアップロードされたファイルのメタデータを DynamoDBに登録するとか p??完全従量量課?金金 n??意外とEC2は?高いよね 6
7.
世の中、良良いことばかりじゃない p??状態を保持できない(ステートレス) n??データ(セッションとか)を保持する必要がある場 合は、DynamoDBなどに書く n??AWS ?Lambdaが ?λ(ラムダ関数)たるところ p??(今のところ)Node.jsかJava
?8のコードのみ n??Node.jsの関数かJavaのクラスのメソッドを発動 p??発動する関数/メソッドのシグネチャは決まってるので、既 存のコードが*そのまま*使えるわけではない n??Java ?8のラムダとは無関係 ?:-‐??P 7
8.
AWS ?Lambdaの実態? p??コンテナとして実装されてるっぽい n??なので、状態を保持できない p??/tmpへの書き込みはできても、永続化はされない n??なので、起動が速い! p??ImageMagickは使える n??S3に画像ファイルがアップロードされたのを契機に サムネイルを作るとかが想定されている? p??exec()とかできちゃうっぽい n??必要なライブラリを全て静的リンクして、gcc動かし ちゃってる?人とか 8
9.
まずは お決まりのHello ?Lambda 9 Lambdaの典型的な利利?用 パターンの雛形のコー ドが?用意されている
10.
LambdaにNode.js関数を設定 10 後で使う API ?Gatewayが Tokyoリージョンで は使えないので、 Oregonあたりにし ときましょう Execution ? Roleの設定 (後述) 呼び出される 関数名
11.
LambdaのRole p??Execution ?Role n??Lambda関数から ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AWSのリソースへ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? アクセスするための権限 n??例例えば、Lambda関数の ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 中からSNSにメッセージ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? を投げるならSNSへの ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 書き込み権限が必要 p??Invocation ?Role(イベントにより異異なる) n??イベントソースがLambda関数を実?行行するための権限 n??Lambda関数がイベントソースを取得するための権限 11
12.
こんな感じ 12 イベントの情報 (イベントソースによっ て内容は異異なる) CloudWatchに 記録される Lambda関数の 戻り値
13.
Hello ?LambdaのTEST 13
14.
S3にファイルが追加されたらSNS でメールを送る 14 S3 SNS Lambda 同じリージョン にします
15.
S3にバケットを作る 15
16.
SNSでメールを送る 16 送信許諾の確認 メールが届きます
17.
S3で発動するLambda関数を作る 17
18.
18 console.log('Loading function'); var aws
= require('aws-sdk'); var s3 = new aws.S3({ apiVersion: '2006-03-01' }); var sns = new aws.SNS({ accessKeyId: ‘ACCESS_KEY_ID', secretAccessKey: ’SECRET_ACCESS_KEY', region: ’REGION' }); exports.handler = function(event, context) { //console.log('Received event:', //JSON.stringify(event, null, 2)); // Get the object from the event and // show its content type var bucket = event.Records[0].s3.bucket.name; var key = event.Records[0].s3.object.key; var params = { Bucket: bucket, Key: key }; s3.getObject(params, function(err, data) { if (err) { console.log(err); var message = "Error getting" + " object " + key + " from bucket " + bucket; console.log(message); context.fail(message); } else { sns.publish({ Message: 'Got object ' + key + ' (' + data.ContentType + ') from bucket ' + bucket, Subject: '[ykcloud] Got object', TopicArn: ’TOPIC_ARN' }, function(err, data){ if(err) throw err; else context.fail('Unable’ + ' to send e-mail'); }); console.log('CONTENT TYPE:’, data.ContentType); context.succeed(data.ContentType); } }); };
19.
今?日のお題を思い出す… p??「AWS ?LambdaとAPI ?Gatewayでサーバレ スなシステム構築に踏み出してみる」 19 AWS
?Lambdaでサーバレスな Webアプリを作りたい LambdaをWebブラウザから ? ? 直接呼び出すのはメンドイ できなくは ないけど… そこでAmazon ?API ?Gateway ?!
20.
Amazon ?API ?Gatewayって? p??Lambdaを含むAWSの各サービスやインター ネット上で公開されているサービスに対して、 REST
?APIを提供することができる n??AWSのコンソールから簡単につくれる n??スケーラブル n??AWSの認証メカニズム(IAM)が利利?用できる n??APIをJavaScriptやAndroid、iOSアプリケーショ ンから使うためのSDKが作れる 20
21.
/prod/hello /prod/hello APIの構成 21 ? ?
? ? ?/prod/hello GET PUT POST DELETE : Stages Stages 本番環境とかテスト環境とかに 使い分けることを想定 Stage毎にCloudWatchの設定 や、キャッシュの設定ができる 作成したAPIはStageにデプロ イすることで公開される Resources Methods
22.
HelloLambdaのAPIを作ってみる 22
23.
HelloLambdaのAPIを作ってみる 23
24.
APIのテスト 24
25.
APIの公開 25
26.
ではWebブラウザから叩いてみる 26 JSON JSON S3にHTMLファイルと置いといて、そこからダウンロードするようにすれば、 EC2とか無しで、Webアプリケーションの運用ができる ※ただし、CORSの設定が必要 http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html
27.
27 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Hello
Lambda</title> <script type="text/javascript" src=/makinog3/aws-lambdaapi-gateway/"http:/ajax.googleapis.com/ ajax/libs/jquery/2.1.0/jquery.min.js"></script> <script type="text/javascript"> $(function(){ $("#response").html("Response Values"); $("#button").click( function(){ var url = $("#url_post").val(); var JSONdata = { key1: $("#key1").val(), key2: $("#key2").val(), key3: $("#key3").val() }; $.ajax({ type : 'post', url : url, data : JSON.stringify(JSONdata), contentType: 'application/JSON', dataType : 'JSON', scriptCharset: 'utf-8', success : function(data) { // alert(JSON.stringify(data)); $("#response").html(JSON.stringify(data)); }, error : function(data) { alert("error"); // alert(JSON.stringify(data)); $("#response").html(JSON.stringify(data)); } }); }) }) </script> </head> <body> <h1>Post to HelloLambda API Gateway</h1> <p>URL: <input type="text" id="url_post" name="url" size="100" placeholder="Your API Gateway URL"></p> <p>Key1: <input type="text" id="key1" size="30" placeholder="Key1 value"></p> <p>Key2: <input type="text" id="key2" size="30" placeholder="Key2 value"></p> <p>Key3: <input type="text" id="key3" size="30" placeholder="Key3 value"></p> <p><button id="button" type="button">post</button></p> <textarea id="response" cols=120 rows=10 disabled></ textarea> </body> </html>
28.
まとめ p??AWS ?Lambdaで簡単なイベントドリブンアプ リケーションを作るのは、難しくない n??S3、DynamoDBの更更新に合わせたカスタム処理理 n??複数のサービスとLambdaを組み合わせてチェーン p??Amazon ?API
?Gatewayとの組み合わせで、 サーバ/ミドルウェアなど?用意せずに、 RESTfulなWebアプリケーションを作れる n??本格的なモノを作るには、テスト?方法の確?立立とかが 課題か n??ちょっとした裏裏?方、運?用を助けるツールとして使う のが良良い感じ p?? ?LambdaのコンソールからAPIを作った時に上?手く動かないのはよくわからない… 28
29.
リファレンス p?? AWS ?Lambda公式ドキュメント(英語のみ)
? ? ? ? ?http://docs.aws.amazon.com/lambda/latest/dg/welcome.html p?? Amazon ?API ?Gateway公式ドキュメント(英語のみ) ? ? ? ? ?http://docs.aws.amazon.com/apigateway/latest/developerguide/ welcome.html 29
Download