LoginSignup
4
3

Lambdaオーソライザーで独自認証処理を実装する

Posted at

この記事について

API Gatewayのアクセス制御の仕組みの1つに「Lambdaオーソライザー」という機能があります。
今回はLambdaオーソライザーを使って、
クエリパラメータ「type」の値によって後継のAPIを実行するかどうかを判断する使い方をしてみたいと思います。
Lambdaオーソライザーを作成して動きを確認することを目的としているので、
LambdaオーソライザーやAPI Gatewayの仕様に関しては説明をしません。
AWS公式HPで補足をお願いします。
API Gateway Lambda オーソライザーを使用する

対象者

  • Lambdaオーソライザーを作成したことがなく、サクッと挙動を確認してみたい。

API Gatewayの準備

サンプルAPIを利用して、REST APIを作成します。
スクリーンショット 2023-10-04 15.11.09.png

Lambdaの準備

オーソライザーで実行するLambdaを準備します。
今回はこんな感じのLabmdaを用意したいと思います。

  • typeがuserなら後継のAPIを実行
  • typeがuser以外ならエラーを返す
index.js
exports.handler = async (event) => {
    const queryParameters = event.queryStringParameters;

    if (queryParameters && queryParameters.type === 'user') {
        return generatePolicy('user', 'Allow', event.methodArn);
    }
    return generatePolicy('user', 'Deny', event.methodArn);
};

function generatePolicy(principalId, effect, resource) {
    const policyDocument = {
        Version: '2012-10-17',
        Statement: [{
            Action: 'execute-api:Invoke',
            Effect: effect,
            Resource: resource
        }]
    };

    return {
        principalId: principalId,
        policyDocument: policyDocument
    };
}

Lambdaオーソライザーの作成

API Gateway左のナビゲーションから「オーソライザーを選択」
image.png

下記設定でオーソライザーを作成します。

  • オーソライザー名:任意の名前
  • オーソライザーのタイプ:Lambda
  • Lambda関数:事前に作成したLambda
  • Lambday呼び出しロール:今回は未指定
  • Lambdaイベントペイロード:リクエスト>IDソースタイプ:クエリ文字列, 値:type
  • 認可のキャッシュ:無効

LambdaオーソライザーをAPIに紐付ける

LambdaオーソライザーはAPI Gaetwayのメソッドに紐づくので、
紐付けたいメソッドにLambdaオーソライザーを紐付けます。

今回は/pets GETメソッドに紐付けます。
メソッドリクエストの編集で、認可タイプに作成したLambdaオーソライザーを選択してください。
image.png

動作確認

APIをデプロイして、クエリパラメータtypeを付けてリクエストしてください。
(/pets?type=user)

typeがuser だとpets一覧がレスポンスされますが、guestなど他の値だとHTTPStatus403がレスポンスされます。

API GatewayのログをCloudWatchに出力して、後継のAPIが実行されていないことを確認する

IAM Role作成

AmazonAPIGatewayPushToCloudWatchLogs

API GatewayにRoleを割り当て

左のナビゲーションから「設定」を選択。
ログ記録で「CloudWatch ログのロール ARN」に作成したRoleのArnを指定する。

ログの有効化

デプロイしたステージの「ログとトレース」で下記設定を行う。
CloudWatchログ:リクエストとレスポンスの完全なログ

確認

1. クエリパラメータtype=guestでリクエスト
.CloudWatchLogs「 API-Gateway-Execution-Logs_{random}/dev」というロググループが作成されているので、
内容を確認する

The client is not authorized to perform this operation.

2. クエリパラメータtype=userでリクエスト
「 API-Gateway-Execution-Logs_{random}/dev」に下記ログが出力され、後継のAPIの実行ログが続いて出力されていることが確認できる

Successfully completed authorizer execution

以上です。
本来の使い方ではないですが、Lambdaオーソライザーを使ったAPI GWの動きを確かめたい方の参考になれば幸いです。

補足

ペイロードについて

今回、オーソライザー作成時に下記設定を行いました。

  • Lambdaイベントペイロード:リクエスト>IDソースタイプ:クエリ文字列, 値:type

そもそもクエリ文字列にtypeがない場合は、オーソライザーとして指定したLambdaは実行されません。
ペイロードではtypeを指定していますが、typeを使わない検証を行うことも可能です。

APIキーと組み合わせた場合の実行順序

ちなみ APIキーと組み合わせた場合は、
オーソライザーでの認可が通った後にAPIキーがチェックされるようです。
https://qiita.com/yaguchii/items/d38d3203b611c6a15066#:~:text=Lambda%E3%82%AA%E3%83%BC%E3%82%BD%E3%83%A9%E3%82%A4%E3%82%B6%E3%83%BC%E3%81%A8API%E3%82%AD%E3%83%BC%E8%AA%8D%E8%A8%BC%E3%82%92%E5%90%8C%E6%99%82%E3%81%AB%E5%88%A9%E7%94%A8,%E8%AA%8D%E8%A8%BC%E3%81%AB%E3%81%AF%E3%81%84%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82

今回はAPIキーを使っていませんが、ログを確認すると
「Successfully completed authorizer execution」の後に下記ログが出力されていることからも確認ができます。

API Key authorized because method 'GET /pets' does not require API Key. Request will not contribute to throttle or quota limits

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3