当前位置:   article > 正文

通过AWS CloudFront Functions解决S3静态站点/路径打开的问题_s3路径

s3路径

通过AWS CloudFront映射到S3来搭建静态站点时,连接S3一般有两种途径,一种在S3直接启动静态站点(Static website hosting),这样CloudFront只能把S3无差别的作为一个静态站点来连接,在安全保护上只能通过HTTP Headers来进行验证;另外一种则是直接让CloudFront连接S3获取数据,这种方式的Origin Type就是S3,而连接时则可以通过(Origin access control settings)来设置一个比较精细的Policy来控制访问(在S3中可以选择Block all public access),就是可以在S3的Permissions中配置一个类似下面这种的Policy:

  1. {
  2. "Version": "2008-10-17",
  3. "Id": "PolicyForCloudFrontPrivateContent",
  4. "Statement": [
  5. {
  6. "Sid": "AllowCloudFrontServicePrincipal",
  7. "Effect": "Allow",
  8. "Principal": {
  9. "Service": "cloudfront.amazonaws.com"
  10. },
  11. "Action": "s3:GetObject",
  12. "Resource": "arn:aws:s3:::<YOUR_BUCKET>/*",
  13. "Condition": {
  14. "StringEquals": {
  15. "AWS:SourceArn": "arn:aws:cloudfront::1234567890:distribution/ABCDEFGHIJK12345"
  16. }
  17. }
  18. }
  19. ]
  20. }

当然上面这个Policy是CloudFront可以帮助生成的,只需要粘贴到S3的Bucket的Permissions中Bucket Policy中就可以。

这种方式虽然安全,但是也存在一个问题,就是CloudFront只是默认通过s3:GetObject来拿S3中的item,在静态站点直接访问/PATH/这样的路径时,并不能去取对应S3目录下的index.html,只能直接404。

所以这里就需要通过CloudFront的Functions功能,对请求进行改写,也就是要把对/PATH/的请求改写为/PATH/index.html,这样才能让站点正常的响应路径请求。

我们首先在CloudFront的Functions建立一个函数PathToIndexHtml, 这个函数的runtime选cloudfront-js-2.0就行,函数体非常简单

  1. function handler(event) {
  2. var request = event.request;
  3. if(request.uri.endsWith('/')) {
  4. request.uri = request.uri + 'index.html';
  5. }
  6. return request;
  7. }

然后在CloudFront对应的Distribution中的Behavior的属性中,编辑Function associations,在viewer request中Function Type选择CloudFront Functions,然后Function ARN/Name就直接选择刚才创建的函数就然后保存生效可以了。

这样就可以在CloudFront Functions辅助下,让CloudFront可以正常在Origin Type为S3的情况下访问了路径请求了。

另外说明一一下CloudFront Functions的并发支持非常高,对性能几乎没有影响。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/707255
推荐阅读
相关标签
  

闽ICP备14008679号