Lambdaカスタムオーソライザー認証を用いたAPIを構築する

こんにちはSCSK齋藤です。

今回は Amazon API Gateway の認証方法として、Lambda カスタムオーソライザーを用いる方法を解説したいと思います。

 

概要

アーキテクチャ図は下に示す通りです。今回はAPI Gatewayの裏にLambdaを設けて、API呼び出しでLambdaが動くようにします。

なお、Lambdaカスタムオーソライザー認証の処理の流れは下記の通りとなります。

①APIの呼び出し元がAPIの呼び出しを行う。

②APIの呼び出し元に付与されているヘッダー情報を、Lambdaカスタムオーソライザーが認証する。

③認証が通れば、APIを呼び出すことができる。

 

各リソースの作成

アーキテクチャ図を実現する、各リソースの作成をマネジメントコンソールベースで説明します。

Lambda(カスタムオーソライザー)

認証用のLambdaを作成いたします。

まず最初は通常通りLambdaを作成します。

さて、次はソースコードが重要となります。

カスタムオーソライザーのソースコードは、利用者にて自由に定義ができます。

今回は下記のようなソースコードとしました。

import json

 
def lambda_handler(event, context):
    json_event = json.dumps(event)
    print(f"event: {json_event}")

    # リクエストからトークンを取得
    token = event['authorizationToken']

    # 判定結果の変数。リクエストされたトークンが一致していたら許可とする。初期値は拒否とする。
    effect = 'Deny'
    
    
    #  tokenを検証。指定の値であれば許可する。戻り値にはAPIを実行するIAMポリシーをJSON形式で渡してあげる
    if token == 'AccessToken':
        effect = 'Allow'
        return {
            'principalId': '*',
            'policyDocument': {
                'Version': '2012-10-17',
                'Statement': [
                    {
                        'Action': 'execute-api:Invoke',
                        'Effect': effect,
                        'Resource': event['methodArn']
                    }
                ]
            }
        }

 

ポイントとしては、アクセス許可を付与する際はIAMポリシーを返却することです。

このIAMポリシーにAPIGatewayの実行許可を付与することで、APIを実行することができます。

 

Lambda(APIに呼び出される側)

今回のAPIGatewayの裏側にあるLambdaは、特に凝ったものにする必要がないので、デフォルトのソースコードそのままとします。

単純にステータスコード200と「Hello from Lambda!」と出力されるだけのシンプルなプログラムです。

 

API Gateway

最初は通常通りの作成を行います。

メソッドの作成も行います。今回は呼び出しができれば良いのでGetにし、先ほど作成したAPIに呼び出される側のLambda関数を設定します。

作成後、認証設定を付与します。

まず最初に、API Gatewayの画面の左ベインからオーソライザーを選択し、オーソライザーを作成をクリックします。

オーソライザーを設定しますが、今回はLambdaを選択し、オーソライザー用のLambdaを選択します。

今回は、トークンをイベントペイロードとしますので、トークンのソースの部分を一般的な「Authorization」として、作成します。

その後、APIにオーソライザーを紐付けます。

APIのリソースの画面に戻り、メソッドリクエストの編集ボタンを押下します。

 

認可の部分で、先ほど作成したオーソライザーを選択します。

メソッドリクエストの認可にオーソライザーが付与されているのを確認したら、画面右上の「APIのデプロイ」をクリックします。

 

下記のような設定とし、デプロイをクリックします。

 

これにてAPI側の構築は完了です。

続いて、APIを呼び出す側のリソースを作成していきます。

今回は、呼び出し元はLambda関数を使いたいと思います。

Lambda(APIを呼び出す側)

今回は下記名前のLambdaを作成しました。Lambda関数の作成方法は、前述したものと同じなので省略します。

ここではソースコードを紹介します。

import requests

def lambda_handler(event, context):
    api_url = "https://XXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/dev"

    #①ヘッダー情報を生成する。
    headers = {
        "Authorization": "AccessToken",
    }

    #②ヘッダー情報を付加してAPIへアクセスする。
    api_response = requests.get(api_url, headers=headers)

    api_response_json=api_response.json()
    
    print(f'api_response is {api_response_json}')

ソースコードの中にコメントアウトしておりますが、流れを解説すると2点に分けられます。

①ヘッダー情報を生成する。

今回はトークンのソースをAuthorizationとしましたので、Authorizationヘッダーを作成する必要があります。

Authorizationヘッダーの中身については、Lambdaのカスタムオーソライザーのソースコードで定義した「AccessToken」と同じ値を入れることで認証されるのでその値を設定します。

②ヘッダー情報を付加してAPIへアクセスする。

ヘッダー情報を付加し、アクセスしたいAPIのURLへアクセスを行います。

 

挙動確認

これまでで準備は完了となります。

では、実際にLambdaのテストとして動作確認をしてみますと、ログ出力のところでAPIの裏側のLambdaとして実装したステータスコード200と「Hello from Lambda!」が出力されていることがわかります。

 

まとめ

今回は API Gateway のLambdaカスタムオーソライザー認証を呼び出す方法について記載いたしました。

Lambdaによって認証されるので、かなり自由度は高いと思います。

認証の部分は今回「AccessToken」という単語でハードコードしましたが、裏側にデータベースなどを実装し、リクエストされた値をもとにデータベースを照合して認証するなどするのが良いと考えております。

そちらについてはまた次回以降ブログにできたら良いと考えております。

著者について

フロントエンドもバックエンドも両方少しずつ勉強して、フルスタックエンジニアを目指してます。
サーバレス開発の楽しさを実感中!

ANGEL Dojo 2021 ANGEL賞、ベストアーキテクチャ賞ダブル受賞
2023 Japan AWS Jr. Champions
2022〜24 Japan AWS All Certifications Engineers

齋藤友宏をフォローする

クラウドに強いによるエンジニアブログです。

SCSKクラウドサービス(AWS)は、企業価値の向上につながるAWS 導入を全面支援するオールインワンサービスです。AWS最上位パートナーとして、多種多様な業界のシステム構築実績を持つSCSKが、お客様のDX推進を強力にサポートします。

AWSアプリケーション開発クラウドソリューション
シェアする
タイトルとURLをコピーしました