amazon-web-services - 使用 Cloudfront S3 处理静态资产的 AWS 指南 - EC2 用于 API 调用
问题描述
我正在尝试让我的静态网站向 EC2 实例发送一些非常基本的 API 调用——任何人都可以分享最佳实践或为我指明正确的方向吗?
当前设置如下:
- React 捆绑包和静态资产在 cloudfront / s3 上提供
- SSL 通过 ACM 管理并自动应用于我的 Cloudfront 部署
- 通过 Route 53 注册和管理的域
似乎我有两个选择 - 通过云端传递 API 调用(似乎无法让它工作)或允许跨源客户端并将我的 axios 请求指向不同的 IP。以这种方式允许 CORS 是否被认为是不好的做法?
对于第一个选项,我在 cloudfront 上创建了第二个源,并将其指向路由 53 DNS,该路由指向我的 ec2 弹性 IP。问题是,尽管在我的云端控制台中对所有来源启用了 POST,但我无法让 API 工作:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>MethodNotAllowed</Code>
<Message>The specified method is not allowed against this resource.</Message>
<Method>POST</Method>
<ResourceType>OBJECT</ResourceType>
<RequestId>2B5DB5E28188BE4A</RequestId>
<HostId>yXiiLTR5v8KERjzbG3fx4BGcZG5FO0e3Yufa0b9aC2W3sMyuOK3BBADtZj097T8E0qBZ3F/rBC8=</HostId>
</Error>
我想我的问题,除了健全性检查设置如下:
我是否需要在我的 EC2 实例上运行某种证书?我目前正在为我的静态资产将所有 HTTP 重定向到 HTTPS - 这如何适合在 React 中使用 axios 进行 api 调用?当客户端通过 https 连接时,api 调用会自动通过 443 发送吗?
有没有更好的方法来完成我正在尝试做的事情?这是一个带有电子邮件表单的个人网站(只是因为它不能是完全静态的)——我在后端运行的只是一个非常轻量级的节点实例,它可以向所有者发送电子邮件
非常感谢您的时间和帮助!我很感激
解决方案
对于任何试图使此设置与 CloudFront CDN 一起使用的人 - 使用 lambda 函数是最好的方法。创建一个 Lambda 函数来处理每个请求并使用 AWS API Gateway 进行管理。
必须使用以下代码片段在您的 S3 存储桶上启用 CORS:
`<CORSConfiguration>
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
<MaxAgeSeconds>3000</MaxAgeSeconds>
</CORSRule>
</CORSConfiguration>`
另外,我从这个练习中学到的一些东西可能会帮助其他人:每当客户端向您的端点发送 OPTIONS 请求时,您需要返回带有这些标头的 200。这可以在您选择的任何后端完成,但这里有一个 API Gateway 指南:
https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html
这是我发现的指南,描述了如何创建类似的(高度可扩展的)堆栈:
https://www.codeengine.com/articles/process-form-aws-api-gateway-lambda/
谢谢!
推荐阅读
- spring-boot - SpringDoc app-doc.yaml 不显示招摇文档
- jberet - JBeret 排队机制
- javascript - 当我的井字游戏是 O 时,我的井字游戏如何将获胜者返回为 X
- csv - bash 脚本继续显示“不存在。文件”
- flutter - 在相机应用程序中添加矩形覆盖并在颤动中裁剪肖像图像
- json - 使用高阶函数从帐户中提取联系人
- spring-boot - SecurityConfig 中出现 SpringSecurity + AWS Cognito 连接错误
- c# - 单击一个 Windows 弹出窗口
- regex - Powershell - 如何根据各种字符和 10 位数字拆分字符串?
- python - 如何在 Python 中仅返回选定的 API 参数