AWS LambdaとAPI Gatewayを使用したGETリクエスト対応のサーバーレスアーキテクチャ構築

## はじめに
AWS LambdaとAPI Gatewayを組み合わせることで、インフラ管理を必要とせず、スケーラブルなWebアプリケーションやAPIを構築することができます。

このアプローチはサーバーレスアーキテクチャとして知られており、イベント駆動型の設計により、コスト効率が高く、管理の負担も軽減されます。

この記事では、Lambda関数とAPI Gatewayを使用して、GETリクエストを処理するシンプルなAPIを構築する手順を紹介します。

## 前提条件
この記事の内容を実施するには、以下の要件が揃っている必要があります。

:::note
**AWSアカウント：**
AWSアカウントを持っていることが前提です。

**AWS CLIの設定：**
ローカル環境からAWSにアクセスし操作できるよう、AWS CLIをセットアップし、認証情報を構成しておいてください。

**LambdaとAPI Gatewayの基本理解：**
両サービスの基本的な機能や操作方法についての理解が前提となります。公式ドキュメントや入門書を参考に、事前に学んでおくとスムーズです。
:::

https://aws.amazon.com/jp/lambda/

https://aws.amazon.com/jp/api-gateway/

## 達成したいこと

API Gatewayを通じてHTTPリクエストがLambda関数にルーティングされる仕組みを構築します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/1a616eaa-f266-a4da-0512-76da1d6ab26c.png)
引用画像：https://towardsdatascience.com/aws-lambda-amazon-api-gateway-not-as-daunting-as-they-sound-part-1-d77b92f53626

:::note warn
**APIの動作確認**
構築したAPIが正しく動作し、GETリクエストに対して正しいレスポンスを返すか確認します。
:::

## 実装手順

AWS LambdaとAPI Gatewayを用いたGETリクエストのサーバーレスアーキテクチャを構築する手順は、以下の3つのステップで進めます。

**ステップ 1: Lambda関数の作成**
**ステップ 2: API Gatewayの設定**
**ステップ 3: APIのテスト**

:::note info
前提として、検証環境がすでに構築されていることを想定しています。
:::

## ステップ 1: Lambda関数の作成
まずは、Lambda関数を作成します。ここでは、GETリクエストに対して固定のメッセージを返すシンプルな処理を実装します。

以下の図は、Lambda関数とAPI Gatewayが統合された完成図です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/bc196283-fde8-d2a6-41e4-a4f5eae4c484.png)


### Lambda関数の作成
AWSマネジメントコンソールにログインし、Lambdaサービスに移動します。「関数の作成」をクリックし、関数名に「SimpleGetFunction」と入力し、ランタイムにはPython 3.xを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/6384b170-c18f-6812-2818-df97ac203e5c.png)

### Lambda関数のコードを編集
以下のコードをLambda関数に追加します。このコードは、GETリクエストを受けた際に、固定のメッセージ **'Hello from AWS Lambda!'** を返すだけの非常にシンプルな関数です。

```python
import json

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from AWS Lambda!')
    }
```

### 関数を保存してテスト
関数を保存し、テストイベントを実施して動作を確認します（GETリクエストはテストイベントなしでも動作します）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/51e4f5b1-1c18-9bf1-1598-803a39090894.png)

以下の通り、テスト結果も問題なく動作していることを確認できます。

```
Test Event Name
log

Response
{
  "statusCode": 200,
  "body": "\"Hello from AWS Lambda!\""
}

Function Logs
START RequestId: xxx-xxx-xxx Version: $LATEST
END RequestId: xxx-xxx-xxx
REPORT RequestId: xxx-xxx-xxx	Duration: 1.48 ms	Billed Duration: 2 ms	Memory Size: 128 MB	Max Memory Used: 32 MB

Request ID
xxx-xxx-xxx
```

## ステップ 2: API Gatewayの設定
### API Gatewayの作成
AWSマネジメントコンソールで「API Gateway」に移動し、「APIの作成」をクリックします。次に「HTTP API」を選択し、APIの名前に「SimpleGetAPI」と入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/810e5d85-dd2e-8e40-851e-52ada7c22c47.png)


### Lambda統合の設定
APIの統合タブに移動し、「統合の追加」をクリックします。統合タイプとして「Lambda関数」を選択し、先ほど作成した「SimpleGetFunction」を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/ad944b64-d057-3870-5775-d501825a68e8.png)

### ルートとエンドポイントの設定
APIのルートに「GET /」を設定し、エンドポイントを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/bbc8a698-2004-df70-358e-ba006e9c535b.png)

:::note warn
この例ではリソースパスを「/SimpleGetFunction」として設定していますが、必要に応じて自身の環境に合わせて変更してください。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/3a25a523-368c-a2df-f0d4-19f5a5f348e0.png)

また、オプション設定として「dev」ステージも作成しています。このステージは任意の名前で構成可能です。

### APIのデプロイ
「デプロイ」ボタンをクリックし、APIをデプロイします。デプロイ後、公開URLが生成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/4ad0be41-d8b5-a3c1-b536-c753ba756715.png)

デプロイ後に表示される「SimpleGetAPI」のステージURLをメモしておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/eb249ca0-fc8a-98cd-6b61-8e98a5455199.png)


## ステップ 3: APIのテスト
### APIエンドポイントの確認
デプロイ後、AWSコンソールで公開されたエンドポイントURLを確認します。例えば、次のようなURLが生成されます。

```
https://your-api-id.execute-api.ap-northeast-1.amazonaws.com/dev
```

私の環境では以下のURLが生成されました。

```
https://lbk2qzzla8.execute-api.ap-northeast-1.amazonaws.com/dev
```


### ブラウザやcurlでリクエストを送信
ブラウザやcurlコマンドを使用して、GETリクエストを送信します。以下にcurlコマンドの例を示します。

```bash
curl https://your-api-id.execute-api.ap-northeast-1.amazonaws.com/
```

私の環境では、以下のコマンドを実行して想定通りの結果を得られていることが確認できました。

```
C:\Users\user>curl https://lbk2qzzla8.execute-api.ap-northeast-1.amazonaws.com/dev/SimpleGetFunction
"Hello from AWS Lambda!"
C:\Users\user>
```

:::note warn
生成されたURLに加えて、API作成時に指定したリソースパス「/SimpleGetFunction」を付け忘れないようにしましょう。
:::

### レスポンスの確認
正常に動作していれば、以下のようなレスポンスが返ってきます。

```json
"Hello from AWS Lambda!"
```

## まとめ
今回、AWS LambdaとAPI Gatewayを使用して、GETリクエストを処理するシンプルなサーバーレスアーキテクチャを構築しました。この方法により、サーバーを直接管理することなく、スケーラブルで低コストなAPIを作成することが可能です。

Lambdaは必要に応じて実行されるため、サーバーを常時稼働させる必要がなく、運用コスト削減に貢献します。

## 関連記事

https://qiita.com/free-honda/items/eef40d5c20acdc191550