メニュー
Amazon API Gateway
開発者ガイド

Lambda 関数を公開するための API を作成する

AWS Lambda により、サーバーの管理なしに簡単にバックエンドを構築できます。API Gateway と Lambda を一緒に使用すると、サーバーレスウェブアプリケーションの作成とデプロイで強力な機能が得られます。このウォークスルーでは、Lambda 関数と API Gateway API を作成して、ウェブクライアントが Lambda 関数を同期的に呼び出せるようにします。Lambda の詳細について、AWS Lambda Developer Guide を参照してください。Lambda 関数の同期呼び出しの詳細については、「Lambda 関数の API を作成する」を参照してください。

注記

Lambda プロキシ統合のタイプと Lambda 関数を作成するには、「API およびプロキシリソースを通じた Lambda プロキシ統合を作成するLambda 関数によって出力を返す際に確認すべき必要な出力形式」の手順に従ってください。

ステップ 1: 前提条件

ここで説明したタスクを実行する IAM ユーザーに、API Gateway のアクセス権限を付与する必要があります。IAM ユーザーには、Lambda を操作するフルアクセスが必要です。そのためには、AWSLambdaFullAccess (arn:aws:iam::aws:policy/AWSLambdaFullAccess) の管理ポリシーを使用するかカスタマイズして、IAM ユーザーにアタッチできます。詳細については、「API Gateway を使用する準備を整える」を参照してください。IAM ユーザーは、IAM でポリシーとロールを作成できなければなりません。そのためには、IAMFullAccess (arn:aws:iam::aws:policy/IAMFullAccess) の管理ポリシーを使用するかカスタマイズして、ユーザーにアタッチできます。

ステップ 2: API を作成する

このステップでは、MyDemoAPI という新しい API を作成します。新しい API を作成するには、「API を手順を追って構築する」のステップ 1 にある手順に従ってください。

ステップ 3: リソースを作成する

このステップでは、MyDemoResource という名前の新しいリソースを作成します。このリソースを作成するには、「API を手順を追って構築する」のステップ 2 にある手順に従ってください。

ステップ 4: Lambda 関数を作成する

注記

Lambda 関数を作成すると、AWS アカウントに課金される場合があります。

このステップでは、2 つの新しい Lambda 関数を作成します。最初の Lambda 関数である GetHelloWorld は、Amazon CloudWatch への呼び出しを記録し、JSON オブジェクト {"Hello": "World"} を返します。JSON の詳細については、「JSON の入門」を参照してください。

2 番目の Lambda 関数 GetHelloWithName は入力 ("name") を必要とし、CloudWatch への呼び出しを記録して、JSON オブジェクト {"Hello": user-supplied-input-value} を返します。入力値が無い場合、値は "No-Name" になります。

Lambda コンソールを使用して Lambda 関数を作成し、必要な実行ロール/ポリシーを設定します。API Gateway コンソールを使用して API を作成し、API メソッドを Lambda 関数と統合します。API Gateway コンソールでは、必要な Lambda 呼び出しロール/ポリシーを設定します。Swagger から API をインポートする場合など、API Gateway コンソールを使用せずに API をセットアップする場合には、必要に応じて Lambda 関数を呼び出すための API Gateway の呼び出しロール/ポリシーを明示的に作成し、設定する必要があります。Lambda 呼び出しと API Gateway API の実行ロールの設定の詳細については、「IAM アクセス権限の使用」を参照してください。Lambda の詳細については、「AWS Lambda Developer Guide」を参照してください。

