Lambda Authorizerとは
- Lambda 関数を使用して API へのアクセスを制御する API Gateway の機能。
- クライアントが API リクエストを送信すると、API Gateway は Lambda Authorizerを呼び出す。
- トークンやリクエストパラメータを入力として受け取り、IAM ポリシーを出力として返却する。
認証の流れ
① クライアントは、API Gatewayに対してAPIリクエストを行う。
※API Gateway は、対象APIメソッドに対してLambda Authorizerが設定されているかを確認する。
② Authorizerが存在する場合、API Gateway は Lambda 関数を呼び出す。
③ Lambda 関数は、次の手段でクライアントを認証する。
- OAuthプロバイダー呼び出し。
- SAMLプロバイダー呼び出し。
- リクエストパラメータ評価。
- データベースからの認証情報取得。
④ (呼び出しが成功すると、)Lambda 関数はIAM ポリシーとプリンシパルID を含むオブジェクトを返却し、アクセス許可を行う。
⑤ API Gateway は取得したポリシーを評価する。
- アクセスが拒否された場合、API Gateway は
403 ACCESS_DENIED
などのステータスコードを返却する。
⑥ (アクセスが許可された場合、)API Gateway はメソッドを実行する。
- キャッシュ設定が有効になっている場合、ポリシーをキャッシュするため、Lambda Authorizer関数を再度呼び出す必要はない。
Authorizer 方式
次の2つの方式のAuthorizerに対応する。
トークンベース Authorizer
-
JWTや OAuth トークンなどのベアラートークンで認証を行う方式。
-
SAMテンプレート例
※公式より
Resources: MyApi: Type: AWS::Serverless::Api Properties: StageName: Prod Auth: DefaultAuthorizer: MyLambdaTokenAuthorizer Authorizers: MyLambdaTokenAuthorizer: FunctionArn: !GetAtt MyAuthFunction.Arn MyFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./src Handler: index.handler Runtime: nodejs12.x Events: GetRoot: Type: Api Properties: RestApiId: !Ref MyApi Path: / Method: get MyAuthFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./src Handler: authorizer.handler Runtime: nodejs12.x
リクエストパラメータベース Authorizer
-
ヘッダー、クエリ文字列パラメータ、stageVariables、$context 変数の組み合わせで認証を行う方式。
-
SAMテンプレート例
※公式より
※
FunctionPayloadType
にREQUEST
を指定する。(デフォルトはTOKEN
のため)Resources: MyApi: Type: AWS::Serverless::Api Properties: StageName: Prod Auth: DefaultAuthorizer: MyLambdaRequestAuthorizer Authorizers: MyLambdaRequestAuthorizer: FunctionPayloadType: REQUEST FunctionArn: !GetAtt MyAuthFunction.Arn Identity: QueryStrings: - auth MyFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./src Handler: index.handler Runtime: nodejs12.x Events: GetRoot: Type: Api Properties: RestApiId: !Ref MyApi Path: / Method: get MyAuthFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./src Handler: authorizer.handler Runtime: nodejs12.x