amazon-web-services - 在计费恐慌中锁定公共站点访问
问题描述
作为 AWS 海洋中的一条小鱼,可怕的事情之一是,在公开服务的大量交易发生的不太可能发生的情况下,似乎是无限责任。AWS 专为大人物而设计,对他们而言,可用性是最重要的。在保持服务正常方面付出了很多努力,但在将我们从天文账单中拯救出来时显然没有。亚马逊似乎多次被要求设置支出上限,但 AFAIK,他们想出的最好的办法是账单提醒。我读过一些恐怖故事,比如有人为家人和朋友建立了一个小型网站并收到了 10,000 美元的账单。亚马逊做得最好的就是提供账单提醒,如果你是 AFK 怎么办?在您关闭之前,相当大的金额可能会消失。
所以,我的狡猾计划 - 编写一个 Lambda 从一个计费阈值事件中触发,该事件会提升吊桥并关闭任何面向公众的设施。
所以,我从 CloudFront 开始,这是非常可行的,尽管禁用分发需要一些时间来传播。
现在我们来到了我的第一个技术难题。我以为我可以检查所有存储桶的公共权限并撤销它们。但是,自从我上次详细查看 S3 以来,就有了这个静态网站设置。那么,我如何以编程方式将其关闭?显然我不想删除存储桶。令我惊讶的是,打开它并不会在 ACL 中创建公共权限。API 中有一项服务可以更新这些静态网站之一的属性,但不能撤销它。
API网关似乎有点相同。您可以删除 API,但不能暂停它。如果你删除它,那么重新构建可能会给你一个不同的主机名,这会产生一些麻烦。
我正在尝试编写一个相当通用的 Lambda 并将其设为公共域。
解决方案
回答你的问题...
对于 API Gateway,您可以通过创建或更新使用计划将其限制为 0来锁定它。这意味着对该 API 的任何请求都将以HTTP 429 — To many requests
. 过去,AWS 确实对受限制的请求收费,但自 2016 年以来,情况不再如此,因此 0 的限制率限制将阻止您的 API 被使用或产生费用。(如果您想立即锁定它,您还应该同时将油门爆发设置为 0。)
对于 S3,您可以通过阻止整个账户或特定存储桶的所有公共访问来锁定存储桶。
更简单的方法
话虽如此,我认为所有这些都有一个更简单的解决方案。您可以将 API Gateway 用作S3或几乎任何 AWS 服务的代理端点。然后,您可以使用每月、每周或每日配额为该端点设置 UsagePlan,从而限制允许对该 API 网关端点的 API 请求总数。
这样做的好处是您不必只对预算通知做出反应。您可以主动设置网站的使用量限制。但是,您确实需要记住,这种方法并不能完全保护您免受巨额账单的影响。(如果您允许公开访问将文件上传到您的 S3 存储桶,则可能有人上传了 5TB 的文件,这将产生大约 100 美元/月的存储成本。但是,这种情况不太可能发生,并且很容易通过不允许上传。)您还需要了解您使用的服务的定价模型,以便为您的代理 API 设置适当的限制。
推荐阅读
- reactjs - Create-react-app 作为依赖,类似于 storybook
- c# - 在 ServiceFabric 的 RunAsync() 中模拟取消令牌请求
- unity3d - Unity 中带有 moshi 的 ClassNotFoundException
- oracle - JBOSS 找不到驱动模块
- c# - 由于第三方 cookie,Auth0 锁定在 Safari IOS 12 上被阻止
- javascript - 使用 javascript 检查我的 html 表是否为空
- delphi - IXMLDocument AddChild 中的内存泄漏(节点)
- python - 在 macOS 10.14.2 上安装 Python 3.7.2 失败
- angular - 将 Angular 应用程序部署到 S3 后,没有发生任何变化
- c++ - 为什么表达式 'a++ += b' 会出错?