チュートリアル: API Gateway で Lambda を使用する
このチュートリアルでは、Amazon API Gateway を使用して REST API とリソース(DynamoDBManager
) を作成します。リソースで 1 つのメソッド (POST
) を定義し、POST
メソッドをバックアップする Lambda 関数 (LambdaFunctionOverHttps
) を作成します。こうすると、HTTPS エンドポイントから API を呼び出したときに API Gateway が Lambda 関数を呼び出します。
DynamoDBManager
リソースで定義する POST
メソッドでは、以下の Amazon DynamoDB オペレーションがサポートされます。
-
項目を作成、更新、削除する。
-
項目を読み取る。
-
項目をスキャンする。
-
テストに使用できる、DynamoDB に関連していないその他のオペレーション (echo、ping)。
API Gateway で Lambda を使用すると、次のような高度な機能も使用できます。
-
フルリクエストパススルー – Lambda プロキシ (
AWS_PROXY
) 統合タイプを使用して、Lambda 関数で (リクエストボディだけでなく) HTTP リクエスト全体を受信し、(レスポンスボディだけでなく) HTTP レスポンスを設定できます。 -
キャッチオールメソッド –
ANY
キャッチオールメソッドを使用して、API リソースのすべてのメソッドを単一のマッピングで単一の Lambda 関数にマッピングできます。 -
キャッチオールリソース - greedy パス変数 (
{proxy+}
) を使用して、リソースのすべてのサブパスを Lambda 関数にマッピングできます。追加設定は必要ありません。
これらの API Gateway の機能の詳細については、API Gateway デベロッパーガイドの「プロキシリソースとのプロキシ統合を設定する」を参照してください。
セクション
前提条件
このチュートリアルでは、基本的な Lambda オペレーションと Lambda コンソールについてある程度の知識があることを前提としています。初めての方は、コンソールで Lambda の関数の作成 の手順に従って最初の Lambda 関数を作成してください。
次のステップを完了するには、コマンドを実行するコマンドラインターミナルまたはシェルが必要です。コマンドと予想される出力は、別々のブロックにリストされます。
aws --version
次のような出力が表示されます。
aws-cli/2.0.57 Python/3.7.4 Darwin/19.6.0 exe/x86_64
コマンドが長い場合、コマンドを複数行に分割するためにエスケープ文字 (\
) が使用されます。
Linux および macOS では、任意のシェルとパッケージマネージャーを使用します。Windows 10 では、Linux 用の Windows サブシステムをインストール
実行ロールを作成する
実行ロールを作成します。この AWS Identity and Access Management (IAM) ロールは、カスタムポリシーを使用して、必要な AWS リソースにアクセスするためのアクセス許可を Lambda 関数に付与します。最初にポリシーを作成してから、実行ロールを作成する必要があります。
カスタムポリシーを作成するには
-
IAM コンソールの [Policies (ポリシー)]
ページを開きます。 -
[Create Policy (ポリシーの作成)] を選択します。
-
[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" } ] }
このポリシーには、関数が DynamoDB と Amazon CloudWatch Logs にアクセスするためのアクセス許可が含まれます。
-
[Next: Tags (次へ: タグ)] を選択します。
-
[次へ: レビュー] を選択します。
-
[ポリシーの確認] でポリシーの [名前] に「
lambda-apigateway-policy
」と入力します。 -
[Create policy] を選択します。
実行ロールを作成する
-
IAM コンソールの [ロール] ページ
を開きます。 -
[ロールの作成] を選択します。
-
[信頼されたエンティティの種類を選択] で、[AWS サービス] を選択します。
-
ユースケースに [Lambda] を選択します。
-
[Next: Permissions (次へ: アクセス許可)] を選択します。
-
ポリシー検索ボックスに、「
lambda-apigateway-policy
」と入力します。 -
検索結果で、作成したポリシー (
lambda-apigateway-policy
) を選択し、[次のステップ: タグ] を選択します。 -
次へ: レビューを選択します。
-
[確認] の [ロール名] に「
lambda-apigateway-role
」と入力します。 -
[ロールの作成] を選択します。
-
[ロール] ページで、作成したロールの名前 (
lambda-apigateway-role
) を選択します。 -
[概要] ページで、[ロール ARN] をコピーします。これは、このチュートリアルの後半で必要になります。
関数を作成する
以下のコード例では、API Gateway イベント入力を受け取り、その入力に含まれるメッセージを処理します。例示のため、このコードでは受信イベントデータの一部を CloudWatch Logs に書き込みます。
関数をテストする
次のサンプルイベントデータを使用して、手動で Lambda 関数をテストします。関数は、invoke
AWS CLI コマンドまたは Lambda コンソールを使用して呼び出すことができます。
Lambda 関数をテストするには (AWS CLI)
-
次の 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
AWS CLI バージョン 2 を使用している場合、cli-binary-format オプションが必要です。このオプションは、AWS CLI 設定ファイルで設定することもできます。
-
outputfile.txt
ファイルで出力を確認します。
API Gateway を使用して REST API を作成する
このセクションでは、1つのリソース (DynamoDBManager
) と 1 つのメソッド (POST
) を含む API Gateway REST API (DynamoDBOperations
) を作成します。POST
メソッドを Lambda 関数に関連付けます。次に、設定をテストします。
API メソッドが HHTTP リクエストを受け取ると、API Gateway は Lambda 関数を呼び出します。
API を作成する
以下の手順では、API Gateway コンソールを使用して DynamoDBOperations
REST API を作成します。
API を作成するには
-
API Gateway コンソール
を開きます。 -
[Create API] を選択します。
-
[REST API] ボックスで、[構築] を選択します。
-
[Create new API (新しい API の作成)] で、[New API (新しい API)] を選択します。
-
[設定] で、次のいずれかを実行します。
-
[API 名] に「
DynamoDBOperations
」と入力します。 -
[エンドポイントタイプ] で、[リージョン] を選択します。
-
-
API の作成 を選択します。
API でリソースを作成する
以下のステップでは、DynamoDBManager
という名前のリソースを REST API に作成します。
リソースを作成するには
-
API Gateway コンソール
] の API の [リソース] ツリーでルート ( /
) レベルが強調表示されていることを確認します。[アクション] メニューで、[リソースの作成] を選択します。 -
[新しい子リソース] で、次の作業を行います。
-
[Resource Name (リソース名)] に
DynamoDBManager
と入力します。 -
[リソースパス] は
/dynamodbmanager
のままにします。
-
-
[リソースの作成] を選択します。
リソースに POST メソッドを作成する
以下のステップでは、前のセクションで作成した DynamoDBManager
リソースに POST
メソッドを作成します。
メソッドを作成するには
-
API Gateway コンソール
] の API の [リソース] ツリーで /dynamodbmanager
が強調表示されていることを確認します。[アクション]、[メソッドの作成] の順に選択します。 -
/dynamodbmanager
の下に表示される小さなドロップダウンメニューで [POST
] を選択し、チェックマークアイコンを選択します。 -
メソッドの[セットアップ] ペインで、次の操作を行います。
-
[Integration type (統合タイプ)] で、[Lambda Function (Lambda 関数)] を選択します。
-
[Lambda リージョン]で、Lambda 関数と同じ AWS リージョンを選択します。
-
[Lambda 関数] に関数の名前 (
LambdaFunctionOverHttps
) を入力します。 -
[デフォルトのイムアウトの使用] を選択します。
-
[Save] を選択します。
-
-
[Lambda 関数に権限を追加する] ダイアログボックスで、[OK] を選択します。
DynamoDB テーブルの作成
Lambda 関数が使用する DynamoDB テーブルを作成します。
DynamoDB テーブルを作成するには
-
DynamoDB コンソールで [Tables (テーブル)] ページ
を開きます。 -
[Create table] (テーブルの作成) を選択します。
-
[テーブルの詳細] で、次の操作を行います。
-
[テーブル名] に「
lambda-apigateway
」と入力します。 -
[パーティションキー] に「
id
」と入力し、データ型を [文字列] のままにします。
-
-
[設定] は [デフォルト設定] のままにします。
-
[Create table] (テーブルの作成) を選択します。
セットアップをテストする
これで設定をテストする準備ができました。リクエストは、API Gateway コンソールから POST
メソッドに直接送信できます。このステップでは、create
オペレーションの後に update
オペレーションを使用します。
DynamoDB テーブルに項目を作成するには
Lambda 関数では、create
オペレーションを使用して DynamoDB テーブル内に項目を作成できます。
-
API Gateway コンソール
で、REST API の名前 ( DynamoDBOperations
) を選択します。 -
[リソース] ツリーで、
/dynamodbmanager
の下のPOST
メソッドを選択します。 -
[メソッドの実行] ペインの [クライアント] ボックスで、[テスト] を選択します。
-
[メソッドテスト] ペインで、[クエリ文字列] と [ヘッダー] を空のままにします。[リクエスト本文] に以下の JSON を貼り付けます。
{ "operation": "create", "tableName": "lambda-apigateway", "payload": { "Item": { "id": "1234ABCD", "number": 5 } } }
-
[Test] (テスト) を選択します。
テスト結果に create
オペレーションが成功したことを示すステータス (200
) が表示されます。DynamoDB テーブルに "id":
"1234ABCD"
と "number": "5"
を含む項目が含まれていることを確認します。
DynamoDB テーブルの項目を更新するには
update
オペレーションを使用してテーブル内の項目を更新することもできます。
-
API Gateway コンソール
で POST メソッドの [メソッドテスト] ペインに戻ります。 -
[メソッドテスト] ペインで、[クエリ文字列] と [ヘッダー] を空のままにします。[リクエスト本文] に以下の JSON を貼り付けます。
{ "operation": "update", "tableName": "lambda-apigateway", "payload": { "Key": { "id": "1234ABCD" }, "AttributeUpdates": { "number": { "Value": 10 } } } }
-
[Test] (テスト) を選択します。
テスト結果に update
オペレーションが成功したことを示すステータス (200
) が表示されます。かくにDynamoDB テーブルに "id":
"1234ABCD"
と "number": "10"
を含む更新済みの項目が含まれていることを確認します。
リソースのクリーンアップ
このチュートリアル用に作成したリソースは、保持を希望しない場合、すぐに削除できます。使用しなくなった AWS リソースを削除することで、AWS アカウントに請求される料金が発生しないようにできます。
Lambda 関数を削除するには
-
Lambda コンソールの [Functions
] (関数) ページを開きます。 -
作成した関数を選択します。
-
[アクション] を選択してから、[削除] をクリックします。
-
[削除] を選択します。
実行ロールを削除するには
-
IAM コンソールの [Roles (ロール)] ページ
を開きます。 -
作成した実行ロールを選択します。
-
[ロールの削除] を選択します。
-
[はい、削除します] を選択します。
API を削除するには
-
API Gateway コンソールで API のページ
を開きます。 -
作成した API を選択します。
-
[ Actions] で、[Delete ] を選択します。
-
[削除] を選択します。
DynamoDB テーブルを削除するには
-
DynamoDB コンソールで [Tables (テーブル)] ページ
を開きます。 -
作成したテーブルを選択します。
-
[削除] を選択します。
-
テキストボックスに「
delete
」と入力します。 -
[削除] を選択します。