将Cloudfront S3用于静态资产的AWS Guidance-用于API调用的EC2

时间:2018-11-19 21:24:34

标签: amazon-web-services amazon-s3 amazon-ec2 amazon-cloudfront

我正在尝试让我的静态网站向EC2实例发送一些非常基本的API调用-任何人都可以分享最佳实践或为我指明正确的方向吗?

当前设置如下:

  • 反应包和静态资产在cloudfront / s3上提供
  • 通过ACM管理的SSL并自动应用于我的Cloudfront部署
  • 通过Route 53注册和管理域

似乎我有两个选择-通过Cloudfront传递API调用(似乎无法使它正常工作)或允许跨源客户端并将我的axios请求指向另一个IP。以这种方式允许CORS被认为是不好的做法吗?

对于第一个选项,我在cloudfront上创建了第二个起点,并将其指向路由53 DNS,该DNS指向我的ec2弹性IP。问题是,尽管在我的Cloudfront控制台中的所有来源上启用了POST,我仍无法使API正常工作:

select i.Date, i.No,sum(CASE WHEN t.VAT<>'no'  THEN 
amount ELSE 0 END) as  Excluding_VAT,
sum(t.amt_vat)as vatamount,
sum(CASE WHEN t.VAT='no' THEN amount ELSE 0 END) as  NonVat,
sum(t.amt_vat+t.amount)as totamt
from a i join b t on i.ID=t.ID
where i.Date between '1991-11-18' and '1995-11-19'
group by i.ID,i.No,i.Date

除了健全性检查设置外,我想我的问题如下:

  • 我是否需要在我的EC2实例上运行某种证书?我目前正在将我的静态资产的所有HTTP重定向到HTTPS-这如何适应React中使用axios进行api调用?当客户端通过https连接时,api调用会自动通过443发送吗?

  • 是否有更好的方法来完成我尝试做的事情?这是一个具有电子邮件表单的个人网站(仅因为它不能完全静态)-我在后端运行的是一个非常轻巧的节点实例,该实例将电子邮件发送给所有者

非常感谢您的时间和帮助!我很感激

1 个答案:

答案 0 :(得分:0)

对于任何试图通过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网关的指南:

https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html

这是我发现的指南,该指南描述了如何创建类似(高度可扩展)的堆栈:

https://www.codeengine.com/articles/process-form-aws-api-gateway-lambda/

谢谢!