チュートリアル: Lambda プロキシ統合を使用した Hello World REST API の構築
Lambda プロキシ統合は、軽量で柔軟な API Gateway API 統合タイプであり、これを使用すると、API メソッドまたは API 全体を Lambda 関数と統合できます。Lambda 関数は、Lambda がサポートする任意の言語で記述できます。これはプロキシ統合であるため、API を再デプロイする必要がなく、いつでも Lambda 関数の実装を変更できます。
このチュートリアルでは、以下の作業を行います。
-
「Hello, World!」 Lambda 関数を API のバックエンドにします。
-
「Hello, World!」 Lambda プロキシ統合による API。
「Hello, World!」 Lambda 関数
この関数は、次の形式で JSON オブジェクトとして発信者に挨拶を返します。
{ "greeting": "Good
{time}
,{name}
of{city}
.[ Happy{day}
!]" }
「Hello, World!」 Lambda コンソールで Lambda 関数を作成します。
Lambda コンソール (https://console.aws.amazon.com/lambda/
) にサインインします。 -
AWS ナビゲーションバーで、[region (リージョン)] を選択します (米国東部 (バージニア北部) など)。
注記
Lambda 関数を作成したリージョンを書き留めます。これは、API を作成するときに必要になります。
-
ナビゲーションペインで、[関数] を選択します。
-
[関数の作成] を選択します。
-
Author from scratch を選択します。
-
[基本的な情報] で、以下の作業を行います。
-
[関数名] に
GetStartedLambdaProxyIntegration
と入力します。 -
[Permissions (アクセス許可)] で、[実行ロールの選択または作成] を選択します。[Execution role] (実行ロール) ドロップダウンリストから、[Create new role from AWS policy templates] (AWS ポリシーテンプレートから新しいロールを作成) を選択します。
-
[ロール名] に
GetStartedLambdaBasicExecutionRole
と入力します。 -
[Policy templates] フィールドは空白のままにします。
-
[関数の作成] を選択します。
-
-
インラインコードエディタの [Function code (関数コード)] に、以下のコードをコピーして貼り付けます。
'use strict'; console.log('Loading hello world function'); export const handler = async (event) => { let name = "you"; let city = 'World'; let time = 'day'; let day = ''; let responseCode = 200; console.log("request: " + JSON.stringify(event)); if (event.queryStringParameters && event.queryStringParameters.name) { console.log("Received name: " + event.queryStringParameters.name); name = event.queryStringParameters.name; } if (event.queryStringParameters && event.queryStringParameters.city) { console.log("Received city: " + event.queryStringParameters.city); city = event.queryStringParameters.city; } if (event.headers && event.headers['day']) { console.log("Received day: " + event.headers.day); day = event.headers.day; } if (event.body) { let body = JSON.parse(event.body) if (body.time) time = body.time; } let greeting = `Good ${time}, ${name} of ${city}.`; if (day) greeting += ` Happy ${day}!`; let responseBody = { message: greeting, input: event }; // The output from a Lambda proxy integration must be // in the following JSON object. The 'headers' property // is for custom response headers in addition to standard // ones. The 'body' property must be a JSON string. For // base64-encoded payload, you must also set the 'isBase64Encoded' // property to 'true'. let response = { statusCode: responseCode, headers: { "x-custom-header" : "my custom header value" }, body: JSON.stringify(responseBody) }; console.log("response: " + JSON.stringify(response)) return response; };
-
[デプロイ] を選択します。
「Hello, World!」 API
ここで、「Hello, World!」に API を作成します。API Gateway コンソールを使用して Lambda 関数を実行します。
「Hello, World!」API を API
https://console.aws.amazon.com/apigateway
で API Gateway コンソールにサインインします。 -
API Gateway を初めて使用する場合は、サービスの特徴を紹介するページが表示されます。[REST API] で、[構築] を選択します。[Create Example API (サンプル API の作成)] がポップアップ表示されたら、[OK] を選択します。
API Gateway を使用するのが初めてではない場合、[API を作成)] を選択します。[REST API] で、[構築] を選択します。
-
以下の手順で空の API を作成します。
-
[Create new API (新しい API の作成)] で、[New API (新しい API)] を選択します。
-
[Settings (設定)] で以下のように設定します。
-
[API 名] に「
LambdaSimpleProxy
」と入力します。 -
必要に応じて、[Description (説明)] フィールドに説明を入力します。それ以外の場合は空のままにします。
-
[Endpoint Type (エンドポイントタイプ)] を [Regional (リージョン別)] に設定したままにします。
-
-
[Create API] を選択します。
-
-
helloworld
リソースを以下のように作成します。-
[Resources (リソース)] ツリーのルートリソース (/) を選択します。
-
[Actions (アクション)] ドロップダウンメニューから [Create Resource (リソースの作成)] を選択します。
-
[Configure as proxy resource (プロキシリソースとして設定)] チェックボックスはオフのままにします。
-
[Resource Name (リソース名)] に
helloworld
と入力します。 -
[Resource Path (リソースパス)] を [/helloworld] に設定したままにします。
-
[Enable API Gateway CORS (API Gateway CORS を有効にする)] チェックボックスはオフのままにします。
-
[リソースの作成] を選択します。
-
-
プロキシ統合では、任意の HTTP メソッドを表すすべての
ANY
メソッドをキャッチオールがらリクエスト全体がそのままバックエンド Lambda 関数に送信されます。実際の HTTP メソッドは、実行時にクライアントによって指定されます。ANY
メソッドでは、単一の API メソッドのセットアップをDELETE
、GET
、HEAD
、OPTIONS
、PATCH
、POST
およびPUT
のサポートされるすべての HTTP メソッドに使用できます。ANY
メソッドを設定するには、次の操作を行います。-
[Resources (リソース)] リストで、[/helloworld] を選択します。
-
[アクション] メニューから、[メソッドの作成] を選択します。
-
ドロップダウンメニューから [ANY] を選択し、チェックマークアイコンを選択します。
-
[Integration type (統合タイプ)] を [Lambda Function (Lambda 関数)] に設定したままにします。
-
[Use Lambda Proxy integration (Lambda プロキシ統合の使用)] を選択します。
-
[Lambda Region (Lambda リージョン)] ドロップダウンメニューから、
GetStartedLambdaProxyIntegration
Lambda 関数を作成したリージョンを選択します。 -
[Lambda Function (Lambda 関数)] フィールドに任意の文字を入力し、ドロップダウンメニューから [
GetStartedLambdaProxyIntegration
] を選択します。 -
[デフォルトタイムアウトの使用] チェックボックスをオンのままにしておきます。
-
[保存] を選択します。
-
[Add Permission to Lambda Function (Lambda 関数に権限を追加する)] のプロンプトが表示されたら、[OK] を選択します。
-
API をデプロイしてテストする
API Gateway コンソールでの API のデプロイ
-
[アクション] ドロップダウンメニューから [API のデプロイ] を選択します。
-
[デプロイされるステージ] で、[新しいステージ] を選択します。
-
[Stage name (ステージ名)] に
test
と入力します。 -
必要に応じて、[Stage description (ステージの説明)] に入力してください。
-
必要に応じて、[Deployment description (デプロイの説明)] に入力してください。
-
[デプロイ] を選択します。
-
API の [Invoke URL (URL の呼び出し)] をメモしておきます。
ブラウザと cURL を使用して Lambda プロキシ統合で API をテストする
API をテストするためにブラウザまたは cURL
クエリ文字列パラメータのみを使用して GET
リクエストをテストするには、API の helloworld
リソースの URL をブラウザのアドレスバーに入力します。例: https://r275xc9bmd
.execute-api.us-east-1
.amazonaws.com/test/helloworld?name=John&city=Seattle
それ以外のメソッドの場合は、POSTMAN
cURL を使用してデプロイされた API をテストするには
-
ターミナルウィンドウを開きます。
-
次の cURL コマンドをコピーしてターミナルウィンドウに貼り付け、
を API の API ID に、r275xc9bmd
を API がデプロイされているリージョンに置き換えます。us-east-1
curl -v -X POST \ 'https://
r275xc9bmd
.execute-api.us-east-1
.amazonaws.com/test/helloworld?name=John&city=Seattle' \ -H 'content-type: application/json' \ -H 'day: Thursday' \ -d '{ "time": "evening" }'注記
Windows でコマンドを実行している場合は、代わりに次の構文を使用してください。
curl -v -X POST "https://
r275xc9bmd
.execute-api.us-east-1
.amazonaws.com/test/helloworld?name=John&city=Seattle" -H "content-type: application/json" -H "day: Thursday" -d "{ \"time\": \"evening\" }"
以下のようなペイロードで正常なレスポンスを受け取ります。
{ "message":"Good evening, John of Seattle. Happy Thursday!", "input":{ "resource":"/helloworld", "path":"/helloworld", "httpMethod":"POST", "headers":{"Accept":"*/*", "content-type":"application/json", "day":"Thursday", "Host":"r275xc9bmd.execute-api.us-east-1.amazonaws.com", "User-Agent":"curl/7.64.0", "X-Amzn-Trace-Id":"Root=1-1a2b3c4d-a1b2c3d4e5f6a1b2c3d4e5f6", "X-Forwarded-For":"72.21.198.64", "X-Forwarded-Port":"443", "X-Forwarded-Proto":"https"}, "multiValueHeaders":{"Accept":["*/*"], "content-type":["application/json"], "day":["Thursday"], "Host":["r275xc9bmd.execute-api.us-east-1.amazonaws.com"], "User-Agent":["curl/0.0.0"], "X-Amzn-Trace-Id":["Root=1-1a2b3c4d-a1b2c3d4e5f6a1b2c3d4e5f6"], "X-Forwarded-For":["11.22.333.44"], "X-Forwarded-Port":["443"], "X-Forwarded-Proto":["https"]}, "queryStringParameters":{"city":"Seattle", "name":"John" }, "multiValueQueryStringParameters":{ "city":["Seattle"], "name":["John"] }, "pathParameters":null, "stageVariables":null, "requestContext":{ "resourceId":"3htbry", "resourcePath":"/helloworld", "httpMethod":"POST", "extendedRequestId":"a1b2c3d4e5f6g7h=", "requestTime":"20/Mar/2019:20:38:30 +0000", "path":"/test/helloworld", "accountId":"123456789012", "protocol":"HTTP/1.1", "stage":"test", "domainPrefix":"r275xc9bmd", "requestTimeEpoch":1553114310423, "requestId":"test-invoke-request", "identity":{"cognitoIdentityPoolId":null, "accountId":null, "cognitoIdentityId":null, "caller":null, "sourceIp":"test-invoke-source-ip", "accessKey":null, "cognitoAuthenticationType":null, "cognitoAuthenticationProvider":null, "userArn":null, "userAgent":"curl/0.0.0","user":null }, "domainName":"r275xc9bmd.execute-api.us-east-1.amazonaws.com", "apiId":"r275xc9bmd" }, "body":"{ \"time\": \"evening\" }", "isBase64Encoded":false } }
前述のメソッドリクエストで POST
から PUT
に変更した場合も同じレスポンスを受け取ります。
GET
メソッドをテストするには、次の cURL
コマンドをコピーしてターミナルウィンドウに貼り付け、
を API の API ID に、r275xc9bmd
を API がデプロイされているリージョンに置き換えます。us-east-1
curl -X GET \ 'https://
r275xc9bmd
.execute-api.us-east-1
.amazonaws.com/test/helloworld?name=John&city=Seattle' \ -H 'content-type: application/json' \ -H 'day: Thursday'
POST
リクエストにペイロードが含まれていないことを除けば、前の GET
リクエストの結果と同様のレスポンスが得られます。したがって、body
パラメータは null
になります。