GetHelloWorld Lambda 関数を作成する

  1. https://console.aws.amazon.com/lambda/ にある AWS Lambda コンソールを開きます。

  2. 次のいずれかを行ってください。

    • ウェルカムページが表示される場合は、[Get Started Now] を選択します。

    • [Lambda: Functions] ページが表示される場合は、[Create a Lambda function] を選択します。

  3. [Select blueprint] で、nodejshello-world 設計図を選択します。設計図を選択するには、検索フィルタとして「Hello」と入力しなければならない場合があります。

  4. [Configure triggers] ペインで、[Next] を選択します。

  5. [Name] に、「GetHelloWorld」と入力します。

  6. [Description] に「Returns {"Hello":"World"}」と入力します。

  7. [Runtime] で [Node.js 4.3] を選択します。

  8. [Lambda function code] で、インラインコードエディターを使ってデフォルトのコードステートメントを次のように置き換えます。

    Copy
    'use strict'; console.log('Loading event'); exports.handler = function(event, context, callback) { console.log('"Hello":"World"'); callback(null, {"Hello":"World"}); // SUCCESS with message };

    ヒント

    Node.js 4.3 で書かれた前述の Lambda 関数では、console.log メソッドが Amazon CloudWatch ログに情報を書き込みます。event パラメーターには、関数への入力が含まれます。context パラメーターには、実行コンテキストと callback コールバック関数が含まれています。Lambda 関数を正常に返すためには、callback(null, result) を呼び出して関数を終了します。エラーメッセージを返すには、終了時に callback(error) を呼び出します。Lambda 関数コードを書き込む方法の詳細については、AWS Lambda: How it Works の「モデルのプログラミング」とAWS Lambda 開発者ガイド のサンプル演習を参照してください。

  9. [Lambda function handler and role] では、[Handler] はデフォルトの index.handler のままにします。

  10. [Role] では、Create new role from template(s) を選択します。

    1. [Role name] で、自分のロールの名前 (execute_my_lambda など) を入力します。

    2. [Policy templates] では、Simple Microservice permissions を選択します。

    ヒント

    既存の IAM ロールを使用するには、[Role] でChoose an existing role を選択し、次に既存のロールのドロップダウンリストからいずれかを選択します。カスタムロールを作成する場合は、Create a Custom Role を選択し、そこで表示される手順に従ってください。

  11. [Advanced settings] の設定はデフォルトのままにしておきます。

  12. [Next] を選択します。

  13. [Create function] を選択します。

    この関数を作成した AWS リージョンをメモしておきます。これは、後で必要になります。

  14. 新しく作成された関数をテストするには、[Actions] を選択し、[Configure test event] を選択することをお勧めします。

  15. [Input test event] で、デフォルトのコードステートメントを次のように置き換え、[Save and test] を選択します。

    Copy
    { }

    ヒント

    この関数は入力を使用しません。したがって、入力として空の JSON オブジェクトを提供します。

  16. [Test] を選択して関数を呼び出します。[Execution result] セクションには {"Hello": "World"} と表示されます。この出力は CloudWatch ログにも書き込まれます。

IAM コンソールを使用して、Lambda 関数と共に作成された IAM ロール (execute_my_lambda) を表示することができます。この IAM ロールには、次のインラインポリシーがアタッチされます。このポリシーにより、任意の CloudWatch リソースで CloudWatch の CreateLogGroupCreateLogStreams、および PutLogEvents アクションを呼び出す AWS アカウントのアクセス権限がユーザーに付与されます。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:*" } ] }

この IAM ロールの信頼済みエンティティは lambda.amazonaws.com で、これには次の信頼関係があります。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

この信頼関係とインラインポリシーの組み合わせにより、ユーザーは Lambda 関数を呼び出し、Lambda 関数はサポートされている CloudWatch アクションをユーザーに代わって呼び出すことができます。

GetHelloWithName Lambda 関数を作成する

  1. [Lambda > Functions] リストに戻り、入力値を取る次の Lambda 関数を作成します。

  2. [Create a Lambda function] を選択します。

  3. [Select blueprint] で、nodejshello-world 設計図を選択します。

  4. [Name] に、「GetHelloWithName」と入力します。

  5. [Description] に「{"Hello":", a user-provided string, and "} を返す。」と入力します。

  6. [Runtime] で [Node.js 4.3] を選択します。

  7. コードエディターで、[Lambda function code] のデフォルトのコードステートメントを次のように置き換えます。

    Copy
    'use strict'; console.log('Loading event'); exports.handler = function(event, context, callback) { var name = (event.name === undefined ? 'No-Name' : event.name); console.log('"Hello":"' + name + '"'); callback(null, {"Hello":name}); // SUCCESS with message };
  8. [Lambda function handler and role] では、[Handler] はデフォルトの index.handler のままにします。

  9. [Role] で、[Use existing role]を選択し、次に既存のロールのドロップダウンリストから以前作成した execute_my_lambda を選択します。

  10. [Advanced settings] はデフォルト値のままにします。続いて、[Next] を選択します。

  11. [Create function] を選択します。

    この関数を作成した AWS リージョンをメモしておきます。これは、後で必要になります。

  12. この新しく作成された関数をテストするには、[Actions] を選択し、[Configure test event] を選択します。

  13. [Input test event] で、デフォルトのコードステートメントを次のように置き換え、[Save and test] を選択します。

    Copy
    { "name": "User" }

    ヒント

    関数は event.name を呼び出して入力名を読み取ります。上記の入力の場合、{"Hello": "User"} が返されることが予期されます。

    この関数で、関数の [Input test event] から "name": "User" を削除し、もう一度 [Save and test] を選択してみます。Lambda コンソールの [Execution result] の下と、CloudWatch ログに {"Hello": "No-Name"} という出力が表示されます。

ステップ 5: GET メソッドを作成してテストする

API Gateway コンソールに切り替えます。このステップでは、GET メソッドを作成し、Lambda で GetHelloWorld 関数に接続した後、テストします。主に GET メソッドを使用して、リソース形式の取得または読み取りを行います。成功すると、GET メソッドは JSON 形式のオブジェクトを返します。

GET メソッドを作成およびテストする

  1. API Gateway コンソールで、[APIs] の [MyDemoAPI] を選択します。

  2. [Resources] ペインで、[/mydemoresource] を選択します。[Actions] の [Create Method] を選択します。HTTP メソッドのドロップダウンリストから [GET] を選択し、チェックマークを選択してこのメソッドを作成します。

  3. GET メソッドの [Setup] ペインの [Integration type] で、[Lambda Function] を選択します。[Lambda Region] で、Lambda 関数を作成したリージョン (us-east-1 など) を選択します。[Lambda Function] で、「GetHelloWorld」と入力します。[Save] を選択して、このメソッドの統合リクエストの設定を終了します。

    リージョン名と識別子のリストについては、Amazon Web Services 全般的なリファレンスAWS Lambda」を参照してください。

     MyDemoResource で GET を統合して GetHelloWorld Lambda 関数を呼び出します
  4. [Add Permission to Lambda Function] で、[OK] を選択します。

  5. [Method Execution] ペインの [Client] ボックスで、[TEST] を選択してから、[Test] ボタンを選択します。成功すると、[Response Body] に次の内容が表示されます。

    Copy
    { "Hello": "World" }

デフォルトでは、API Gateway は API 発信者からのリクエストをそのまま渡します。今回作成した GET メソッドの呼び出しでは、HEAD メソッドの呼び出しと同様に、デフォルトで空の JSON リクエストペイロードを Lambda 関数で受け取り、レスポンスペイロードを変更せずに Lambda 関数から返します。

次のステップでは、POST メソッドの呼び出しを作成します。POST および PUT メソッドの呼び出しでは、Lambda 関数が入力イベントとして受け取る JSON 型式のリクエスト本文で渡すことができます。必要に応じて、API Gateway でマッピングテンプレートを使用することで、Lambda 関数への入力を変換できます。

ステップ 6: POST メソッドを作成してテストする

このステップでは、新しい POST メソッドを作成し、Lambda で GetHelloWithName 関数に接続した後、テストします。成功した POST メソッドは通常、新しく作成されたリソースの URI を発信者に返します。この演習では、POST メソッドは単に JSON 形式のオブジェクトを返します。

POST メソッドを作成およびテストする

  1. [Resources] ペインで、[/mydemoresource] を選択してから [Create Method] を選択します。

  2. HTTP メソッドで [POST] を選択した後、チェックマークを選択して保存します。

  3. [Setup] ペインの [Integration Type] で、[Lambda Function] を選択します。

  4. [Lambda Region] で、GetHelloWithName Lambda 関数を作成したリージョン名に対応するリージョン識別子を選択します。

  5. [Lambda Function] に、「GetHelloWithName」を入力して [Save] を選択します。

  6. Lambda 関数を呼び出すための API Gateway 権限を付与するように求められたら、[OK] を選択します。

  7. [Method Execution] ペインの [Client] ボックスで、 [TEST] を選択します。[Request Body] を展開し、次を入力します。

    Copy
    { "name": "User" }
  8. [Test] を選択します。成功すると、[Response Body] に次の内容が表示されます。

    Copy
    { "Hello": "User" }
  9. ["name": "User"] を削除することで [Request Body] を変更して中括弧 ({ }) のみを残し、再度 [Test] を選択します。成功すると、[Response Body] に次の内容が表示されます。

    Copy
    { "Hello": "No-Name" }

API Gateway コンソールで支援される Lambda 関数の統合では、Lambda に AWSサービスプロキシ統合タイプが使用されます。このタイプでは、必須の Lambda 関数呼び出し URI や呼び出しロールなどを API 開発者に変わって設定して、API メソッドを Lambda 関数に統合するプロセスを合理化します。

ここで説明する GET メソッドおよび POST メソッドはいずれも、バックエンドで POST リクエストと統合されます。

Copy
POST /2015-03-31/functions/FunctionArn/invocations?Qualifier=Qualifier HTTP/1.1 X-Amz-Invocation-Type: RequestReponse ... Content-Type: application/json Content-Length: PayloadSize Payload

X-Amz-Invocation-Type: RequestReponse ヘッダーは、Lambda 関数を同期的に呼び出すことを指定します。FunctionArnarn:aws:lambda:region:account-id:function:FunctionName 形式です。このウォークスルーでは、コンソールは GET メソッドリクエストに対して FunctionNameGetHelloWorld として設定し、メソッドのテスト呼び出しを行うと空の JSON ペイロードを提供します。POST メソッドの場合、コンソールは FunctionNameGetHelloWithName として設定し、呼び出し元が指定したメソッドリクエストペイロードを統合リクエストに渡します。AWS サービスプロキシの統合により、メソッドの作成および設定の完全な制御を直接回復することができます。詳細については、「Lambda 関数の API を作成する」を参照してください。

ステップ 7: API をデプロイする

これまでのステップで、API をデプロイして API Gateway コンソール外に呼び出せるようになりました。このステップでは、ステージを作成します。API Gateway では、ステージは、API デプロイがアクセス可能なパススルーを定義します。たとえば、test ステージを定義して API をデプロイすることで、.../test/MyDemoAPI で終わる URI からリソース名 MyDemoAPI にアクセスできるようになります。

API をデプロイする

  1. [APIs] ペインから API を選択するか、[Resources] ペインからリソースまたはメソッドを選択します。[Actions] ドロップダウンメニューから [Deploy API] を選択します。

  2. [Deployment stage] で、[New Stage] を選択します。

  3. [Stage name] に、「test」を入力します。

    注記

    入力は UTF-8 でエンコードされた (ローカライズされていない) テキストである必要があります。

  4. [Stage description] に、「test」と入力します。

  5. [Deployment description] に、「Lambda 関数呼び出しの演習」と入力します。

  6. [Deploy] を選択します。

ステップ 8: API をテストする

このステップでは、API Gateway コンソール外で、デプロイした API の GET メソッドと POST メソッドを呼び出します。

GET-on-mydemoresource メソッドをテストするには

  1. [Stage Editor] ペインで、[Invoke URL] から URL をクリップボードにコピーします。次のように表示されます。

    Copy
    https://my-api-id.execute-api.region-id.amazonaws.com/test
  2. 別のウェブブラウザタブまたはウィンドウで、アドレスボックスに URL を貼り付けます。URL の末尾に、リソースへのパスを付加します (/mydemoresource)。URL 次のように表示されます。

    Copy
    https://my-api-id.execute-api.region-id.amazonaws.com/test/mydemoresource
  3. この URL を参照します。GET メソッドが正常に呼び出されると、ウェブページが表示されます。

    Copy
    {"Hello":"World"}

POST-on-mydemoresource メソッドをテストするには

  1. ウェブブラウザのアドレスバーでは、POST メソッドリクエストはテストできません。代わりに、PostmancURL コマンドラインツールなど、高度な REST API クライアントを使用します。

  2. POST メソッドリクエストを前の手順の URL に送信します。URL 次のように表示されます。

    Copy
    https://my-api-id.execute-api.region-id.amazonaws.com/test/mydemoresource

    リクエストヘッダーに必ず次のヘッダーを追加してください。

    Copy
    Content-Type: application/json

    また、リクエスト本文に必ず次のコードを追加してください。

    Copy
    { "name": "User" }

    たとえば、cURL コマンドラインツールを使用する場合は、次のようなコマンドを実行します。

    Copy
    curl -H "Content-Type: application/json" -X POST -d "{\"name\": \"User\"}" https://my-api-id.execute-api.region-id.amazonaws.com/test/mydemoresource

    POST メソッドが正常に呼び出されると、応答には次のものが含まれます。

    Copy
    {"Hello":"User"}

ステップ 9: クリーンアップ

この演習で作成した Lambda 関数が不要になった場合は、削除できます。さらに、関数に付随する IAM リソースを削除できます。

警告

このシリーズの他の演習を行う予定の場合は、Lambda 実行ロールまたは Lambda 呼び出しロールを削除しないでください。API が依存する Lambda 関数を削除すると、API は機能しなくなります。Lambda 関数の削除は元に戻すことができません。再度 Lambda 関数を使用するには、関数を再度作成する必要があります。

Lambda 関数が依存する IAM リソースを削除すると、Lambda 関数は機能しなくなります。また、同関数に依存する API は機能しなくなります。IAM リソースの削除は元に戻すことができません。再度 IAM 関数を使用するには、関数を再度作成する必要があります。

Lambda 関数を削除する

  1. AWS マネジメントコンソール にサインインし、https://console.aws.amazon.com/lambda/ にある AWS Lambda コンソールを開きます。

  2. 関数の一覧から [GetHelloWorld] を選択し、[Actions]、[Delete function] の順に選択します。プロンプトが表示されたら、再度 [Delete] を選択します。

  3. 関数の一覧から [GetHelloWithName] を選択し、[Actions]、[Delete function] の順に選択します。プロンプトが表示されたら、再度 [Delete] を選択します。

関連付けられた IAM リソースを削除する

  1. https://console.aws.amazon.com/iam/ にある IAM コンソールを開きます。

  2. [Details] から [Roles] を選択します。

  3. ロールの一覧から [APIGatewayLambdaExecRole] を選択し、[Role Actions]、[Delete Role] の順に選択します。プロンプトが表示されたら、[Yes, Delete] を選択します。

  4. [Details] から、[Policies] を選択します。

  5. ポリシーの一覧から [APIGatewayLambdaExecPolicy] を選択し、[Policy Actions]、[Delete] の順に選択します。プロンプトが表示されたら、[Delete] を選択します。

この演習はこれで終了です。

次のステップ

次のウォークスルーに進むことをお勧めします。次のウォークスルーでは、メソッドリクエストから統合リクエストに、統合レスポンスからメソッドレスポンスにヘッダーパラメーターをマッピングする方法を示しています。HTTP プロキシ統合を使用して、API をバックエンドの HTTP エンドポイントに接続します。

API Gatewayの詳細については、「Amazon API Gateway とは?」を参照してください。REST の詳細については、RESTful ウェブサービス: チュートリアル 参照してください。