チュートリアル: API Gateway で Lambda を使用する
このチュートリアルでは、HTTP リクエストを使用して Lambda 関数を呼び出す REST API を作成します。Lambda 関数は、DynamoDB テーブルで作成、読み取り、更新、および削除 (CRUD) 操作を実行します。このチュートリアルで提供される関数はデモ用ですが、任意の Lambda 関数を呼び出すことができる API Gateway REST API を設定する方法を学びます。
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 をインストール
許可ポリシーを作成する
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
」と入力します。 -
[ポリシーの作成] を選択します。
実行ロールを作成する
実行ロールとは、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) をコピーします。
関数を作成する
以下のコード例は、作成される DynamoDB テーブルで実行する操作と、いくつかのペイロードデータを指定する、API Gateway からのイベント入力を受け取ります。関数が受け取るパラメータが有効な場合、リクエストされた操作をテーブルで実行します。
AWS CLI を使用して関数を呼び出す
関数を 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 を作成する
このステップでは、Lambda 関数を呼び出すために使用する API Gateway REST API を作成します。
API を作成するには
-
API Gateway コンソール
を開きます。 -
[Create API] を選択します。
-
[REST API] ボックスで、[構築] を選択します。
-
[API の詳細] で [新しい API] を選択したままにし、[API 名] には
DynamoDBOperations
と入力します。 -
API の作成 を選択します。
REST API でリソースを作成する
API に HTTP メソッドを追加するには、まずそのメソッドが操作を実行するリソースを作成する必要があります。ここでは、DynamoDB テーブルを管理するためのリソースを作成します。
リソースを作成する
-
API Gateway コンソール
の API の [リソース] ページで、[リソースの作成] をクリックします。 -
[リソースの詳細] の [リソース名] に、
DynamoDBManager
と入力します。 -
[リソースの作成] を選択します。
HTTP POST メソッドを作成する
このステップでは、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 テーブルを作成する
Lambda 関数が CRUD 操作を実行する空の DynamoDB テーブルを作成します。
DynamoDB テーブルを作成する
-
DynamoDB コンソールで [Tables (テーブル)] ページ
を開きます。 -
[Create table (テーブルの作成)] を選択します。
-
[テーブルの詳細] で、次の操作を行います。
-
[テーブル名] に
lambda-apigateway
と入力します。 -
[パーティションキー] に「
id
」と入力し、データ型を [文字列] のままにします。
-
-
[Table settings] (テーブル設定) では、[Default settings] (デフォルト設定) をそのまま使用します。
-
[Create table (テーブルの作成)] を選択します。
API Gateway、Lambda、および DynamoDB の統合をテストする
これで、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 をデプロイする
クライアントが API を呼び出すには、デプロイと関連するステージを作成する必要があります。ステージは、メソッドと統合が含まれる API のスナップショットを表します。
API をデプロイする
-
API Gateway コンソール
の [API] ページを開き、 DynamoDBOperations
API を選択します。 -
API の [リソース] ページで [API のデプロイ] をクリックします。
-
[ステージ] で [*新しいステージ*] をクリックし、[ステージ名] には
test
を入力します。 -
[デプロイ] を選択します。
-
[ステージの詳細] ペインで [URL を呼び出す] をコピーします。これは、HTTP リクエストを使用して関数を呼び出すために、次のステップで使用します。
HTTP リクエストを使用して関数を呼び出すために curl を使用する
これで、API に HTTP リクエストを発行することで Lambda 関数を呼び出せるようになりました。このステップでは、DynamoDB テーブルに新しい項目を作成してから、その項目でオペレーションの読み取り、更新、削除を実行します。
curl を使用して DynamoDB テーブルに項目を作成するには
-
前のステップでコピーした呼び出し URL を使用して、以下の
curl
コマンドを実行します。-d
(data) オプションと共に curl を使用するときは、自動的に HTTP POST メソッドが使用されます。curl https://
l8togsqxd8.execute-api.us-east-2.amazonaws.com/test
/DynamoDBManager \ -d '{"operation": "create", "payload": {"Item": {"id": "5678EFGH", "number": 15}}}'オペレーションが成功すると、HTTP ステータスコードが 200 のレスポンスが返されます。
-
また、次の操作を実行して、DynamoDB コンソールを使用して新しい項目がテーブルにあることを確認できます。
-
DynamoDB コンソールで [Tables]
(テーブル) ページを開き、 lambda-apigateway
テーブルを選択します。 -
[Explore table items] (テーブルアイテムの探索) を選択します。[Items returned] (返された項目) ペインに、[id]
5678EFGH
と [number] (番号)15
がある項目が表示されるはずです。
-
curl を使用して DynamoDB テーブルの項目を読み取るには
-
以下の
curl
コマンドを実行して、先ほど作成した項目の値を読み取ります。独自の呼び出し URL を使用してください。curl https://
avos4dr2rk.execute-api.us-east-2.amazonaws.com/test
/DynamoDBManager -d \ '{"operation": "read", "payload": {"Key": {"id": "5678EFGH"}}}'Node.js 関数コード、または Python 関数コードのどちらを選択したかに応じて、次のいずれかの出力が表示されます。
curl を使用して DynamoDB テーブルの項目を更新するには
-
以下の
curl
コマンドを実行して、number
の値を変更し、先ほど作成した項目を更新します。独自の呼び出し URL を使用してください。curl https://
avos4dr2rk.execute-api.us-east-2.amazonaws.com/test
/DynamoDBManager \ -d '{"operation": "update", "payload": {"Key": {"id": "5678EFGH"}, "UpdateExpression": "SET #num = :new_value", "ExpressionAttributeNames": {"#num": "number"}, "ExpressionAttributeValues": {":new_value": 42}}}' -
項目の
number
の値が更新されたことを確認するには、別の読み取りコマンドを実行します。curl https://
avos4dr2rk.execute-api.us-east-2.amazonaws.com/test
/DynamoDBManager \ -d '{"operation": "read", "payload": {"Key": {"id": "5678EFGH"}}}'
curl を使用して DynamoDB テーブルの項目を削除するには
-
以下の
curl
コマンドを実行して、先ほど作成した項目を削除します。独自の呼び出し URL を使用してください。curl https://
l8togsqxd8.execute-api.us-east-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
」と入力します。 -
[テーブルの削除] を選択します。