Lambda Authorizer 概要 メモ

## Lambda Authorizerとは

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

## 認証の流れ

![lambda_authorizer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/bb545e3a-41b2-9143-dab8-9d9b7b402043.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テンプレート例

  ※[公式](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-controlling-access-to-apis-lambda-authorizer.html)より

  ```yaml
  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](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html#stagevariables-template-reference)、[$context](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html#context-variable-reference) 変数の組み合わせで認証を行う方式。

* SAMテンプレート例

  ※[公式](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-controlling-access-to-apis-lambda-authorizer.html)より

  ※`FunctionPayloadType`に`REQUEST`を指定する。(デフォルトは`TOKEN`のため)

  ```yaml
  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
  ```

  

## 参考情報

* [API Gateway Lambda オーソライザーを使用する](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html)
* [Lambda オーソライザーの例](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-controlling-access-to-apis-lambda-authorizer.html)
* [LambdaRequestAuthorizer](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-property-api-lambdarequestauthorizer.html)