技術メモ

プログラミングとか電子工作とか

AWS SAMでCognito認証のPOSTが通らなかった

f:id:ysmn_deus:20190318182949p:plain

どうも、靖宗です。
docker-lambdaで開発して、コンソールからLambdaをデプロイするというちょっとアレな運用を直すべくSAM CLIを利用し始めました。
そこまでは良かったものの(逆になんで使って無かったんだ?というぐらい快適だしCloudFormation最高)、Cognitoとの連携をやり始めてCORSでPOSTするAPIがうまくいかず悩んでました。

とは言っても基本的には全てリクエストに情報は載っているもの。
調べて見るとPOSTの手前のOPTIONSリクエストでCognito認証がはじかれてる模様。
axiosでPOSTリクエストを送っている環境下だったので、わざわざOPTIONSのリクエストを描いてヘッダーにトークンを・・・というのはなんだか解決方法として間違ってる気がしたので執拗にウェブをあさっておりましたら該当する情報にたどり着きました。ありがたや。

nibral.hateblo.jp

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 」∠ )