从托管在 S3 存储桶上的站点访问 AWS API 时出现 CORS 问题 [关闭]

Posted

技术标签:

【中文标题】从托管在 S3 存储桶上的站点访问 AWS API 时出现 CORS 问题 [关闭]【英文标题】:CORS issue while accessing AWS API from site hosted on S3 bucket [closed] 【发布时间】:2021-03-13 02:21:09 【问题描述】:

我正在尝试从托管在 S3 存储桶上的表单填充我的 dynamodb。我正在使用 lambda 函数和 API 网关。当我在那里测试它时它工作正常,但是当我尝试从我的表单中发布数据时,我收到了这个错误,

 Access to XMLHttpRequest at 'https://yyyyyyy.execute-api.ap-south-1.amazonaws.com/test' from origin 'http://xyz.s3-website.ap-south-1.amazonaws.com' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

我已在我的 API 网关上启用了 CORS。我在启用 CORS 后部署了它。

我正在使用 AJAX 发布。这是当我单击表单上的按钮时执行的函数。

function submitToAPI(e) 
       e.preventDefault();
       var URL = "https://yx1wm602z6.execute-api.ap-south-1.amazonaws.com/test";

       var name = $("#username").val();
       var desc = $("#desc").val();
       var diff=$("#difficulty").val();
       var dataa = 
        username : name,
          difficult:diff,
          desc : desc
        ;

       $.ajax(
         type: "POST",
         url : "https://yyyyy.execute-api.ap-south-1.amazonaws.com/test",
        
         dataType: "json",
         contentType: 'application/json; charset=utf-8',
         crossDomain: true,
         
         data: JSON.stringify(dataa),

         
         success: function (data) 
           
           alert("Successfull. Thank you for submitting");
           
         ,
         error: function (e) 
           
           alert("UnSuccessfull"+JSON.stringify(e));
         );
     

我在 Python 中填充 DynamoDB 的 lambda 函数如下,

import boto3
import json


dynamodb = boto3.client('dynamodb')

def lambda_handler(event, context):
  username = event['username']

  difficult=event['difficult']
  desc=event['desc']
  
  
  dynamodb.put_item(TableName='users', Item='username':'S':username,'difficult' 
 'S':'difficult','desc':'S':desc)

在我的 S3 存储桶中,我添加了 JSON 格式的 CORS 策略,因为不再支持 XML。

[
    
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    ,
    
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    ,
    
        "AllowedHeaders": [],
        "AllowedMethods": [
            "GET"
        ],
        "AllowedOrigins": [
            "http://xyz.s3-website.ap-south-1.amazonaws.com"
        ],
        "ExposeHeaders": []
    
]

任何形式的建议肯定会对我有所帮助。我一直在寻找解决方案,但实际上没有任何效果。

【问题讨论】:

为什么你的函数中有两个lambda_handler @Marcin 那是个错误。我已经编辑了帖子。很抱歉。 【参考方案1】:

这是一个微小的错误。我没有在我的 API URL 中指定资源名称。添加 URL 解决了。 如果我能得到更好的错误响应就好了。

【讨论】:

以上是关于从托管在 S3 存储桶上的站点访问 AWS API 时出现 CORS 问题 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Python 脚本作为 AWS S3 存储桶上的 Cron

S3 存储桶上的未加密文件是不是有 Etag?

使用 CORS 在 AWS S3 存储桶上获取

AWS S3 静态站点 CORS jquery ajax POST 到 API Gateway

如何解决拒绝访问 aws s3 文件?

S3 存储桶上的 CORS