AWS API Gatewayを構築してみた

# はじめに
API Gatewayがイメージできなかったため、私個人の検証環境で動作確認をしてみました。
API GatewayにHellow Worldのlambdaを紐づけました。

API GatewayとはAPI作成とAPIのバージョンを管理しているというイメージです。


以下の記事を参考にさせていただきました。
https://dev.classmethod.jp/articles/getting-start-api-gateway/

APIGatewayは以下のUdemyで学びました。
「【SAA-C03版】これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座」

https://www.udemy.com/share/101XFi3@0VaGeAoxhxLlklU2qj_m5ai8Ubq9NEWYWbOzCio1xnQ8dLaYjdAv7qPSeHrmqcl-Qg==/


# 料金の予想
lambdaを一回実行するため、
128M 	0.0000000021USD　　0ドル
API Gatewayもテストとして一回程度動作させるため、0円

## lambdaの構築
lambdaについては、以下の「cloudtech lambdaのハンズオン」動画を参考にして構築しました。
https://youtu.be/myCorTW2R_Y

**東京リージョンを選択する**
**サービス >> lambdaをクリックし、「関数の作成 」を選択する**

以下の赤枠の設定をしました。
今回Hello Worldを表示するためのlambdaのため、以下の赤枠の設定をしました。


設計図名「Hello World　function」
関数名「hello-python」
実行ロール　基本的なlambdaアクセス権限で新しいロールを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/05064fa9-1eb6-90df-1c1d-99e6e1c6b4a5.png)

**「関数の作成」をクリックする**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/708b3ed3-9177-916f-01aa-74ef10375063.png)

## lambdaを実行してみた
テストタブを選択し、以下の赤枠を設定しました。

イベント名「hello-world」と入力しました。
テンプレートはhello-wordを選びました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/ea6bdc79-796d-cd6b-2cad-dc14898e923b.png)

**正常に実行されました。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/83975ae3-863e-cf77-eb5b-b92ea39e3c44.png)

**CloudWatchログに2回TESTイベントを実行されたため、出力を確認しました。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/b60e909a-6b83-d713-8459-c86bcaaa9558.png)

## API Gatewayの構築

**サービス >> API Gatewayを選択し、左ペインのAPIを選択する**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/50d17e1b-e24e-6f7a-2899-095ca1ef9450.png)

**以下の赤枠を選択する**
RESTにチェックを入れる
新しいAPIにチェックを入れる

API名「test-api」をクリックする
エンドポイントタイプ「リージョン」を選択し、「APIの作成」をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/63d6bff3-f9a5-aba3-b184-c0549255cf55.png)

**左ペインのリソースを選択して、アクションから「リソースを作成」を選択する**
以下の設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/91b0e17c-fd8f-cd16-cfda-7852165c2720.png)

**リソースのhell-worldをクリックして、アクションから「メソッドを作成」を選択する**
**以下の赤枠の設定後、「保存」ボタンを押す**

統合タイプ　Lambda関数にチェックを入れる

Lambda関数「hello-python」を入力する※先程作成したlambda関数名を入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/4f0d9f06-bd93-271a-1505-3b96b621bcb2.png)


**以下が作成されました**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/703437f1-0cc2-aab3-11b5-3897ebd32d92.png)

## API Gatewayのテストをしてみた
**テストボタンをクリックする**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/afc14f36-71ae-c4c5-5c78-1379bf9eb8b9.png)

**以下が出力されました**
関数名「hello-python」のlambdaが実行されたように見えます。ステータス 200コードのため正常です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/7c7051d1-fa17-3473-167e-d3aef287eecd.png)

## API Gatewayのデプロイした
POSTを選択後、アクションを選択して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/dc84dcab-6784-241f-5414-c0e0fc02c0b7.png)

APIデプロイを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/6a47d44e-f7e5-d876-bd00-0c5921f807ff.png)

ステージ名「TEST」でデプロイしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/4eb7742c-f541-422e-ba5e-6e4ea6993b1e.png)


左ペインデプロイにステージ名「TEST」が表示されました。URLのリンクも表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/7bb2f7f2-4721-0ced-893a-446bf9f90719.png)

デプロイ履歴のタブを確認するとでデプロイした日付が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/75cfdcd2-cfa8-ecef-0247-91ab63d742b6.png)


**仮にリソースポリシーを設定したとしても必ずAPIのデプロイが必要になります。**

