Lambda REQUEST オーソライザーの関数の作成 - Amazon API Gateway

Lambda REQUEST オーソライザーの関数の作成

WebSocket API の Lambda オーソライザー関数は、REST API と似ていますが、次のような例外があります。

  • パス変数 (event.pathParameters) を使用することはできません。これは、パスが固定されているためです。

  • event.methodArn は、HTTP メソッドがないため、REST API の同等のメソッドとは異なります。$connect の場合、methodArn"$connect" で終了します。

    arn:aws:execute-api:region:account-id:api-id/stage-name/$connect
  • event.requestContext のコンテキスト変数は、REST API のコンテキスト変数とは異なります。

次の例では、Lambda オーソライザー関数は、Lambda コンソールで API Gateway Lambda オーソライザー関数を作成する の REST API の Lambda オーソライザー関数の WebSocket バージョンです。

exports.handler = function(event, context, callback) { console.log('Received event:', JSON.stringify(event, null, 2)); // A simple REQUEST authorizer example to demonstrate how to use request // parameters to allow or deny a request. In this example, a request is // authorized if the client-supplied HeaderAuth1 header and QueryString1 query parameter // in the request context match the specified values of // of 'headerValue1' and 'queryValue1' respectively. // Retrieve request parameters from the Lambda function input: var headers = event.headers; var queryStringParameters = event.queryStringParameters; var stageVariables = event.stageVariables; var requestContext = event.requestContext; // Parse the input for the parameter values var tmp = event.methodArn.split(':'); var apiGatewayArnTmp = tmp[5].split('/'); var awsAccountId = tmp[4]; var region = tmp[3]; var ApiId = apiGatewayArnTmp[0]; var stage = apiGatewayArnTmp[1]; var route = apiGatewayArnTmp[2]; // Perform authorization to return the Allow policy for correct parameters and // the 'Unauthorized' error, otherwise. var authResponse = {}; var condition = {}; condition.IpAddress = {}; if (headers.HeaderAuth1 === "headerValue1" && queryStringParameters.QueryString1 === "queryValue1") { callback(null, generateAllow('me', event.methodArn)); } else { callback("Unauthorized"); } } // Helper function to generate an IAM policy var generatePolicy = function(principalId, effect, resource) { // Required output: var authResponse = {}; authResponse.principalId = principalId; if (effect && resource) { var policyDocument = {}; policyDocument.Version = '2012-10-17'; // default version policyDocument.Statement = []; var statementOne = {}; statementOne.Action = 'execute-api:Invoke'; // default action statementOne.Effect = effect; statementOne.Resource = resource; policyDocument.Statement[0] = statementOne; authResponse.policyDocument = policyDocument; } // Optional output with custom properties of the String, Number or Boolean type. authResponse.context = { "stringKey": "stringval", "numberKey": 123, "booleanKey": true }; return authResponse; } var generateAllow = function(principalId, resource) { return generatePolicy(principalId, 'Allow', resource); } var generateDeny = function(principalId, resource) { return generatePolicy(principalId, 'Deny', resource); }

前述の Lambda 関数を WebSocket API の REQUEST オーソライザー関数として設定する場合、REST API と同じ手順に従います。

コンソールでこの Lambda オーソライザーを使用するよう $connect ルートを設定するには、$connect ルートを選択または作成します。ルートリクエストを選択し、[認証] ドロップダウンメニューでオーソライザーを選択します。

オーソライザーをテストするには、新しい接続を作成する必要があります。$connect でオーソライザーを変更しても、接続済みのクライアントに影響はありません。WebSocket API に接続するときは、設定済みの ID ソースの値を指定する必要があります。たとえば、次の例のように wscat を使用し、有効なクエリ文字列およびヘッダーを送信して接続できます。

wscat -c 'wss://myapi.execute-api.us-east-1.amazonaws.com/beta?QueryString1=queryValue1' -H HeaderAuth1:headerValue1

有効な ID 値なしに接続しようとすると、401 レスポンスが送信されます。

wscat -c wss://myapi.execute-api.us-east-1.amazonaws.com/beta error: Unexpected server response: 401