serverless frameworkを使って本格的なAPIサーバーを構築（魅力編）


# serverless frameworkを使って本格的なAPIサーバーを構築（魅力編）
最近、推しメンの　serverless framework の記事の第１弾です。
保守メンテが楽になりつつも、実戦で速攻で構築ができます。

## 目次
- **[serverless frameworkを使って本格的なAPIサーバーを構築（魅力編）](https://qiita.com/okamu_/items/e246887cb6f2621ad40a)←　今ここ**
- [serverless frameworkを使って本格的なAPIサーバーを構築（ハンズオン編）](https://qiita.com/okamu_/items/0f1055e5c91ed99ebec6)
- [serverless frameworkを使って本格的なAPIサーバーを構築（Express編）](https://qiita.com/okamu_/items/c19e2a682afe41a47eb1)
- [serverless frameworkを使って本格的なAPIサーバーを構築（テストコード編）](https://qiita.com/okamu_/items/2967726eef27420e6c63)


![framework_repo.png](https://qiita-image-store.s3.amazonaws.com/0/62822/e9ffa044-cdaf-c024-2dba-b670407ab1dd.png)


こんにちは！某会社のインフラエンジニアをしておりますが、最近は **サーバーレス** という言葉が流行ってますね。
今回は、serverless frameworkで 「 **lambda + APIGateway + DynamoDB** 」　の構成でいくつかサービスを作ったので、利点などをまとめていけたらと思います。



## **サーバーレスとserverless framework**


### まずサーバーレスとは
#### **サーバーの管理が不要になる**

- サーバーレスアーキテクチャでは、管理するサーバーがないため、サーバー管理から開放され、その分管理コストがかからなくなります。物理的なサーバーの管理はクラウド事業者に一任できるので、故障やパッチ適用の心配をする必要はありません。

また、一般にコード実行サービスは高い可用性を持っているため、オンプレミスサーバーよりも障害耐性が高くなるでしょう。


#### **アプリ開発において便利**
- APIサーバーとして、ハッカソン用に作ったアプリの運用など、ほとんどアクセスがないようなAPIサーバーをずっと放置しておくのは大変お金がかかります。

#### **従来の冗長化構成に比べ安価**
- EC2 + RDS環境を構築したときに、ある程度の規模であれば安価に済ますことができます。
  
#### **サーバーの脆弱性を突いた攻撃が効かない**
- セキュリティ被害の多くはサーバーOSやミドルウェアの脆弱性を突いた攻撃ですが、公開ネットワーク上にサーバーが無いので、一般的なサーバーの脆弱性を突く攻撃が効きません。

- Amazonのプラットフォームに脆弱性が無いとは言えませんが、プラットフォーム仕様が公開されていないので脆弱性を探すことが難しく、一般的なサーバーOSより脆弱性被害の可能性は少ないと考えられます。




#### **サーバーが落ちることがない**
- サーバーが無いのでサーバーダウンの概念がありません。

- 厳密にはAmazonがダウンすれば共倒れしますが、どのプラットフォームもサービス本体がダウンすれば同じことが言えるので、世界的インフラのAWSと、自社サーバーや一般企業のレンタルサーバーのどちらを信用するか、という話になります。


#### **放置できる**
- セキュリティパッチや、サーバー自体の管理が発生しないためある程度放置できます。

#### **インフラエンジニアがいなくてもスケールする**
- lambdaは最大で3000も同時に実行できます。
- dynamodbは、キャパシティユニットとオートスケールの設定がかんたんにできます。
- S3で静的コンテンツを配信したとしても障害確率はかなり低いです。

#### **とにかく安い！**
- サーバーは初期導入コストが高く、必要になるサーバースペックも事前に見積もっておかなければいけません。物理障害時のパーツ交換費用なども必要です。
クラウドサーバーにしても、起動している時間は料金がかかるため、閑散時などは100%コストを活用できているとはいえません。

- 一方、コード実行サービスであれば、実際にコードを実行した時間に応じて課金されるため、ムダなコストが発生しません。初期導入コストもかからないため、システムの規模に合わせて柔軟にスケールできます。

#### **保守メンテが楽**
- セキュリテイパッチやサーバー管理などのメンテが不要になります。

## **APIGateway+DynamoDB+Lambda手動構築の苦悩**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62822/6e8877a9-500a-acf2-06bf-2cda8a893444.png)

- serverless framework を使わずに「lambda + APIGateway + DynamoDB」を構築しようとすると、ほぼボタン操作で設定しないといけないです。
- どのステージをデプロイするのか、設定した項目・手順を忘れた。もとに戻したい、引き継ぎを行いたいなどいろいろなケースが考えられます


### 再現性がない
- これに尽きると思います。
- 基本的にAPIGatewayの設定などはボタン操作です。もちろんgit管理などできない。
	ステージの作成、レスポンスコード、methodの作成など操作を間違えても元に戻すことが難しくなり、実装コスト、人件費、考えるだけで大変なことが多すぎます。（大変だった。）

### よって保守性・メンテ・引き継ぎが難しくなっていました。

## そこでserverless frameworkの出番です!!
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62822/d6dc5388-615f-6565-c9df-d9e774cc7315.png)

- **基本的にAWSコンソールでのボタン操作は不要！！**
- **serverless.ymlですべて管理・設定ができる => 設定をgit管理できる**
    - **aws cloudformationの形式と似ているため、最悪それを真似できます（cloudformationよりかんたん！）**
- **コマンド１発でデプロイとロールバックが可能**
- **公式リポジトリにサンプルが沢山！！（こまりません）**
- **プラグインもたくさん（ぶっちゃけ使わなくても高機能！！）**
- **Expressと組み合わせると、超便利！！！！！（後日記事を書きます）**

### 注意点など
- iamのadmin権限が必要です。
- Cloudfrontは設定できません。

## 次回
- [serverless frameworkを使って本格的なAPIサーバーを構築（ハンズオン編）](https://qiita.com/okamu_/items/0f1055e5c91ed99ebec6)

## 参考記事
- https://cloudadvisor.jp/blog/aws-serverless-process