狠狠撸

狠狠撸Share a Scribd company logo
AWS ?LambdaとAPI ?Gatewayでサー
バレスなシステム構築に踏み出してみる
@makinog3
1
アジェンダ
p??AWS ?Lambdaって?
n??おきまりのHello ?Lambda!
n??さらに、イベントドリブンアプリケーション
p??S3への書き込みイベントで発動
p??SNSでメールも送ってみる
p??Amazon ?API ?Gatewayって?
n??API ?GatewayからLambdaを叩く
2
AWS ?Lambdaって?
p??「イベント発?生時にお客様のコードを実?行行し、
コンピューティングリソースを?自動的に管理理す
るコンピューティングサービス」
3
イベント 発動
ユーザ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
アプリケーション
イベントって?
4
Amazon S3
バケットのオブジェクト	
Amazon SNS
から送信された通知	
Amazon Kinesis
ストリームが受信した
メッセージ	
Amazon DynamoDB
テーブルの更新
5
ようは
なんかメッセージが飛んできたり
データの更新とかがあったら
プログラムを実行するしくみ	
あぁ、電子メールの.forwardとかRDBのトリガーで動くストアドプロシジャみたいなもんね
何がうれしいのか<教科書的に>
p???面倒なインフラの構築とかしないでも、スケー
ラブル(!?)でイベントドリブンなアプリ
ケーションを作れる
n??数ミリ秒で起動
n??負荷に応じて勝?手にスケール
n??処理理できるリクエストの数に制限なし
p??S3、DynamoDBの更更新に合わせたカスタム処
理理ができる
n??S3にアップロードされたファイルのメタデータを
DynamoDBに登録するとか
p??完全従量量課?金金
n??意外とEC2は?高いよね
6
世の中、良良いことばかりじゃない
p??状態を保持できない(ステートレス)
n??データ(セッションとか)を保持する必要がある場
合は、DynamoDBなどに書く
n??AWS ?Lambdaが ?λ(ラムダ関数)たるところ
p??(今のところ)Node.jsかJava ?8のコードのみ
n??Node.jsの関数かJavaのクラスのメソッドを発動
p??発動する関数/メソッドのシグネチャは決まってるので、既
存のコードが*そのまま*使えるわけではない
n??Java ?8のラムダとは無関係 ?:-‐??P
7
AWS ?Lambdaの実態?
p??コンテナとして実装されてるっぽい
n??なので、状態を保持できない
p??/tmpへの書き込みはできても、永続化はされない
n??なので、起動が速い!
p??ImageMagickは使える
n??S3に画像ファイルがアップロードされたのを契機に
サムネイルを作るとかが想定されている?
p??exec()とかできちゃうっぽい
n??必要なライブラリを全て静的リンクして、gcc動かし
ちゃってる?人とか
8
まずは
お決まりのHello ?Lambda
9
Lambdaの典型的な利利?用
パターンの雛形のコー
ドが?用意されている
LambdaにNode.js関数を設定
10
後で使う
API ?Gatewayが
Tokyoリージョンで
は使えないので、
Oregonあたりにし
ときましょう
Execution ?
Roleの設定
(後述)
呼び出される
関数名
LambdaのRole
p??Execution ?Role
n??Lambda関数から ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
AWSのリソースへ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
アクセスするための権限
n??例例えば、Lambda関数の ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
中からSNSにメッセージ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
を投げるならSNSへの ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
書き込み権限が必要
p??Invocation ?Role(イベントにより異異なる)
n??イベントソースがLambda関数を実?行行するための権限
n??Lambda関数がイベントソースを取得するための権限
11
こんな感じ
12
イベントの情報
(イベントソースによっ
て内容は異異なる)
CloudWatchに
記録される
Lambda関数の
戻り値
Hello ?LambdaのTEST
13
S3にファイルが追加されたらSNS
でメールを送る
14
S3
SNS
Lambda
同じリージョン
にします
S3にバケットを作る
15
SNSでメールを送る
16
送信許諾の確認
メールが届きます
S3で発動するLambda関数を作る
17
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);
}
});
};
今?日のお題を思い出す…
p??「AWS ?LambdaとAPI ?Gatewayでサーバレ
スなシステム構築に踏み出してみる」
19
AWS ?Lambdaでサーバレスな
Webアプリを作りたい
LambdaをWebブラウザから ? ?
直接呼び出すのはメンドイ
できなくは
ないけど…
そこでAmazon ?API ?Gateway ?!
Amazon ?API ?Gatewayって?
p??Lambdaを含むAWSの各サービスやインター
ネット上で公開されているサービスに対して、
REST ?APIを提供することができる
n??AWSのコンソールから簡単につくれる
n??スケーラブル
n??AWSの認証メカニズム(IAM)が利利?用できる
n??APIをJavaScriptやAndroid、iOSアプリケーショ
ンから使うためのSDKが作れる
20
/prod/hello
/prod/hello
APIの構成
21
 ? ? ? ? ?/prod/hello
GET
PUT
POST
DELETE
:	
Stages	
Stages
本番環境とかテスト環境とかに
使い分けることを想定
Stage毎にCloudWatchの設定
や、キャッシュの設定ができる
作成したAPIはStageにデプロ
イすることで公開される
Resources
Methods
HelloLambdaのAPIを作ってみる
22
HelloLambdaのAPIを作ってみる
23
APIのテスト
24
APIの公開
25
ではWebブラウザから叩いてみる
26
JSON	
JSON	
S3にHTMLファイルと置いといて、そこからダウンロードするようにすれば、
EC2とか無しで、Webアプリケーションの運用ができる
※ただし、CORSの設定が必要
http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html
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>
まとめ
p??AWS ?Lambdaで簡単なイベントドリブンアプ
リケーションを作るのは、難しくない
n??S3、DynamoDBの更更新に合わせたカスタム処理理
n??複数のサービスとLambdaを組み合わせてチェーン
p??Amazon ?API ?Gatewayとの組み合わせで、
サーバ/ミドルウェアなど?用意せずに、
RESTfulなWebアプリケーションを作れる
n??本格的なモノを作るには、テスト?方法の確?立立とかが
課題か
n??ちょっとした裏裏?方、運?用を助けるツールとして使う
のが良良い感じ
p?? ?LambdaのコンソールからAPIを作った時に上?手く動かないのはよくわからない…
28
リファレンス
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

More Related Content

AWS LambdaとAPI Gatewayでサーバレスなシステム構築に踏み出してみる