0

我正在开发一个由许多服务组成的 Datalake 项目:1VPC(+ 子网、安全组、互联网网关……)、S3 存储桶、EMR 集群、Redshift、ElasticSearch、一些 Lambdas 函数、API Gateway 和 RDS。

我们可以说有些资源是“静态的”,因为它们只会被创建一次并且以后不会改变,例如:VPC + 子网和 S3 存储桶

其他资源将在开发和生产项目生命周期中发生变化。

我的问题是管理项目结构的最佳方法是什么?

我最初是这样开始的:

-modules
  .rds
    .main.tf
    .variables.tf
    .output.tf
  -emr
  -redshift
  -s3
  -vpc
  -elasticsearch
  -lambda
  -apigateway
.main.tf
.variables.tf

所以这样我只需要做一个terraform apply它就可以部署所有的服务。

第二个选项(我看到一些开发人员使用它)是每个服务都将位于一个单独的文件夹中,然后我们只进入我们想要启动它的服务的文件夹然后执行terraform apply

在这个项目中,我们将有 2 到 4 名开发人员,我们中的一些人只会在单独的资源上工作。

你建议我遵循什么策略?或者,也许您有其他想法和最佳实践?

谢谢你的帮助。

4

1 回答 1

0

我们这样做的方式是为每个服务使用单独的模块,并使用一个“基础”模块来设置 VPC、子网、安全策略、CloudTrail 等。

每个服务的模块都尽可能独立。例如,我们的 RDS 集群模块创建集群、安全组、所有必要的 IAM 策略、Secrets Manager 条目、用于监控的 CloudWatch 警报等。

然后我们在顶部有一个部署“模块”,其中包括基础模块以及它需要的任何其他模块。每个 AWS 账户一个部署,因此我们为我们的开发账户、我们的产品账户等进行了部署。

部署模块是我们设置任何模块间通信的地方。例如,如果 Web 服务器需要与 RDS 集群通信,我们将创建一个安全组规则,将来自 Web 服务器模块的 SG 连接到来自 RDS 模块的 SG(两个模块都将其安全组 ID 作为输出传回)。

将部署视为模块的购物清单并在它们之间进行拼接。

如果您正在处理一个模块并且更改是独立的,您可以执行 terraform apply -target=module.modulename 来更改您的内容,而不会干扰其他人。当您的帐户有大量资源时,这也很方便,因此计划和申请可以更快地运行。

PS 我还强烈建议您使用 DynamoDB 为存储在 S3 中的 Terraform 设置远程状态以进行锁定。如果您有多个开发人员,您不想尝试自己管理状态文件,您将破坏彼此的工作。我通常在设置远程状态的部署模块中有一个 state.tf 文件。

于 2019-06-06T22:41:17.567 回答