TLDR;
Lambda イベントペイロードタイプをTokenではなくて、Requestに変更する。
事象
SAMテンプレートを使用して、API Gatewayをリソースを作成した時にLambda Authorizerを設定した。いざ叩いてみると、LambdaにHeader情報が渡っていなかった。
Lambdaにログ出力を出して、Cloudwatchで確認すると何も出力されなかった。
2023/06/13 08:39:50 Headers: map[]
MyApi:
Type: AWS::Serverless::Api
Properties:
StageName: dev
Auth:
Authorizers:
CognitoAuthorizer:
UserPoolArn: !GetAtt MyUserPool.Arn
MyLambdaAuthorizer:
FunctionArn: !GetAtt LambdaAuthorizerFunction.Arn
Identity:
Headers: ["Id-Token"]
ReauthorizeEvery: 300
OpenApiVersion: 3.0.3
EndpointConfiguration:
Type: REGIONAL
解決方法
Lambda イベントペイロードをトークンではなくて、リクエストに設定することでHeaderを取得できました。
MyApi:
Type: AWS::Serverless::Api
Properties:
StageName: dev
Auth:
Authorizers:
CognitoAuthorizer:
UserPoolArn: !GetAtt MyUserPool.Arn
MyLambdaAuthorizer:
FunctionArn: !GetAtt LambdaAuthorizerFunction.Arn
Identity:
Headers: ["Id-Token"]
ReauthorizeEvery: 300
+ FunctionPayloadType: REQUEST
OpenApiVersion: 3.0.3
EndpointConfiguration:
Type: REGIONAL
コンソール画面にて、API Gatewayのオーソライザー
から設定を確認できます。
APIを叩くと無事取れました。
2023/06/13 10:39:50 Headers: map[Id-Token:******]
後書き
LambdaイベントペイロードをTokenにしているとHeaderにAuthrization
がないと、Lambdaが起動すらしません。(起動しないのでCloudwatchにログが出力されない)
頑張ってSAMの設定ができたと思って、一生懸命API叩いてもUnauthrizedしか出てこず、Cloudwatchのログもないのでどこで詰まっているのかわからず、SAMの書き方が悪くてエンドポイントにLambda Authorizerが正しく設定できていないものだと永遠に思ってました。
公式ドキュメント、大事、、、