サーバレス(APIGateway,Lambda)についてまとめてみた

## サーバレスとは
サーバについて考える必要なくアプリケーション開発が行える。
仮想サーバ構成の場合以下について考える必要性がある。

* サーバーの維持コスト
* アカウントのアクセス制御範囲
* デプロイ方法について  
etc..

## サーバレスアーキテクチャが生まれた背景
オンプレミス（物理サーバ）
→データセンターの仮想サーバ
→クラウド環境の仮想サーバ
→サーバレス  
インフラ構成はオンプレミスの物理データサーバを利用していた時代からサーバレスまで変化しました。
この背景はアプリケーションのアーキテクチャ設計が関係していると思われます。

アプリケーション開発のアーキテクチャ設計は
モノリシックアーキテクチャ
→サービス思考アーキテクチャ（SOA)
→マイクロサービスアーキテクチャ
のようにサービス、ロジック、インフラが密結合に設計されたアーキテクチャ構成から疎結合化したアーキテクチャに変更されてきました。
今回紹介する```サーバレス```はマイクロサービスを構築する上で利用しやすいサービスになります。

## サービス責任モデル
||オンプレミス  |クラウド  |Faas  |マネージドサービス |
|---|---|---|---|---|
|アプリケーション |ユーザー|ユーザー|ユーザー|クラウドベンダー|
|ランタイム|ユーザー|ユーザー|クラウドベンダー|クラウドベンダー|
|ミドルウェア|ユーザー|ユーザー|クラウドベンダー|クラウドベンダー|
|OS|ユーザー|ユーザー|クラウドベンダー|クラウドベンダー|
|仮想基盤|ユーザー|クラウドベンダー|クラウドベンダー|クラウドベンダー|
|ハードウェア|ユーザー|クラウドベンダー|クラウドベンダー|クラウドベンダー|

上記のようにサービス責任が問われます。
今回紹介しているサーバレスはこの表のFaas、マネージドサービスにあたります。

## メリット
* サービス開発の時間の短縮により、サービスロジックの構成に集中できる
* 運用保守の省力化
* 従量課金であるためインフラ維持コストがかからない

上記のメリットから以下のユースケースが想定される。

* 既存機能の一部置き換え
* 新規実装の概念実証
* マイクロサービスとして定義したシステムの構築
* キャンペーンサートなどの一時的機能
* 管理サイトなどの特定の利用を行う機能

## デメリット
* モノリシックなアプリケーション開発には有効でない
* トランザクションが頻繁に利用されるシステムに向いていない
* 低レイテンシ（遅延）が求められるサービスに向いていない

## 従来のAWS構成との比較
* 従来のEC2によるインフラ構成
![EC2_Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326801/1caf4120-708b-7538-49fb-fe26388457ab.png)


* APIGateway,lambdaを利用したサーバレスなインフラ構成
![lambda_Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326801/63786ac6-102c-9200-a4d7-2372d8363fd5.png)


## デザインパターン例
* モバイルバックエンド
AWS AppSyncを利用してリアルタイム処理。オフライン用件のモバイルシステム。
* 画像処理・データ加工
S3,SQSと連携してイベント発生時にlambdaによる加工処理が実行される。
* Amazon Alexaスキルの作成
音声認識時にlambda実行が行われる。

## APIGatewayとlambdaを利用して簡単なAPIを作成してみる
今回はAPIGatewayのリクエストをトリガーにlambda関数を実行するAPIを作成してみます。

* lambda関数の作成
AWSコンソールからlambdaを選択し、lambda関数の作成ボタンを押下します。
![A979C71D-48B4-47F0-AF92-931AF9F2C799_1_201_a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326801/b14e3c39-b1fe-20db-b594-1b9115a2a5c9.jpeg)

![C047F395-A0EC-4C29-8808-DFCF894D56B0_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326801/0cf545ef-cb03-e3f7-4381-eb3f95eec1ee.jpeg)

「一から作成」を選択して
任意の関数名、記述言語を選択します。
![3AF7F997-5678-4B5C-A336-BA59FCFC4697_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326801/14ac2231-8666-2804-a08b-5721b0fbfc07.jpeg)

今回のLambda関数の他のAWSサービスへのアクセス許可を設定します。
![E24B81A6-5792-44C3-92C6-8B8F976DAFE3_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326801/5c45f2d2-23ca-0cab-771a-b00ae520d037.jpeg)

ロール名は任意のロール名を入力して、
ポリシーテンプレートは
「基本的な Lambda@Edge のアクセス権限(CloudFront トリガーの場合)」を選択します。
このテンプレートには、CloudWatchへのアクセス権限が含まれているので、今回作成したロールが付与されたサービスは、CloudWatchにログを出力できるようになります。

上記のように入力したら、 「関数の作成」 ボタンをクリックします。

![1B37322C-B0B9-45AE-AA96-4FA8E53979E3_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326801/a169068d-43ed-7446-bc01-84d43afeb532.jpeg)

関数はサンプルをそのまま使います。
API Gatewayで作成したAPIがリクエストを受けると、Lambda関数が呼ばれて、そのリクエスト情報一式が1行目のeventに渡されます。
eventは今回は使わずに、APIには「"Hello from Lambda!"という文字列をレスポンスとして返すように」という指示を、処理結果として返します。

