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);
});
};

3.API作成
API>作成
API名:postcode

②アクション>リソース作成
リソース名: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

結果

JSON形式のテキストデータが取り出せた。

{"Items":[{"PostCode":{"S":"1040061"},"Prefectures":{"S":"東京都"},"City":{"S":"中央区"},"Town":{"S":"銀座"}}],"Count":1,"ScannedCount":1}


このAPIを利用した住所検索アプリを作れば、どれだけ多くのアクセスが来ても落ちることなく住所検索サービスを提供できる。
実際の下図の右側のようにフロント部分はS3に置いておけば完璧。

※今回作った構成の参考イメージ↓