[アップデート] AWS SAM CLIのローカル実行時にLambda オーソライザーを無効化できるようになりました。

2023.12.07

初めに

本日、AWS SAM CLIのv1.104.0がリリースされました。

SAM CLIでのローカル実行におけるLambdaオーソライザについてですが、今年の4月ごろにリリースされたv1.80.0以前の状態ではlocal start-apiで立ちあげてもLambdaオーソライザーは適用されず無視される仕様となっておりましたが、めでたくv1.80.0での対応を持ってSAM CLI環境での実行時にLambdaオーソライザの処理が適用されるようになりました。

対応できる幅が多いことは非常に嬉しいことですが、Lambdaオーソライザで利用するリソースが各個人環境個別に準備するのが大変なケース、開発メンバーの割り振り上認証以外の部分に集中し開発してもらいたいようなケースで強制的に利用しないといけなくなってしまうデメリットもありました。

コメントアウトや回避用の変数の用意などで対策することも可能ですがそれ用の特別な準備、誤コミットデプロイのリスクもあります。

今後は--disable-authorizerオプションを実行時に指定することでテンプレートやオーソザイザ側のプログラムで特別な処理をすることなくLambdaオーソライザの実行を回避することができます。

試してみる

上記で貼らせていただいているstart local-api実装時のLambdaオーソライザのサンプルプログラムが残っているのでそちらを流用します。

Lambdaオーソライザで実行されるコードだけを抜粋いたしますがリクエスト時のAuthorizationヘッダにSuccessが入った場合のみ認証成功しアクセスが許可されます。

def lambda_handler(event, context):
    auth_result = "Allow" if 'authorizationToken' in event and "Success" == event['authorizationToken'] else "Deny"
    return {
        'principalId': 'sam-local',
        'policyDocument': {
            'Version': '2012-10-17',
            'Statement': [
                {
                    'Action': 'execute-api:Invoke',
                    'Effect': auth_result,
                    'Resource': [
                        event['methodArn']
                    ]
                }
            ]
        }
    }

従来通りsam local start-apiで実行した際は以下のようにLambdaオーソライザによる認可処理が行われそれに失敗するとUnauthorizaedのメッセージが返却されます。

% sam local start-api
...
#以降別ウィンドで実行
% curl http://localhost:3000/hello -H "Authorization: Success"
{"message": "hello world"}%
% curl http://localhost:3000/hello
{"message":"Unauthorized"}

local start-api実行時に--disable-authorizerを指定することでこの認証プロセスをスキップしてAPI Gatewayの裏側にあるLambda関数を実行可能です。

% sam local start-api --disable-authorizer
...
#以降別ウィンドで実行
% curl http://localhost:3000/hello -H "Authorization: Success"
{"message": "hello world"}%
% curl http://localhost:3000/hello
{"message": "hello world"}%

改めてですがSAM CLIの各種コマンド実行時に記載するオプションはsamconfigに記載することで実行時に自動指定されますのでこちらに記述いただくのも一つの選択肢です。

...
[default.local_start_api.parameters]
disable_authorizer = true
...

samconfigはSAMテンプレートほど編集するファイルではないとはいえ多くの場合.gitignoreに載るファイルではなくGUIアプリ等を使っていて全選択をおこなってしまうと巻き込む可能性はあるかと思いますのでご注意ください。

終わりに

細かなアップデートですが個人的には結構嬉しいアップデートです。

個人開発とかでローカル環境で「そう大事なものでもないので...」と認証部分の用意をついサボってコメントアウト対応していました。
ちょっとデプロイして確認!という際にコメントアウトのままデプロイという事故もしばしばあったのでこの辺りの心配をしなくてよくなりヒヤリハット事案も減るので嬉しい限りです。