【AWS】API Gatewayを使用してLambda関数のREST APIを作成するチュートリアル試してみた

## 初めに
最近マイクロサービスアーキテクチャでのアプリ開発<sup>(1)</sup>に興味があり、手始めとしてAmazon API Gatewayを使用したREST APIを作成する方法について試してみたので、その作成手順を説明します。

### Amazon API Gatewayとは
Amazon API Gatewayは、AWSが提供するフルマネージドサービスで、REST、HTTP、WebSocket APIの作成をすることができます。これにより、開発者はAWSのリソースや他のウェブサービスへのアクセスを提供するAPIを容易に作成でき、これらのAPIを自身のアプリケーションやサードパーティの開発者に提供することが可能になります<sup>(2)</sup>。

### API作成手順について
この記事では、AWSが提供する「チュートリアル: Lambda プロキシ統合を使用して REST API を作成する<sup>(3)</sup>」手順について、実際に試してみたので作業手順を掲載します。手順に従うことで、初心者の方でも簡単にREST API作成を体験できるようになっています。それでは、早速始めましょう！

## 手順
### Lambda関数の作成
1). Lambdaを開き「関数を作成」を押します。
![2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817084/c1a26cbf-d6b7-e434-0afe-cf8e5435dc5d.jpeg)

2). 「一から作成」を選択し、以下項目を入力し「関数の作成」を押します。
- 関数名：任意の関数名(私の場合TestFunction)
- ランタイム：Python3.12
- デフォルトの実行ロールの変更：AWSポリシーテンプレートから新しいロールを作成
- ロール名：GetStartedLambdaBasicExecutionRole
![4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817084/0b9d9bde-41fb-fbfe-89f5-c8ef4c28068e.jpeg)

3). 赤枠のエディタ部分に以下関数を記入し、「Deploy」を押します。
![6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817084/20bc3a42-258e-eedf-9bd3-7e0be2a57f3b.jpeg)
```
import json


def lambda_handler(event, context):
    print(event)

    greeter = 'World'

    try:
        if (event['queryStringParameters']) and (event['queryStringParameters']['greeter']) and (
                event['queryStringParameters']['greeter'] is not None):
            greeter = event['queryStringParameters']['greeter']
    except KeyError:
        print('No greeter')

    try:
        if (event['multiValueHeaders']) and (event['multiValueHeaders']['greeter']) and (
                event['multiValueHeaders']['greeter'] is not None):
            greeter = " and ".join(event['multiValueHeaders']['greeter'])
    except KeyError:
        print('No greeter')

    try:
        if (event['headers']) and (event['headers']['greeter']) and (
                event['headers']['greeter'] is not None):
            greeter = event['headers']['greeter']
    except KeyError:
        print('No greeter')

    if (event['body']) and (event['body'] is not None):
        body = json.loads(event['body'])
        try:
            if (body['greeter']) and (body['greeter'] is not None):
                greeter = body['greeter']
        except KeyError:
            print('No greeter')

    res = {
        "statusCode": 200,
        "headers": {
            "Content-Type": "*/*"
        },
        "body": "Hello, " + greeter + "!"
    }

    return res
```

5). 関数が正常に更新されたことを確認して関数の作成は完了です。 
![7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817084/06993373-6717-c145-7bab-47685542d2af.jpeg)

### REST APIの作成
1).  API Gatewayを開き、「REST API」の「構築」を押します。
![2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817084/424fad22-56fd-6389-0729-a11a786bd367.jpeg)

2). 以下項目を入力し、「APIを作成」を押します。
- APIの詳細：新しいAPI
- API名：任意のAPI名(私の場合TestAPI)
- APIエンドポイントタイプ：リージョン
![3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817084/46cba903-4a83-471c-68ed-a901c01b7e59.jpeg)

3). 「リソースを作成」を押します。
![4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817084/f6a08e4b-8d0b-dc1f-b8ca-bef684b5971c.jpeg)

4). 「リソース名」に任意のリソース名を入力(私の場合helloworld)し、「リソースを作成」を押します。
![5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817084/76a70cac-ba01-fb07-64f6-9e53818846aa.jpeg)

5). 「メソッドを作成」を押します。
![7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817084/c17179a6-adf0-789e-ac26-662712bb9a63.jpeg)


6). 以下項目を入力し、「メソッドを作成」を押します。
- メソッドタイプ：ANY
- 統合タイプ：Lambda関数
- Lambdaプロキシ統合：有効
- Lambda関数：先ほど作成した関数
![8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817084/b188ff87-5ffb-2e37-f3e1-6f34311de6de.jpeg)

7). 「APIをデプロイ」を押します。
![9.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817084/ae06b7c8-a03a-d4c7-e3ac-a1098b052731.jpeg)

8). 以下項目を入力し、「デプロイ」を押します。
- ステージ：新しいステージ
- ステージ名：任意のステージ名(私の場合test)
![10.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817084/0731530a-a87c-24f5-a221-0ab4b2d2cb12.jpeg)

9). これでREST APIの作成は完了です。
APIの呼び出しで使うので赤枠部分のURLをコピーします。
![11.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817084/843979fa-440e-0a37-c641-6a71f1ae5317.jpeg)

### テスト
1). コマンド実行のためにターミナルやコマンドプロンプトなどシェルを開きます。

2). curlコマンドでAPIにHTTPリクエストを送り動作テストします。
呼び出すAPIのURLは先ほどコピーした呼び出しURLの末尾にリソース名を付け加えます、例えば今回私の値だと以下の様になります。
~~~
https://×××.execute-api.ap-northeast-1.amazonaws.com/test/helloworld
~~~
コマンドは以下になります。
「API URL」の部分に呼び出すAPIのURLを記入ください。
「名前」の部分にはお好きな名前を記入ください。

~~~
curl -v -X POST "API URL" -d "{ \"greeter\": \"名前\" }"
~~~
![1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817084/cdc7c289-58da-0a53-a9e8-74aa8f0b8cbd.jpeg)

2). 「Hello, 名前!」の文章が出力されたら成功です。
![2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817084/e588794b-008b-0601-250e-ae80e998d17f.jpeg)


## 削除手順
このまま運用する予定がない方は必要以上に料金が発生しないようにリソースを削除します。

### API Gatewayインスタンスの削除
API Gatewayインスタンスの削除をします。
削除手順がわからない場合、以下を参照ください。
 [API Gatewayインスタンス削除手順](https://qiita.com/SoraoKosaka/items/0674d54222a7f568690c)

 ### Lambda関数の削除
 Lambda関数の削除をします。
 削除手順がわからない場合、以下を参照ください。
 [Lambda関数削除手順](https://qiita.com/SoraoKosaka/items/0e6b34b8433baaa37fc1)

## 終わりに
この記事ではAmazon API Gatewayを使用したREST APIを作成する方法についてご紹介しました。

この記事が参考になりましたらぜひ「いいね」「フォロー」など励みになるのでよろしくお願いします！

## 参考文献
1. [モノリシックアーキテクチャとマイクロサービスアーキテクチャの違いは何ですか?](https://aws.amazon.com/jp/compare/the-difference-between-monolithic-and-microservices-architecture/)
2. [Amazon API Gateway とは何ですか?](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/welcome.html)
3. [チュートリアル: Lambda プロキシ統合を使用して REST API を作成する](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html)