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 オブジェクトで確認してください。