チュートリアル: API Gateway で Lambda を使用する
このチュートリアルでは、HTTP リクエストを使用して Lambda 関数を呼び出す REST API を作成します。Lambda 関数は、DynamoDB テーブルで作成、読み取り、更新、および削除 (CRUD) 操作を実行します。このチュートリアルで提供される関数はデモ用ですが、任意の Lambda 関数を呼び出すことができる API Gateway REST API を設定する方法を学びます。
![このチュートリアルで使用されるサービスとリソース](images/APIG_tut_resources.png)
API Gateway を使用することで、Lambda 関数を呼び出すためのセキュアな HTTP エンドポイントがユーザーに提供されるとともに、トラフィックのスロットリングと、API 呼び出しの自動的な検証と承認によって、関数に対する大量の呼び出しを管理するためにも役立ちます。API Gateway は、AWS Identity and Access Management (IAM) と Amazon Cognito を使用した柔軟なセキュリティコントロールも提供します。これは、アプリケーションへの呼び出しに事前承認が必要なユースケースに役立ちます。
このチュートリアルは、以下の段階を通じて完了します。
-
DynamoDB テーブルで操作を実行するための Lambda 関数をPython または Node.js で作成し、設定する。
-
API Gateway で、Lambda 関数に接続するための REST API を作成する。
-
DynamoDB テーブルを作成し、コンソールで Lambda 関数を使用してテーブルをテストする。
-
API をデプロイし、ターミナルで curl を使用してセットアップ全体をテストする。
これらの段階を完了することにより、あらゆる規模で Lambda 関数をセキュアに呼び出すことができる HTTP エンドポイントを作成するために API Gateway を使用する方法を学びます。また、API をデプロイする方法と、それをコンソールでテスト、およびターミナルを使用して HTTP リクエストを送信することでテストする方法も学びます。
セクション
前提条件
AWS アカウントがない場合は、以下のステップを実行して作成します。
AWS アカウントにサインアップするには
オンラインの手順に従います。
サインアップ手順の一環として、通話呼び出しを受け取り、電話キーパッドで検証コードを入力するように求められます。
AWS アカウントにサインアップすると、AWS アカウントのルートユーザーが作成されます。ルートユーザーには、アカウントのすべてのAWS のサービスとリソースへのアクセス権があります。セキュリティのベストプラクティスとして、ユーザーに管理アクセスを割り当て、ルートユーザーのみを使用してルートユーザーアクセスが必要なタスクを実行してください。
サインアップ処理が完了すると、AWS からユーザーに確認メールが送信されます。https://aws.amazon.com/
AWS アカウント にサインアップしたら、AWS アカウントのルートユーザー をセキュリティで保護し、AWS IAM Identity Center を有効にして、管理ユーザーを作成します。これにより、日常的なタスクにルートユーザーを使用しないようにします。
AWS アカウントのルートユーザーをセキュリティで保護する
-
[ルートユーザー] を選択し、AWS アカウントのメールアドレスを入力して、アカウント所有者として AWS Management Console
にサインインします。次のページでパスワードを入力します。 ルートユーザーを使用してサインインする方法については、AWS サインイン ユーザーガイドの「ルートユーザーとしてサインインする」を参照してください。
-
ルートユーザーの多要素認証 (MFA) を有効にします。
手順については、IAM ユーザーガイドの「AWS アカウント のルートユーザーの仮想 MFA デバイスを有効にする (コンソール)」を参照してください。
管理アクセスを持つユーザーを作成する
-
IAM アイデンティティセンターを有効にします。
手順については、「AWS IAM Identity Center ユーザーガイド」の「AWS IAM Identity Center の有効化」を参照してください。
-
IAM アイデンティティセンターで、ユーザーに管理アクセスを付与します。
IAM アイデンティティセンターディレクトリ をアイデンティティソースとして使用するチュートリアルについては、「AWS IAM Identity Center ユーザーガイド」の「デフォルト IAM アイデンティティセンターディレクトリを使用したユーザーアクセスの設定」を参照してください。
管理アクセス権を持つユーザーとしてサインインする
-
IAM アイデンティティセンターのユーザーとしてサインインするには、IAM アイデンティティセンターのユーザーの作成時に E メールアドレスに送信されたサインイン URL を使用します。
IAM Identity Center ユーザーを使用してサインインする方法については、AWS サインイン ユーザーガイドの「AWS アクセスポータルにサインインする」を参照してください。
AWS Command Line Interface をまだインストールしていない場合は、「最新バージョンの AWS CLI のインストールまたは更新」にある手順に従ってインストールしてください。
このチュートリアルでは、コマンドを実行するためのコマンドラインターミナルまたはシェルが必要です。Linux および macOS では、任意のシェルとパッケージマネージャーを使用してください。
注記
Windows では、Lambda でよく使用される一部の Bash CLI コマンド (zip
など) が、オペレーティングシステムの組み込みターミナルでサポートされていません。Ubuntu および Bash の Windows 統合バージョンを取得するには、Windows Subsystem for Linux をインストール
許可ポリシーを作成する
![ステップ 1 許可ポリシーを作成する](images/APIG_tut_steps_1.png)
Lambda 関数の実行ロールを作成する前に、必要な AWS リソースにアクセスするための許可を関数に付与する許可ポリシーを作成する必要があります。このチュートリアルでは、このポリシーが、DynamoDB テーブルで CRUD 操作を実行し、Amazon CloudWatch Logs に書き込むことを Lambda に許可します。
ポリシーを作成する
-
IAM コンソールのポリシー
ページを開きます。 -
[ポリシーの作成] を選択します。
-
[JSON] タブを選択して、次のカスタムポリシーを JSON エディタに貼り付けます。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1428341300017", "Action": [ "dynamodb:DeleteItem", "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:UpdateItem" ], "Effect": "Allow", "Resource": "*" }, { "Sid": "", "Resource": "*", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Effect": "Allow" } ] }
-
[次へ: タグ] を選択します。
-
[次へ: レビュー] を選択します。
-
[ポリシーの確認] でポリシーの [名前] に「
lambda-apigateway-policy
」と入力します。 -
[ポリシーの作成] を選択します。
実行ロールを作成する
![ステップ 2 実行ロールを作成する](images/APIG_tut_steps_2.png)
実行ロールとは、AWS サービスとリソースにアクセスする許可を Lambda 関数に付与する AWS Identity and Access Management (IAM) ロールです。関数が DynamoDB テーブルで操作を実行できるようにするには、前のステップで作成した許可ポリシーをアタッチします。
実行ロールを作成して、カスタム許可ポリシーをアタッチする
-
IAM コンソールのロールページ
を開きます。 -
[ロールの作成] を選択します。
-
信頼されたエンティティには、[AWS サービス] を選択し、ユースケースには [Lambda] を選択します。
-
[次へ] をクリックします。
-
ポリシー検索ボックスに、「
lambda-apigateway-policy
」と入力します。 -
検索結果で作成したポリシー (
lambda-apigateway-policy
) を選択し、[次へ] を選択します。 -
[Role details] (ロールの詳細)で [Role name] (ロール名) に
lambda-apigateway-role
を入力してから、[Create role] (ロールを作成) を選択します。
このチュートリアルの後半で、先ほど作成したロールの Amazon リソースネーム (ARN) が必要になります。IAM コンソールの [Roles] (ロール) ページでロール名 (lambda-apigateway-role
) を選択し、[Summary] (概要) ページに表示されている [Role ARN] (ロールの ARN) をコピーします。
関数を作成する
![ステップ 3 関数を作成する](images/APIG_tut_steps_3.png)
以下のコード例は、作成される DynamoDB テーブルで実行する操作と、いくつかのペイロードデータを指定する、API Gateway からのイベント入力を受け取ります。関数が受け取るパラメータが有効な場合、リクエストされた操作をテーブルで実行します。
AWS CLI を使用して関数を呼び出す
![ステップ 4 AWS CLI を使用して関数を呼び出す](images/APIG_tut_steps_4.png)
関数を API Gateway と統合する前に、関数が正常にデプロイされたことを確認します。API Gateway API が Lambda に送信するパラメータが含まれるテストイベントを作成し、AWS CLI invoke
コマンドを使用して関数を実行します。
AWS CLI を使用して Lambda 関数を呼び出す
-
次の JSON をファイル名
input.txt
で保存します。{ "operation": "echo", "payload": { "somekey1": "somevalue1", "somekey2": "somevalue2" } }
-
次の
invoke
AWS CLI コマンドを実行します。aws lambda invoke \ --function-name LambdaFunctionOverHttps \ --payload file://input.txt outputfile.txt \ --cli-binary-format raw-in-base64-out
AWS CLI バージョン 2 を使用している場合、cli-binary-format オプションは必須です。これをデフォルト設定にするには、
aws configure set cli-binary-format raw-in-base64-out
を実行します。詳細については、バージョン 2 の AWS Command Line Interface ユーザーガイドの「AWS CLI でサポートされているグローバルコマンドラインオプション」を参照してください。以下のようなレスポンスが表示されます。
{ "StatusCode": 200, "ExecutedVersion": "LATEST" }
-
JSON テストイベントで指定した
echo
操作を関数が実行したことを確認します。outputfile.txt
ファイルを調べて、以下が含まれていることを確認します。{"somekey1": "somevalue1", "somekey2": "somevalue2"}
API Gateway を使用して REST API を作成する
![ステップ 5 API を作成する](images/APIG_tut_steps_5.png)
このステップでは、Lambda 関数を呼び出すために使用する API Gateway REST API を作成します。
API を作成するには
-
API Gateway コンソール
を開きます。 -
[Create API] を選択します。
-
[REST API] ボックスで、[構築] を選択します。
-
[API の詳細] で [新しい API] を選択したままにし、[API 名] には
DynamoDBOperations
と入力します。 -
API の作成 を選択します。
REST API でリソースを作成する
![ステップ 6 API リソースを作成する](images/APIG_tut_steps_6.png)
API に HTTP メソッドを追加するには、まずそのメソッドが操作を実行するリソースを作成する必要があります。ここでは、DynamoDB テーブルを管理するためのリソースを作成します。
リソースを作成する
-
API Gateway コンソール
の API の [リソース] ページで、[リソースの作成] をクリックします。 -
[リソースの詳細] の [リソース名] に、
DynamoDBManager
と入力します。 -
[リソースの作成] を選択します。
HTTP POST メソッドを作成する
![ステップ 7 HTTP POST メソッドを作成する](images/APIG_tut_steps_7.png)
このステップでは、DynamoDBManager
リソースのためのメソッド (POST
) を作成します。この POST
メソッドを Lambda 関数にリンクして、メソッドが HHTTP リクエストを受け取るときに、API Gateway が Lambda 関数を呼び出すようにします。
注記
このチュートリアルの目的上、DynamoDB テーブルですべての操作を実行する単一の Lambda 関数を呼び出すために、1 つの HTTP メソッド (POST
) が使用されます。実際のアプリケーションでは、操作ごとに異なる Lambda 関数と HTTP メソッドを使用することがベストプラクティスです。詳細については、Serverless Land の「Lambda モノリス
POST メソッドを作成する
-
API の [リソース] ページで、
/DynamoDBManager
リソースが強調表示されていることを確認します。次に、[メソッド] ペインで [メソッドの作成] をクリックします。 -
[メソッドタイプ] で、[POST] を選択します。
-
[統合タイプ] で、[Lambda 関数] を選択します。
-
[Lambda 関数] で、使用する関数 (
LambdaFunctionOverHttps
) の Amazon リソースネーム (ARN)を選択します。 -
[メソッドの作成] を選択します。
DynamoDB テーブルを作成する
![ステップ 8 DynamoDB テーブルを作成する](images/APIG_tut_steps_8.png)
Lambda 関数が CRUD 操作を実行する空の DynamoDB テーブルを作成します。
DynamoDB テーブルを作成する
-
DynamoDB コンソールで [Tables (テーブル)] ページ
を開きます。 -
[Create table (テーブルの作成)] を選択します。
-
[テーブルの詳細] で、次の操作を行います。
-
[テーブル名] に「
lambda-apigateway
」と入力します。 -
[パーティションキー] に「
id
」と入力し、データ型を [文字列] のままにします。
-
-
[Table settings] (テーブル設定) では、[Default settings] (デフォルト設定) をそのまま使用します。
-
[Create table (テーブルの作成)] を選択します。
API Gateway、Lambda、および DynamoDB の統合をテストする
![ステップ 9 API Gateway、Lambda、および DynamoDB の統合をテストする](images/APIG_tut_steps_9.png)
これで、API Gateway API メソッドの Lambda 関数および DynamoDB テーブルとの統合をテストするための準備が整いました。API Gateway コンソールで、コンソールのテスト機能を使用して POST
メソッドにリクエストを直接送信します。このステップでは、まず create
操作を使用して DynamoDB テーブルに新しい項目を追加し、次に update
操作を使用してその項目を変更します。
テスト 1 DynamoDB テーブルで新しい項目を作成する
-
API Gateway コンソール
で、API ( DynamoDBOperations
) を選択します。 -
DynamoDBManager
リソースの [POST] メソッドを選択します。 -
[テスト] タブを選択します。タブを表示するには、右矢印ボタンを選択する必要がある場合があります。
-
[テストメソッド] では、[クエリ文字列] と [ヘッダー] を空白のままにします。[リクエスト本文] に以下の JSON を貼り付けます。
{ "operation": "create", "payload": { "Item": { "id": "1234ABCD", "number": 5 } } }
-
[テスト] を選択します。
テストが完了したときに表示される結果には、
200
というステータスが表示されるはずです。このステータスコードは、create
操作が正常に実行されたことを示します。それを確認するため、DynamoDB テーブルに新しい項目が含まれていることをチェックします。
-
DynamoDB コンソールで [Tables]
(テーブル) ページを開き、 lambda-apigateway
テーブルを選択します。 -
[Explore table items] (テーブルアイテムの探索) を選択します。[Items returned] (返された項目) ペインに、[id]
1234ABCD
と [number] (番号)5
がある 1 つの項目が表示されるはずです。
テスト 2 DynamoDB テーブルの項目を更新する
-
API Gateway コンソール
で POST メソッドの [テスト] タブに戻ります。 -
[テストメソッド] では、[クエリ文字列] と [ヘッダー] を空白のままにします。[リクエスト本文] に以下の JSON を貼り付けます。
{ "operation": "update", "payload": { "Key": { "id": "1234ABCD" }, "AttributeUpdates": { "number": { "Value": 10 } } } }
-
[テスト] を選択します。
テストが完了したときに表示される結果には、
200
というステータスが表示されるはずです。このステータスコードは、update
操作が正常に実行されたことを示します。それを確認するため、DynamoDB テーブルの項目が変更されていることをチェックします。
-
DynamoDB コンソールで [Tables]
(テーブル) ページを開き、 lambda-apigateway
テーブルを選択します。 -
[Explore table items] (テーブルアイテムの探索) を選択します。[Items returned] (返された項目) ペインに、[id]
1234ABCD
と [number] (番号)10
がある 1 つの項目が表示されるはずです。
API をデプロイする
![ステップ 10 API をデプロイする](images/APIG_tut_steps_10.png)
クライアントが API を呼び出すには、デプロイと関連するステージを作成する必要があります。ステージは、メソッドと統合が含まれる API のスナップショットを表します。
API をデプロイする
-
API Gateway コンソール
の [API] ページを開き、 DynamoDBOperations
API を選択します。 -
API の [リソース] ページで [API のデプロイ] をクリックします。
-
[ステージ] で [*新しいステージ*] をクリックし、[ステージ名] には
test
を入力します。 -
[デプロイ] を選択します。
-
[ステージの詳細] ペインで [URL を呼び出す] をコピーします。これは、HTTP リクエストを使用して関数を呼び出すために、次のステップで使用します。
HTTP リクエストを使用して関数を呼び出すために curl を使用する
![ステップ 11 HTTP リクエストを使用して関数を呼び出す](images/APIG_tut_steps_11.png)
これで、API に HTTP リクエストを発行することで Lambda 関数を呼び出せるようになりました。このステップでは、DynamoDB テーブルに新しい項目を作成してから、それを削除します。
curl を使用して Lambda 関数を呼び出す
-
前のステップでコピーした呼び出し URL を使用して、以下の
curl
コマンドを実行します。-d
(data) オプションと共に curl を使用するときは、自動的に HTTP POST メソッドが使用されます。curl https://
l8togsqxd8.execute-api.us-west-2.amazonaws.com/test
/DynamoDBManager \ -d '{"operation": "create", "payload": {"Item": {"id": "5678EFGH", "number": 15}}}' -
作成操作が正常に実行されたことを確認するには、以下の手順を実行します。
-
DynamoDB コンソールで [Tables]
(テーブル) ページを開き、 lambda-apigateway
テーブルを選択します。 -
[Explore table items] (テーブルアイテムの探索) を選択します。[Items returned] (返された項目) ペインに、[id]
5678EFGH
と [number] (番号)15
がある項目が表示されるはずです。
-
-
以下の
curl
コマンドを実行して、先ほど作成した項目を削除します。独自の呼び出し URL を使用してください。curl https://
l8togsqxd8.execute-api.us-west-2.amazonaws.com/test
/DynamoDBManager \ -d '{"operation": "delete", "payload": {"Key": {"id": "5678EFGH"}}}' 削除操作が正常に実行されたことを確認します。DynamoDB コンソールの [Explore items] (項目を探索) ページにある [Items returned] (返された項目) ペインで、id
5678EFGH
がある項目がテーブル内にないことを確認します。
リソースをクリーンアップする (オプション)
このチュートリアル用に作成したリソースは、保持しない場合は削除できます。使用しなくなった AWS リソースを削除することで、AWS アカウント アカウントに請求される料金の発生を防ぎます。
Lambda 関数を削除するには
-
Lambda コンソールの関数
ページを開きます。 -
作成した関数を選択します。
-
[アクション] で、[削除] を選択します。
-
テキスト入力フィールドに
delete
と入力し、[削除] を選択します。
実行ロールを削除する
-
IAM コンソールのロールページ
を開きます。 -
作成した実行ロールを選択します。
-
[削除] を選択します。
-
テキスト入力フィールドにロールの名前を入力し、[Delete] (削除) を選択します。
API を削除する
-
API Gateway コンソールで API のページ
を開きます。 -
作成した API を選択します。
-
[ Actions] で、[Delete ] を選択します。
-
[削除] を選択します。
DynamoDB テーブルを削除するには
-
DynamoDB コンソールで [Tables (テーブル)] ページ
を開きます。 -
作成したテーブルを選択します。
-
[削除] を選択します。
-
テキストボックスに「
delete
」と入力します。 -
[テーブルの削除] を選択します。