AWSでAPI as a service (APIaaS)が作成・運用できる！

みなさんは開発時に外部ITサービスのAPIを利用したことがあると思います。その際、「使用プラン」や「APIキー」などの用語を目にしたことがあるでしょうか

プランによっては、APIの制限やAPIキー認証の実装が必要ですが、これらをゼロから作成するのは複雑で工数がかかります。

本記事では、AWS APIgatewayを利用してAPIaaSを作成する方法を共有しております。

# API Gateway 可能

+ Request制限
    + 速度（例1秒間で1000件叩ける）
    + クォータ（1月で総合何件）

+ SwaggerAPI
    + 仕様書が輸出
    + 模擬データ用意（BEに叩かない）

+ データキャシュー

+ 認証・認可


# 構成


AWS上で簡単にAPIaaS作成可能です。下記の構築を作成いたします。
+ APIGatewayは本記事の紹介対象です
+ BEはロジック処理のところです。簡単にするため、Lambdaを使います

![Screenshot 2025-02-15 at 16.19.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/9a505148-5fca-4a7e-8bbd-d937a86addd9.png)


__設定流れ__
1. Lambda 用意
1. API Gateway 設定
1. API Plans作成
1. API Key作成


# Lambda用意
AWS Consoleで Lambdaに入ってNodejsのLambdaファンクションを作成します。
ファンクション仕様をデフォルトに設定してください

## コード
以下のコードを貼り付けて、テストして問題なければデブロイします。
```js
export const handler = async (event, context) => {
  const version = 1;
  const response = {
      statusCode: 200,
      body: JSON.stringify('API service version'+ version),
    };
  return response;
};

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/497b4c93-314f-439a-8733-eecac7c24e94.png)


:::note warn
__留意__： 変更を反映するために、「デプロイ」ボタンを押下して下さい
:::


# API Gateway 設定
API gateway に入って作成しましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/af466bb0-7bdf-44ad-bc5f-0c9d0077a820.png)

本記事でBEがLambdaですから種類は```REST API```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/ab4d7ff8-3ba8-4685-b290-57fc3cf04ddf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/8b5d8dd1-dc91-4068-8a30-e008a810a8a9.png)





GET ```/hello```を作成しましょう

Resoure 作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/1ec56d7f-67ee-4e9f-bd7c-975755418271.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/bd29af3e-2c77-4f8e-a09e-1b745a766556.png)
メソッド作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/2ecca692-b2a2-4399-9262-ebf3847fcc0a.png)

該当するファンクションを選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/a456d2b3-8fa4-4247-bfb0-9adf9dec1c13.png)

忘れないように「DEPLOY API」押下してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/68e731b9-b238-400f-b6e8-fc6c93dd72ec.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/2df6f4c3-16d7-4f92-9571-4b75c5a5381f.png)

DEV Stage 環境を作成

::: note info
__Stages__ とはAPIGateway環境です。これによって設定が違います。
:::


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/ffda36a8-5dd4-4d5d-b301-7d83223e4dca.png)

一旦```上記のinvokeURL/hello```テストします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/21c8268f-a69d-41f0-93b1-c8d2f1cff6aa.png)

# API Plans 作成

Guest Planを作成しましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/a683a4ea-3c5f-4acb-9964-550c92521371.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/8afc08d3-d6ed-4524-ab50-fa2d7bd9288e.png)


| No | Name |説明|
|:-:|:-:|:-:|
|1| Name  | プラン名 （自由） |
|2|   Description |　プラン内容（任意）  |
|3|  Rate|1秒あたりのリクエスト数。|
|4|  Brust |  同時リクエスト数 | 
|5|  Request (左入力)|  ユーザーが期間内に行えるリクエストの総数   |
|6|  Request(右ドロップダウン)| 期間（1日・1月・1年）  |

「Guest」プランを作成してから、一覧画面に遷移される。「Guest」詳細画面に入りましょう。

次はStageに紐つく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/e819f489-20c4-4afe-842a-6dfc84fcd736.png)

+ API Gatewayを選ぶ
+ Stage を選ぶ
+ Method-level Throttlingにては、全てAPIに適用したら、「＊」使います。個別APIまでも設定できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/eedcb2c1-ce38-43c2-8be7-57a4b8d2da3e.png)

# API Keyを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/968e5a20-e6a3-474f-bb25-9e7ec0a23357.png)

+ NAME: クライアント名を設定したら管理しやすいです
+ API KEY: 自分で決めてもいいですが、一番おすすめは自動的にキーを生成することです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/9c41a379-6169-46a7-8d50-d7707c8a5895.png)

一覧で全てキーが管理できます。
![Screenshot 2025-02-15 at 21.33.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/bcaacc33-89cc-4dbb-b104-3987a7ccb2f6.png)


API keyバディデーション設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/3f7672f6-bb3d-45a1-a1e5-ce79fac10330.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/6c7ba6dd-f826-4a0e-9587-1168eccd1924.png)

:::note warn
改めてデプロイを忘れないようにしてください
:::



# 結果

APIを確認しましょう
### API urlはどこか　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/05a10178-dfd3-4db8-a794-0d15e7b66c9f.png)

URL：```＜invoke URL>/hello```

### PostManでチェックしましょう

#### APIキーをヘッダーにつけない
![Screenshot 2025-02-15 at 21.45.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/89ca3b2d-18f8-4843-b56f-84efa8b27341.png)

#### APIキーをヘッダーにつける
```x-api-key```: 上に作成したキー
![Screenshot 2025-02-15 at 21.48.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/91b0955f-51c0-4eac-a87e-e1680febf808.png)


#### 制限チェック
![ScreenRecording2025-02-15at21.50.08-ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/1564fd8f-f92f-4528-842f-11c915ca5740.gif)
制限に超える場合は
```
429 Too Many Requests
{
    "message": "Limit Exceeded"
}
```

# その他
+ 他サイトでAPI叩いたらCORSが必要です
+ AWS プランとAPIキーについて管理用のAPIがあり、AWS Consoleだけではなく個人サイトでも管理可能


最後まで読んで頂いて有り難うございます:bow:
役に立つを感じしたらハートやコメントやを残ってください:bow:

# 参考
https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-api-usage-plans.html
https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-setup-api-key-with-console.html
https://aws.amazon.com/jp/api-gateway/
https://docs.aws.amazon.com/apigateway/latest/api/API_CreateApiKey.html