* APIGatewayの作成  

次にAPIGatewayの作成をしていきます。
RESTAPIの「構成」ボタンを押下します。
![497BAF63-278E-4843-AB13-F2BCE0C83A3D_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326801/e3fdd4bd-f286-3b34-1c00-ab982a449762.jpeg)

新しいAPIを選択して、任意のAPI名を選択し、「APIの作成」ボタンを押下します。

![606C3DA5-FE1A-42A3-9C73-D5A714BC31EF_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326801/d60b179a-6a18-0082-599d-534888ecf921.jpeg)

APIの作成ができたら、まずはエンドポイントを作成します。
アクションボタンを押下して「リソースの作成」を選択します。
![A9791AB4-7528-4353-A285-C68344A1E632_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326801/2a618727-c14b-3c50-95ba-e76ee8f4641a.jpeg)

任意のリソース名を記入して、「APIGateway CORSを有効にする」にチェックを入れます。
チェックを入れると、testリソースの作成と共に、optionメソッドのエンドポイントが作成されます。
これによりブラウザからAPIを呼び出すことができます。
![0E4FDAC7-2342-4415-B7E3-85A251CEE7ED_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326801/de53fc55-a01d-d806-4df2-b7eb6e859947.jpeg)

testリソースに、GETメソッドのエンドポイントを作成します。
![16C8A119-51D2-4420-BA30-6C23C4534E7E_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326801/dfe5c881-2820-fd45-3962-c81529432abb.jpeg)

「GET」を選択してチェックをクリックします。
![09968224-54BC-415F-88F6-9294CE7188F9_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326801/d2735001-250b-08f1-a8c4-5c0306d5cf42.jpeg)

GETメソッドのエンドポイントがリクエスト受けた時、どのように処理するか設定します。
統合タイプとして「Lambda関数」を選択して、「Lambda プロキシ統合の使用」にチェックをいれ、Lambda関数に先ほど作成したLambda関数を指定します。
![A872CE7E-D268-4D67-9F44-DB2612924B6E_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326801/cec63bb0-cf37-8dc9-4d3b-42cbb55d76ab.jpeg)

「Lambda プロキシ統合の使用」にチェックを入れると、このエンドポイントに対するリクエスト情報一式を、Lambdaのevent変数（後述）に渡します。
保存ボタンを押すと、以下のようにAPIGatewayからlambda関数にアクセスする権限を与えるか確認がありますのでOKを押下します。
![5A1EE569-FF1C-49C9-83E9-DAD24F26870A_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326801/73ded262-0e09-a4e3-5ce4-ac2fb4491fe9.jpeg)

lambdaに戻って「デザイナー」を選択して構成を確認します。
![7403C0DB-6E22-44BC-A8F2-0092B94E3353.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326801/80d79f20-89d0-f7bf-5bea-8dee20c2eea8.jpeg)

最後にAPIGatewayのデプロイをします。
![E2C3ECF8-8C38-43AD-A2AD-997F239D2EC3_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326801/6d867817-f3b1-d6dd-2d1d-a0ae9a5fbddf.jpeg)

デプロイされるステージに「新しいステージ」を選択して、ステージ名を「production」としてデプロイボタンを押下します。
![5E2F389F-66A4-43B6-963F-FCB3E1B063B0_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326801/ea83beb3-a23a-5b5f-4cca-ef2db2fcb9f9.jpeg)

GETメソッドのエンドポイントを選択すると、エンドポイントのURLが表示されます。
URLにアクセスして想定通りの挙動をしているか確認してみます。
![6EF026D2-A09A-41F7-9047-BAF6350E8815_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326801/d93aee74-bfe4-73c9-a667-31547a7288fe.jpeg)

以下のように「Hello from Lambda!」と表示されれば完成です。
![17CFE78E-3F58-456B-AD74-0821C1C2B92B_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326801/4308c18b-5104-5b5e-9ec0-da5e0470a133.jpeg)

サーバーレスの背景、メリットデメリット、簡易的なAPIの作成と簡単にサーバレスに触れてみました。
今回紹介できなかったこと意外にもたくさんのできるととがあります。
参考記事にはこの記事以上の情報量、質があります。
この記事をみてもしもさらに調べてみたいと思った方がいましたら、是非とも一読してみてください！

## 参考
[実践プロダクションサーバーレス - AWS CDK と TypeScript によるWebアプリケーション開発パターン](https://www.youtube.com/watch?v=m-5Eh1xfb7o&ab_channel=%E3%82%AF%E3%83%A9%E3%82%B9%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89)
[【初級】いまから始めるサーバレスアプリケーション | AWS Summit Tokyo 2019] (https://www.youtube.com/watch?v=fs-ByT_I1G0&ab_channel=AmazonWebServicesJapan%E5%85%AC%E5%BC%8F)
[サーバーレスシステムのチーム開発](https://www.youtube.com/watch?v=zWIjG997s98&ab_channel=%E3%82%AF%E3%83%A9%E3%82%B9%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89)
[API Gateway + LambdaでREST API開発を体験しよう [10分で完成編]](https://qiita.com/tamura_CD/items/46ba8a2f3bfd5484843f)
[サーバレスとは]
(https://qiita.com/mafakuti/items/cb32745fd6f4b3804364)