コンテンツにスキップ

Chaliceでリクエストパラメータベースのオーソライザーを作成する

まず、Chaliceの定義から。

Chalice は、python でサーバーレスアプリを書くためのフレームワークです。AWS Lambda を利用したアプリケーションを素早く作成し、デプロイすることができます。提供するものです。

  • アプリの作成、デプロイ、管理のためのコマンドラインツール
  • Amazon API Gateway、Amazon S3、Amazon SNS、Amazon SQS、およびその他の AWS サービスと統合するためのデコレーターベースの API。
  • IAM ポリシーの自動生成

Chalice のオーソライザーはトークンベースのオーソライザーしか用意されていません。リクエストパラメータベースで使いたい場合は、自分で拡張する必要があります。検索しまくっても全然出てこないので、サンプルコードを残しておきます。

from typing import Any, Dict, List, Optional

from chalice import Chalice
from chalice.app import Authorizer

app = Chalice(app_name="custom-request-base-authorizer")


class CustomAuthorizer(Authorizer):

    _AUTH_TYPE = "custom"

    def __init__(
        self,
        name: str,
        authorizer_uri: str,
        ttl_seconds: int = 300,
        header: str = "Authorization",
        invoke_role_arn: Optional[str] = None,
        scopes: Optional[List[str]] = None,
        identity_sources: Optional[List[str]] = [],
    ) -> None:
        self.name = name
        self._header = header
        self._authorizer_uri = authorizer_uri
        self._ttl_seconds = ttl_seconds
        self._invoke_role_arn = invoke_role_arn
        self.scopes = scopes or []
        self._identity_sources = identity_sources

    def to_swagger(self) -> Dict[str, Any]:
        # パラメータ名を変換
        # ヘッダーにしか対応してません
        # クエリパラメータなどに対応したい場合は、自分で実装してください
        identity_source = ",".join(
            [
                f"method.request.header.{identity_source}"
                for identity_source in self._identity_sources
            ]
        )

        swagger: Dict[str, Any] = {
            "in": "header",
            "type": "apiKey",
            "name": self._header,
            "x-amazon-apigateway-authtype": self._AUTH_TYPE,
            "x-amazon-apigateway-authorizer": {
                "type": "request",
                "identitySource": identity_source,
                "authorizerUri": self._authorizer_uri,
                "authorizerResultTtlInSeconds": self._ttl_seconds,
            },
        }
        if self._invoke_role_arn is not None:
            swagger["x-amazon-apigateway-authorizer"][
                "authorizerCredentials"
            ] = self._invoke_role_arn
        return swagger


region = "ap-northeast-1"   # リージョンを指定
lambda_arn = "" # LambdaオーソライザーのARNを指定
authorizer_uri = f"arn:aws:apigateway:{region}:lambda:path/2015-03-31/functions/{lambda_arn}/invocations"

authorizer = CustomAuthorizer(
    "CustomRequestBaseAuthorizer",
    authorizer_uri=authorizer_uri,
    identity_sources=["Authorization", "X-Request-Id"],
)


@app.route("/private", authorizer=authorizer)
def private():
    return {"hello": "world"}

さらに細かい設定をしたい場合は、x-amazon-apigateway-authorizer オブジェクトで確認してください。

参考