如何处理 AWS 中的开发和生产环境? [关闭]

Posted

技术标签:

【中文标题】如何处理 AWS 中的开发和生产环境? [关闭]【英文标题】:How do I handle development and production environments in AWS? [closed] 【发布时间】:2020-10-19 19:38:18 【问题描述】:

构建要在生产中启动的应用程序 - 不确定如何处理 AWS 上的开发/生产环境。

如果我使用多个存储桶、多个 DynamoDB 表、多个 Lambda 函数、多个 Elastic Search 实例、EC2、API 网关 - 拥有生产和开发环境似乎超级麻烦?

目前只有一个环境,一旦应用上线 - 任何更改都会改变生产环境。

那么您如何处理 AWS 上的两个环境?我能想到的唯一方法是复制每个 lambda 函数、每个数据库、每个 EC2 实例、每个 API 和存储桶……但这将花费双倍的价格,并且一旦上线更新就非常繁琐。

有什么建议吗?

【问题讨论】:

【参考方案1】:

有几种方法。但是,无论选择哪种方式,我都发现最好尽可能多地保留基础设施作为代码。这在环境设置和可恢复性方面提供了最大的灵活性。

有单独帐户方法

创建一个新帐户 将所有对象(EC2、S3 等)移至此帐户 如果您将大部分基础设施作为代码使用并且不受 git 等版本控制的影响,这很容易完成 - 因为您可以使用 AWS Cloudformaton。 确保将 s3 存储桶重命名为全球唯一且合规的名称

然后,您将运行 2 个独立的所有实例。但是,您可以实施一些成本控制,例如更小的 EC2 实例。或者,您可以在不使用时删除整个 Cloudformation 堆栈,然后在需要时启动它。这种方法在时间方面有更多的前期成本,但从长远来看,它可以节省美元。另外,从安全角度来看,帐户分离非常有用。

单一帐户方法

这可能会有点混乱,但有几个功能可以帮助您将一个帐户拆分为开发和生产。

Lambda 版本控制。如果您使用 lambdas,您可以获得版本控制和别名。这实际上意味着您可以使用相同的函数名称设置一个生产版本和开发版本的 lambda。

API 网关方式具有“阶段”。这是一种有效的环境,您可以标记一个生产和一个开发,以分离单个 API 的关注点。

S3 存储桶。您始终可以在目录 S3://mybucket/prod/ 和 s3://mybuckey/dev/ 的顶层创建一个密钥。这有点乱,但比将所有内容都放在一个目录中要好。

但是,您真正需要问的是,在此用例中运行第二个帐户与一个帐户相比实际花费多少?答案可能差不多。

这就是 AWS 和一般云计算的优势。您只需为使用的内容付费。跨两个帐户运行 lambda 的成本与在一个帐户中运行一个 lambda 相同,但调用次数完全相同。

两个帐户的方法还可以更清楚地了解正在发生的事情,并有助于防止生产中的问题,即开发代码段因为都在一个帐户中而进入。

【讨论】:

【参考方案2】:

我建议使用两个 AWS 帐户。然后制作一个 CloudFormation 模板来供应您需要的所有资源。一旦您制作了模板,它就不再繁琐,并且拥有并排的环境可以轻松地在代码更新上线之前对其进行测试。在生产环境中测试更改不是一个好主意。

是的,这意味着成本翻倍,但您始终可以在完成测试后删除您的 pre-prod 帐户中的 CloudFormation 堆栈,这样就没有空闲资源了。您只需在需要测试时将它们旋转起来,然后在完成后将它们旋转下来。因此,当您进行测试时,您只会在那么短的时间内将成本翻倍。实时推送更改只是更新 CloudFormation 堆栈的问题。

这些云功能首先是迁移到云的一大卖点——它们可以解决您描述的问题,并不麻烦,但确实需要在构建方面进行投资CloudFormation 模板(基础架构即代码)。

【讨论】:

以上是关于如何处理 AWS 中的开发和生产环境? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 AWS 中的大型 WAR 文件?

使用Vagrant来管理开发和生产环境?

如何处理 aws-appsync 中的关系?

如何处理 AWS Redshift 卸载命令中的引用值?

真实生产案例消息中间件如何处理消费失败的消息?

AWS Glue:如何处理具有不同架构的嵌套 JSON