自由帳

@_nibral の技術ブログ

AWS SAMでDefaultAuthorizerとCORSが共存できるようになった

半年ほど前に以下のような記事を書いたが、その後のアップデートでDefaultAuthorizerとCORSが問題なく共存できるようになった。

nibral.hateblo.jp

関係しそうなところ

  • AWS::Serverless::ApiのAuthプロパティに「AddDefaultAuthorizerToCorsPreflight」が追加され、CORSのプリフライトリクエストにDefaultAuthorizerを適用するかどうかを指定できるようになった (AWS SAM v1.13~)
    • 以前テストをパスできなくて取り下げられていたもの

github.com

  • AWS::Serverless::FunctionのAuthプロパティに「NONE」を指定して、Authrorizerを無効にできるようになった (AWS SAM v1.15~)

github.com

  • 「sam local start-api」がCORSに対応した (AWS SAM CLI v0.21.0~)
    • Authorizerには直接関係しないが、ローカルでプリフライトリクエストの動作確認ができるようになった

github.com

設定例

以下のような template.yml を作成すると、

  • GET /
    • CognitoAuthorizer
  • GET /public
    • Authorizerなし
  • OPTIONS / および OPTIONS /public
    • Authorizerなし (プリフライトリクエスト成功)

という動作が実現できる。AWS SAM CLI v0.22.0で確認。

Resources:
  MyApi:
    Type: AWS::Serverless::Api
    Properties:
      Auth:
        DefaultAuthorizer: CognitoAuthorizer
        AddDefaultAuthorizerToCorsPreflight: false
        Authorizers:
          CognitoAuthorizer:
            UserPoolArn: <Cognito UserPool ARN>
      Cors:
        AllowOrigin: "'*'"

  MyFunction1:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      CodeUri: src/
      Events:
        GetIndex:
          Type: Api
          Properties:
            Path: /
            Method: get

  MyPublicFunction1:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      CodeUri: src/
      Events:
        GetPublic:
          Type: Api
          Properties:
            Path: /public
            Method: get
            Auth:
              Authorizer: 'NONE'

もともとやりたかったことができるようになったので満足。