1

私はしばらく CORS と戦ってきましたが、アイデアが尽きてしまいました。私はAWS::Serverless::HttpApiSAMを介して展開しています。この API には現時点でエンドポイントが 1 つしかなく、 への POST リクエストを受け取ります/auctions。PostMan でテストすると動作しますが、もちろん他の場所でテストすると恐ろしいpreflight failedエラーがスローされます。過去数日間、私はさまざまなことを試してきましたが、何もうまくいきませんでした. これが私の現在の状態ですtemplate.yaml

Resources:

  AdminApi:
    Type: AWS::Serverless::HttpApi
    Properties:
      CorsConfiguration:
        AllowMethods:
          - GET
          - POST
          - OPTIONS
        AllowOrigins:
          - "*"
        AllowHeaders:
          - "*"

  OptionsFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: ./src
      Handler: handlers/options.lambda_handler
      Runtime: python3.9
      Events:
        ApiPost:
          Type: HttpApi
          Properties:
            ApiId: !Ref AdminApi
            Path: /auctions
            Method: options

  CreateAuctionFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: ./src
      Handler: handlers/create_auction.lambda_handler
      Runtime: python3.9
      Events:
        ApiPost:
          Type: HttpApi
          Properties:
            ApiId: !Ref AdminApi
            Path: /auctions
            Method: post
      Environment:
        Variables:
          AUCTION_TABLE: !Sub "{{resolve:ssm:/applications/tikes/${Stage}/ddb/Auctions/TableName}}"
      Policies:
        - SSMParameterReadPolicy:
            ParameterName: !Sub "applications/tikes/${Stage}/*"
        - DynamoDBCrudPolicy:
            TableName: !Sub "{{resolve:ssm:/applications/tikes/${Stage}/ddb/Auctions/TableName}}"

このテンプレートには DynamoDb テーブルを作成する兄弟テンプレートがありますが、その部分は正常に機能しているため省略します。オプションラムダハンドラーは次のとおりです(ボディを追加してもヘッダーには影響しませんでした):

def lambda_handler(event, context):
    return {
        'statusCode': 200,
    }

そして、POST ハンドラーから送信する成功応答:

def success_body(auction_id):
    return {
        'statusCode': 200,
        'body': json.dumps({
            'auction_id': auction_id
        }),
    }

オプション ラムダ ハンドラーを追加する前は204、allow-origin ヘッダーなしで OPTIONS リクエストからの応答を受け取っていましたが、ハンドラーを追加したので、200期待どおりに取得しましたが、ヘッダーはまだありません。この構成では、PostMan を介して同じヘッダーを持つ要求を送信すると、POST にヘッダーが含まれますが、OPTIONS 要求では欠落します。

私が試したこと:

  1. CorsConfiguration: true
  2. オリジンのハードコーディング

私が読んだこと:

  1. AWS API ゲートウェイに存在しない CORS "Response to preflight..." ヘッダーを修正し、増幅する
  2. https://aws.amazon.com/premiumsupport/knowledge-center/no-access-control-allow-origin-error/
  3. https://www.serverless.com/blog/cors-api-gateway-survival-guide/
  4. https://aws.amazon.com/blogs/compute/configuring-cors-on-amazon-api-gateway-apis/
  5. https://aws.amazon.com/premiumsupport/knowledge-center/api-gateway-cors-errors/
  6. https://github.com/aws/aws-sam-cli/issues/2637
  7. https://forums.aws.amazon.com/thread.jspa?threadID=252972
  8. AWS Lambda HTTP API ゲートウェイ統合で CORS が不可能
  9. 私が見つけることができる他の aws cors の質問。

POST リクエストにヘッダーが存在するという事実は、何かが機能していることを示しています。あるリクエストでは機能するのに、他のリクエストでは機能しない理由がわかりません。

4

0 に答える 0