どうも、靖宗です。
docker-lambdaで開発して、コンソールからLambdaをデプロイするというちょっとアレな運用を直すべくSAM CLIを利用し始めました。
そこまでは良かったものの(逆になんで使って無かったんだ?というぐらい快適だしCloudFormation最高)、Cognitoとの連携をやり始めてCORSでPOSTするAPIがうまくいかず悩んでました。
とは言っても基本的には全てリクエストに情報は載っているもの。
調べて見るとPOSTの手前のOPTIONSリクエストでCognito認証がはじかれてる模様。
axiosでPOSTリクエストを送っている環境下だったので、わざわざOPTIONSのリクエストを描いてヘッダーにトークンを・・・というのはなんだか解決方法として間違ってる気がしたので執拗にウェブをあさっておりましたら該当する情報にたどり着きました。ありがたや。
SAMのテンプレートのAPI Gatewayの箇所にAddDefaultAuthorizerToCorsPreflight
という項目を追加しfalse
に設定すれば良いとのこと。
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Parameters: CognitoUserPoolArn: Type: String Default: arn:aws:cognito-idp:~~~(該当するARNを入力) StageName: Type: String Default: dev Globals: Function: Timeout: 3 Resources: ApiGateway: Type: AWS::Serverless::Api Properties: StageName: !Ref StageName Auth: DefaultAuthorizer: CognitoAuthorizer AddDefaultAuthorizerToCorsPreflight: false Authorizers: CognitoAuthorizer: UserPoolArn: !Ref CognitoUserPoolArn Cors: AllowOrigin: "'*'" AllowHeaders: "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'" AllowMethods: "'OPTIONS,POST,GET'" Function: Type: AWS::Serverless::Function Properties: CodeUri: ../../built(該当する箇所のパス) Handler: (該当ハンドラ) Runtime: nodejs10.x Events: Api: Type: Api Properties: Path: /post Method: post RestApiId: !Ref ApiGateway Outputs: Region: Description: "Region" Value: !Ref AWS::Region ApiId: Description: "API ID" Value: !Ref ApiGateway ApiUrl: Description: "API endpoint URL" Value: !Sub 'https://${ApiGateway}.execute-api.${AWS::Region}.amazonaws.com/${StageName}/'
これで問題無くAPIが使える筈です。
AmplifyのLambdaでデフォルトでTypeScript使えるようにならんかなぁ・・・(:3 」∠ )