リソースポリシーの設定は以下のサイトが分かりやすく説明されていました。
https://oji-cloud.net/2019/09/17/post-3080/
※個人的にはリソースベースポリシーは既存の設定は誤って修正した場合に備えてメモ帳等に保管してから変更した方が良いと思いました。

リソースポリシーを直接修正してみたところ、操作になれずに違う部分を消してしまいました。
そのため、現在のリソースポリシーをメモ帳に張り付けてメモ帳内で修正をした後に
実機に張り付けた方がスムーズにいきました。

左ペインのリソースからアクションの「APIのデプロイ」を選択します。
割り当てるステージの間違いに注意が必要だと思いました。
今回は「TEST」ステージにデプロイを反映させた例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/996a9e5a-d776-f50f-8721-a4fdf6f30d1b.png)


## AWS nukeツールにて東京リージョンのリソースをすべて削除します

以下の手順を元に削除しました。
https://qiita.com/gama1234/items/3ac78634ae5b60c73493
```
./aws-nuke-v2.22.0-linux-amd64 -c ./nuke-config.yml --no-dry-run
```
実行結果のみ記載しましたremoveは削除されています。
```
ap-northeast-1 - APIGatewayRestAPI - 0ujl9szazi - [APIID: "0ujl9szazi", Name: "test-api"] - triggered remove
ap-northeast-1 - LambdaFunction - hello-python - [Name: "hello-python", tag:lambda-console:blueprint: "hello-world-python"] - triggered remove
ap-northeast-1 - CloudWatchLogsLogGroup - /aws/lambda/hello-python - [CreatedTime: "1681000799456", LastEvent: "2023-04-09T01:17:32Z", logGroupName: "/aws/lambda/hello-python"] - triggered remove
global - IAMLoginProfile - test_user1 - [UserName: "test_user1"] - triggered remove
global - IAMPolicy - arn:aws:iam::<AWSアカウント>:policy/service-role/AWSLambdaBasicExecutionRole-86d900d3-6243-417e-a289-9e3e33ca8980 - [ARN: "arn:aws:iam::<AWSアカウント>:policy/service-role/AWSLambdaBasicExecutionRole-86d900d3-6243-417e-a289-9e3e33ca8980", Name: "AWSLambdaBasicExecutionRole-86d900d3-6243-417e-a289-9e3e33ca8980", Path: "/service-role/", PolicyID: "ANPASH2NWM3K7WTE7BSQC"] - failed
global - IAMRolePolicyAttachment - hello-python-role-62drs5b0 -> AWSLambdaBasicExecutionRole-86d900d3-6243-417e-a289-9e3e33ca8980 - [PolicyArn: "arn:aws:iam::<AWSアカウント>:policy/service-role/AWSLambdaBasicExecutionRole-86d900d3-6243-417e-a289-9e3e33ca8980", PolicyName: "AWSLambdaBasicExecutionRole-86d900d3-6243-417e-a289-9e3e33ca8980", RoleCreateDate: "2023-04-09T00:36:52Z", RoleLastUsed: "2023-04-09T00:41:50Z", RoleName: "hello-python-role-62drs5b0", RolePath: "/service-role/"] - triggered remove

Removal requested: 5 waiting, 1 failed, 67 skipped, 0 finished

ap-northeast-1 - APIGatewayRestAPI - 0ujl9szazi - [APIID: "0ujl9szazi", Name: "test-api"] - waiting
ap-northeast-1 - LambdaFunction - hello-python - [Name: "hello-python", tag:lambda-console:blueprint: "hello-world-python"] - waiting
ap-northeast-1 - CloudWatchLogsLogGroup - /aws/lambda/hello-python - [CreatedTime: "1681000799456", LastEvent: "2023-04-09T01:17:32Z", logGroupName: "/aws/lambda/hello-python"] - waiting
global - IAMLoginProfile - test_user1 - [UserName: "test_user1"] - waiting
global - IAMPolicy - arn:aws:iam::<AWSアカウント>:policy/service-role/AWSLambdaBasicExecutionRole-86d900d3-6243-417e-a289-9e3e33ca8980 - [ARN: "arn:aws:iam::<AWSアカウント>:policy/service-role/AWSLambdaBasicExecutionRole-86d900d3-6243-417e-a289-9e3e33ca8980", Name: "AWSLambdaBasicExecutionRole-86d900d3-6243-417e-a289-9e3e33ca8980", Path: "/service-role/", PolicyID: "ANPASH2NWM3K7WTE7BSQC"] - removed
global - IAMRolePolicyAttachment - hello-python-role-62drs5b0 -> AWSLambdaBasicExecutionRole-86d900d3-6243-417e-a289-9e3e33ca8980 - [PolicyArn: "arn:aws:iam::<AWSアカウント>:policy/service-role/AWSLambdaBasicExecutionRole-86d900d3-6243-417e-a289-9e3e33ca8980", PolicyName: "AWSLambdaBasicExecutionRole-86d900d3-6243-417e-a289-9e3e33ca8980", RoleCreateDate: "2023-04-09T00:36:52Z", RoleLastUsed: "2023-04-09T00:41:50Z", RoleName: "hello-python-role-62drs5b0", RolePath: "/service-role/"] - waiting

Removal requested: 5 waiting, 0 failed, 67 skipped, 1 finished

ap-northeast-1 - APIGatewayRestAPI - 0ujl9szazi - [APIID: "0ujl9szazi", Name: "test-api"] - removed
ap-northeast-1 - LambdaFunction - hello-python - [Name: "hello-python", tag:lambda-console:blueprint: "hello-world-python"] - removed
ap-northeast-1 - CloudWatchLogsLogGroup - /aws/lambda/hello-python - [CreatedTime: "1681000799456", LastEvent: "2023-04-09T01:17:32Z", logGroupName: "/aws/lambda/hello-python"] - removed
global - IAMLoginProfile - test_user1 - [UserName: "test_user1"] - removed
global - IAMRolePolicyAttachment - hello-python-role-62drs5b0 -> AWSLambdaBasicExecutionRole-86d900d3-6243-417e-a289-9e3e33ca8980 - [PolicyArn: "arn:aws:iam::<AWSアカウント>:policy/service-role/AWSLambdaBasicExecutionRole-86d900d3-6243-417e-a289-9e3e33ca8980", PolicyName: "AWSLambdaBasicExecutionRole-86d900d3-6243-417e-a289-9e3e33ca8980", RoleCreateDate: "2023-04-09T00:36:52Z", RoleLastUsed: "2023-04-09T00:41:50Z", RoleName: "hello-python-role-62drs5b0", RolePath: "/service-role/"] - removed

Removal requested: 0 waiting, 0 failed, 67 skipped, 6 finished

Nuke complete: 0 failed, 67 skipped, 6 finished.
```

