0
Help us understand the problem. What are the problem?

posted at

Lambda Authorizer 概要 メモ

Lambda Authorizerとは

  • Lambda 関数を使用して API へのアクセスを制御する API Gateway の機能。
    • クライアントが API リクエストを送信すると、API Gateway は Lambda Authorizerを呼び出す。
    • トークンやリクエストパラメータを入力として受け取り、IAM ポリシーを出力として返却する。

認証の流れ

lambda_authorizer.png

① クライアントは、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テンプレート例

    公式より

    FunctionPayloadTypeREQUESTを指定する。(デフォルトは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
    

参考情報

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?