API GatewayのHTTP APIとREST APIの違いを比較し、Lambda関数を実行する

## ◾️ はじめに
　現在、CDKを書くために、AWSの様々なサービスを使用しています。
 その中で、API GatewayのRest APIを使用し、Lambda関数を実行しようとしましたが、ステージの設定が必要なことや、デプロイが必須など構築が煩雑な点がありました。そこで、より簡単に利用できるHTTP APIを採用しましたが、両者の違いを深く理解せずに進めたため、費らずの時間を消費してしまいました。

この記事では、Rest APIとHTTP APIの違いを整理し、HTTP APIを使ってLambda関数を実行する手順を紹介します。Rest APIとHTTP APIのどちらを選ぶか迷っている方の参考になれば幸いです。


## ◾️ HTTP APIとRest APIの違い
<table>
  <thead>
    <tr>
      <th></th>
      <th> HTTP API </th>
      <th> Rest API </th>  
    </tr>
  </thead>
  <tr>
    <td>説明</td>
    <td>シンプルなAPIを低レイテンシー&&低コストで提供する</td>
    <td>高度なAPI管理や制御などの様々な機能を提供する</td>
  </tr>
  <tr>
    <td>ステージ設定</td>
    <td>
    不要<br>
    ※ステージを作成しなくてもデフォルトステージが自動で適用される
    </td>
    <td>必要</td>
  </tr>
  <tr>
    <td>リクエスト料金（100万回あたり）</td>
    <td>$1.00（最初の3億回）</td>
    <td>$3.50（最初の3億回）</td>
  </tr>
  <tr>
    <td>統合対象</td>
    <td>Lambda、HTTP バックエンド</td>
    <td>Lambda、HTTP バックエンド、Mock、AWSのサービス、VPCリンク</td>
  </tr>
  <tr>
    <td>データのキャッシュ</td>
    <td>未対応</td>
    <td>対応（追加料金あり）</td>
  </tr>
  <tr>
    <td>VPCリンク（Private API）</td>
    <td>未対応</td>
    <td>対応</td>
  </tr>
  <tr>
    <td>APIキー・使用量プラン</td>
    <td>未対応</td>
    <td>対応</td>
  </tr>
</table>

リクエスト料金（100万回あたり）が、REST APIはHTTP APIの**3.5倍**の料金がかかるのは、Rest APIは、APIキーの管理やVPCリンク、データキャッシュなどの追加機能を備えているため、より多機能な分だけ料金が高くなっていると考えられます。

また、HTTP APIは、**不要な機能を削り、よりシンプルにしたもの**のため、シンプルなAPIを作成したい場合に利用するのだおすすだと思います✨

## ◾️ AWS API GatewayのHTTP API + Lambda関数の実行手順
※今回、Lambda関数についての詳細説明は省きます。

### 【ステップ 1】 Lambda関数を作成する
以下を設定し、`関数の作成`ボタンクリックする
- オプション：一から作成
- 関数名：例）`apiGatewayHandler`
- ランタイム：Node.js 22x
- アーキテクチャ：x86_64

![スクリーンショット 2025-03-22 20.18.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748502/ce56deea-0744-47fd-b352-a23e266ad3ea.png)

### 【ステップ 2】 API Gatewayで以下を設定する
**1.　APIを作成する**
- APIタイプ選択：`HTTP API`
- 統合を設定：
    - API名：`HTTP API`
    - 統合を追加
        - 統合：`Lambda`
        - AWS リージョン：`ap-northeast-1`（Lambda関数を作成したリージョン選択）
        - Lambda関数：`apiGatewayHandler`(Lambda関数を作成した際の関数名を選択)
![スクリーンショット 2025-03-30 14.50.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748502/f99aff9a-df0f-458f-9f6e-01d8374787af.png)


**2.　ルート設定**
- メソッド：例）ANY
- リソースパス：`/apiGatewayHandler`
- 統合ターゲット：`apiGatewayHandler`
![スクリーンショット 2025-03-30 14.51.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748502/67ad51db-94d8-4499-9052-7e47230f0d0d.png)