**念のため、リソースの削除漏れを確認しました**
アクティブなリソースがないかタグエディタで確認しました。
サービス > AWS Resource Groups をクリックする
左ペインのタグエディタを選択してリージョンは「All regions」リソースタイプは「All supported resource types」
リソースを検索ボタンを押しました。CSVエクスポートを押しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/7a53fef0-d2a5-125e-e373-fea9b115cac7.png)

文字化けはしていますが、EXCELのフィルタ機能をつかったところ、すべて料金がかからないサービスのみが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/1a2c40af-e4d8-68e0-a499-7b2124b76e26.png)


## 翌日料金を確認しました

4/9に作業しましたが、本記事の作業でかかった料金は0ドルでした。一週間後も急に課金されることがあるため、再度確認し記事を更新します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/0714589b-62ae-2d16-fa4e-be87727867c7.png)

料金計算
**APi Gateway**
受信した API コールと、転送データ量に対してのみ料金が発生するそうです。
```
REST API最初の3億3000万リクエスト　4.25USDです。

今回5回程度のみリクエストしたため、0USDと認識しています。
```
参考にした公式サイト
https://aws.amazon.com/jp/api-gateway/pricing/

**lambda** 
今回3回程度のみ動かしたため、0USDと認識しています。
```
アーキテクチャ
最初の60億GB秒/月	GB-秒あたり 0.0000166667USD	リクエスト 100 万件あたり 0.20USD

lambda 料金　今回128MBのlambdaを使用しました。
1ミリ秒あたりの料金
メモリ128MB	0.0000000021USD

```

参考にした公式サイト
https://aws.amazon.com/jp/lambda/pricing/

# まとめ
API Gatewayは実際に構築してみて、何か変更をした際は必ずAPIデプロイが必要であることを学びました。
選択した「ステージ」に対してAPIをデプロイするため、ステージを間違わない様に注意が必要です。
今回シンプルな構成だったため、今後応用がきくように日々学習を続けます。