ServerLessArchitecture環境構築
普通のサーバとの違い
■EC2のようないわゆる普通のサーバは(IaaS)と呼ばれる。
メリット:
・どんな言語でも利用可能、開発はしやすい。
・アプリケーション、サーバなどが明確にレイヤー分けされていてエラーが分かりやすい。
デメリット:
・インフラの管理、技術や知識が必要。
・時間単位の課金。
■AWS Lambdaのようなものは(FaaS)と呼ばれる。
メリット:
・サーバーの保守管理の手間が減る
・サーバーの脆弱性を突いた攻撃が効かない
・サーバーが落ちることがない(AWSが落ちる以外)
デメリット:
・言語はnode.js,Python,java。開発は英語のドキュメントのみ。
・少し難しいことをやろうとするとドキュメントにも記載なし。
・エラーハンドリングが明確でない為補足が難しい。
・複雑な処理はFunctionのレスポンスタイムが長くなる。
IaaSとFaaSの比較表
※基本的にはマイクロサービスに向いている傾向にあるが、APIで複雑な事をやろうとすると難しいことも多く、「サーバレス=メリットばかり」でもないので採用時には吟味する事が重要。
※ざっくり言うとキャンペーンサイトなど、高負荷がかかりやすいが処理自体は簡単なもの(データ登録のみ)などが向いている。
作るもの
住所検索APIを作成する。(DBからのデータ読み込み)
利用するもの
AWS
・API Gateway・・・・・リクエストを受けて、結果を返す
・Lambda・・・・・・・パラメータで受けて、DynamoDBから情報を取得し、返却
・DynamoDB(Nosql)・・・登録データ格納用
事前準備
AWSのアカウント作成のみ。
作成手順
1.DynamoDB作成
①テーブル作成
テーブル名:TblAddress
プライマリーキー:PostCode
②項目 > JSON入力(Text入力)
{"PostCode":"1040061","Prefectures":"東京都","City":"中央区","Town":"銀座"}
2.Lambda関数作成
①Lambda > 関数作成 > 一から作成
②名前とロールを任意に選択
名前:PostCodeFunc
③作成後、下記選択
ランタイム:Node.js 4.3
コード エントリ タイプ・・インラインで編集
ハンドラ:exports.handler(定義した内容に合わせる)
④Lambdaプログラムに記載
var AWS = require('aws-sdk');
var dynamo = new AWS.DynamoDB({
region: 'ap-northeast-1'
});
exports.handler = function(event, context) {
var params = {
"TableName": "TblAddress",
"KeyConditionExpression":"PostCode = :PostCode",
"ExpressionAttributeValues": {
":PostCode" : { "S" : event.postcode }
}
};
dynamo.query(params, function(err, data) {
context.done(null, data);
});
};
②アクション>リソース作成
リソース名:postcode
③作成したリソース選択>アクション>メソッド作成>GETを選択
統合タイプ: Lambda 関数
Lambda リージョン:ap-northeast-1
Lambda関数:PostCodeFunc
※関数名などは作成したLambdaに合わせる
④権限表示(Lambda 関数に権限を追加する)が表示されたらOKを押す
メソッドリクエスト>URL クエリ文字列パラメータ に下記パラメータを入力。
名前:path(これがURLの部分になる)
メソッドリクエスト>HTTP リクエストヘッダー に下記パラメータを入力。
名前:Content-Type
⑤作成したメソッド(GET)> 統合リクエスト > 本文マッピングテンプレート
> リクエスト本文のパススルー
Content-Type:application/json
⑥テンプレート生成は選択せず、下記Lambdaに渡すパラメータを入力して保存
{
"postcode":"$input.param('path')"
}
⑦作成したメソッド(GET)>アクション>APIデプロイで下記入力してデプロイ
デプロイステージ:[新しいステージ]
ステージ名:stage
実行
ステージエディターに表示されたURLをクリックし、最後に「/1040061」をつけてみる
https://xxxxxxxxxxxxx-api.ap-northeast-1.amazonaws.com/stage/postcode?path=1040061