**3.　ステージを定義**
デフォルトで設定されているまま次へ
![スクリーンショット 2025-03-30 15.14.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748502/c9f7feea-2da7-4331-904b-fd62a30cbd1f.png)

**4.　作成**
![スクリーンショット 2025-03-30 15.17.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748502/2d2288eb-b1c4-4282-8790-9c7c90698a24.png)

**5.　URLにアクセスする**
- デフォルトのエンドポイントにリソースパスを加えて`/apiGatewayHandler`アクセスする
```
https://{api-id}.execute-api.{region}.amazonaws.com/apiGatewayHandler
```
![スクリーンショット 2025-03-30 15.17.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748502/c0eec7de-214c-4711-9dd7-8dd56557331e.png)
Lambda関数作成時に、デフォルトで作成されるbodyのメッセージが返ってきていたら成功です✨
```
"Hello from Lambda!"
```

## ◾️ Rest APIを使用して設定する場合
※Lambda関数は、先ほど作成した`apiGatewayHandler`を使用します。

**1.　APIを作成する**
- APIタイプ選択：`Rest API`
- 新しいAPI選択
- API名：`Rest API`
    - APIエンドポイントタイプ（どこのエンドポイントからAPIにアクセスできるか設定する）：`リージョン`
![スクリーンショット 2025-03-30 14.37.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748502/3a76a530-cc9e-4807-9814-032fb8ec62ab.png)

**2.　メソッドを作成する**
以下を設定し、`メソッド作成`ボタンをクリックする
- メソッドタイプ：`ANY`
- 統合タイプ：`Lambda関数`
- Lambda関数：
    - Lambda関数を作成したリージョン選択：`ap-northeast-1`
    - 関数名選択：`apiGatewayHandler`

![スクリーンショット 2025-03-22 21.52.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748502/b43aa682-992f-4b89-b024-84ba98ff8ec9.png)


**3.　ステージを設定する**
`APIをデプロイ`ボタンをクリックし、APIをデプロイするステージを作成する
![スクリーンショット 2025-03-22 22.02.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748502/e2c0f871-dbc4-40d9-9dba-4bfae30583ac.png)

- ステージ：`*新しいステージ*`
- ステージ名：`api`
![スクリーンショット 2025-03-22 22.00.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748502/9219a196-a7b0-4bf3-a2c2-771dcab296d0.png)

**4.　作成されたURLにアクセス**
![スクリーンショット 2025-03-22 22.04.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748502/c180d069-25af-4367-a237-a946efdd53d7.png)

以下のように表示されていれば成功です✨
```
{"statusCode":200,"body":"\"Hello from Lambda!\""}
```

## ◾️ HTTP APIとRest API比較（デプロイやステージの扱い）
### HTTP API
- **ステージの概念が簡略化**
    - 明示的にステージを作成しなくてもデフォルトステージが自動で適用
    - URLに`dev`や`prod`などのステージ名が不要

※ステージ設定を削除してしまうと、エンドポイント (/) にアクセスできなくなるため、結果として`404 Not Found`になる！
```
https://{api-id}.execute-api.{region}.amazonaws.com/
```

- **デプロイが自動**
    - 設定を変更すると自動で反映されるため、明示的なデプロイ作業が不要
    - 一部の変更（Lambda統合など）は反映に時間がかかることがある

### REST API
- **ステージ（Stage）が必須**
    - ステージを作成し、デプロイしないと変更が反映されない
    - デプロイのたびに明示的に新しいバージョンをステージに適用する必要がある

- **デフォルトURLの形式**
    - {stage}（例: dev, prod など）がURLの一部として必須
```
https://{api-id}.execute-api.{region}.amazonaws.com/{stage}/
```

## ◾️ おわりに
最後までお読みいただきありがとうございます。
`HTTP API`と`Rest API`の違いを理解し、適切に選択することが重要です。

-　シンプルなAPIを低コスト・低レイテンシーで提供したいなら`HTTP API`
-　細かい制御やVPCリンクを利用する必要があるなら`REST API`

この記事が、適切なAPI Gatewayの選択と実装の参考になれば幸いです！