AWS S3 public json 文件托管,访问受限

AWS S3 public json filie hosting with restricted access

所以我一直在尝试做的是在我的 s3 存储桶中托管一些 .json 文件,这些文件可以通过简单的 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 是否可行。如果我需要使用其他亚马逊服务,我应该查看哪些服务?

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

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

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

您可以使用 AWS API GATEWAY 和 lambda 函数来实现您的目标

将 API 网关用于将在请求中包含您的 header 的 rest 调用,API 网关在其 Usage Plans with API Keys 中已经有这样的实现,这将允许您创建自己的 api 密钥 ,它将在请求中传递,确保只允许使用您的 header 的请求。

然后您可以将 lambda function 连接到您的 API 网关端点。 lambda 函数可以为您的 S3 资源提供已签名的 url 或 return 来自存储桶的 json 数据,但这取决于您的偏好。

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

签名Url解决方案:

(使用您的 header 请求)<--> (API GateWay) <--> (lambda) -[生成签名 url] 另一个获取存储桶中文件的请求。 (客户端)+(已签名 url)<--> s3Bucket

没有签名 URL: Lambda 函数将为您 read/get 文件。 (用你的 header 请求)<--> (API GateWay) <--> (lambda) <--> S3

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

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