具有受限访问权限的AWS S3公共json文件托管

时间:2019-02-05 08:20:04

标签: amazon-web-services amazon-s3 web-hosting

因此,我一直试图在.json存储桶中托管一些s3文件,这些文件可以通过简单的GET请求进行检索。

我遵循了aws guideline,并设法托管了一些可以公开访问的文件。现在,我可以在浏览器地址栏中键入类似的内容,然后获取我的json文件:

https://s3.amazonaws.com/[my-bucket-name]/[my-file-name].json

或者我也可以在控制台中做到这一点:

curl -X GET https://s3.amazonaws.com/[my-bucket-name]/[my-file-name].json


我现在想做的是为我的文件桶添加一个非常基本的安全性:仅当请求在标头中包含某个API密钥时,我才允许访问。现在,我只需要一种API密钥类型的设计,即所有用户都共享相同的确切api密钥,并且拥有该密钥的任何人都应该能够访问存储桶中的任何文件。

类似curl命令的

 curl -X GET --header "X-ApiKey: wow-such-secret" https://s3.amazonaws.com/[my-bucket-name]/[my-file-name].json

我想知道仅使用S3是否可行。如果我需要使用其他Amazon服务,我应该考虑哪些服务?

我的存储桶策略(我基本上是从aws教程复制粘贴):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::[my-bucket-name]/*"
        }
    ]
}

我还有大约10个小时的AWS和大约1个月的服务器开发经验。

1 个答案:

答案 0 :(得分:3)

您可以将AWS API GATEWAY与lambda函数一起使用以实现您的目标

使用API​​网关进行其余调用,这些调用将在请求中包含您的标头,API网关在其Usage Plans with API Keys中已经实现了此实现,这将允许您创建自己的 api密钥将在请求中传递,以确保只允许使用标头的请求。

然后,您可以将lambda function挂接到API Gateway端点。 lambda函数可以为您的S3资源提供签名的url,也可以从存储桶中返回json数据,但这取决于您的偏好。

您有两个解决方案,它们的流程是:

签名网址解决方案:

(带标头的请求)<->(API GateWay)<->(lambda)-[生成签名的URL] 另一个获取文件桶中文件的请求。 (客户端)+(签名网址)<-> s3Bucket

没有签名的URL: Lambda函数将为您读取/获取文件。 (使用您的标头进行请求)<->(API GateWay)<->(lambda)<-> S3

请注意,将权限设置为S3存储桶上的经过身份验证的只读权限。

如果您仅在存储桶中存储JSON文件数据,建议您使用dynamodb,因为它已经为存储JSON数据进行了优化。