LoginSignup
3
1

More than 1 year has passed since last update.

AWS API Gatewayを構築してみた

Last updated at Posted at 2023-04-09

はじめに

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 認定ソリューションアーキテクト – アソシエイト試験突破講座」

料金の予想

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

「関数の作成」をクリックする
image.png

lambdaを実行してみた

テストタブを選択し、以下の赤枠を設定しました。

イベント名「hello-world」と入力しました。
テンプレートはhello-wordを選びました。
image.png

正常に実行されました。
image.png

CloudWatchログに2回TESTイベントを実行されたため、出力を確認しました。
image.png

API Gatewayの構築

サービス >> API Gatewayを選択し、左ペインのAPIを選択する
image.png

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

API名「test-api」をクリックする
エンドポイントタイプ「リージョン」を選択し、「APIの作成」をクリックする
image.png

左ペインのリソースを選択して、アクションから「リソースを作成」を選択する
以下の設定しました。
image.png

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

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

Lambda関数「hello-python」を入力する※先程作成したlambda関数名を入れる
image.png

以下が作成されました
image.png

API Gatewayのテストをしてみた

テストボタンをクリックする
image.png

以下が出力されました
関数名「hello-python」のlambdaが実行されたように見えます。ステータス 200コードのため正常です。
image.png

API Gatewayのデプロイした

POSTを選択後、アクションを選択して
image.png

APIデプロイを選択します。
image.png

ステージ名「TEST」でデプロイしました。
image.png

左ペインデプロイにステージ名「TEST」が表示されました。URLのリンクも表示されました。
image.png

デプロイ履歴のタブを確認するとでデプロイした日付が表示されます。
image.png

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

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

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

左ペインのリソースからアクションの「APIのデプロイ」を選択します。
割り当てるステージの間違いに注意が必要だと思いました。
今回は「TEST」ステージにデプロイを反映させた例です。
image.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

文字化けはしていますが、EXCELのフィルタ機能をつかったところ、すべて料金がかからないサービスのみが表示されました。
image.png

翌日料金を確認しました

4/9に作業しましたが、本記事の作業でかかった料金は0ドルでした。一週間後も急に課金されることがあるため、再度確認し記事を更新します。
image.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をデプロイするため、ステージを間違わない様に注意が必要です。
今回シンプルな構成だったため、今後応用がきくように日々学習を続けます。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1