我正在从事一个由许多服务组成的Datalake项目:1VPC(+子网,安全组,Internet网关,...),S3存储桶,EMR集群,Redshift,ElasticSearch,一些Lambdas函数,API网关和RDS
我们可以说某些资源是“静态的”,因为它们只会创建一次,将来不会更改,例如:VPC +子网和S3存储桶
其他资源将在开发和生产项目生命周期中发生变化。
我的问题是管理项目结构的最佳方法是什么?
我首先是这样开始的:
-modules
.rds
.main.tf
.variables.tf
.output.tf
-emr
-redshift
-s3
-vpc
-elasticsearch
-lambda
-apigateway
.main.tf
.variables.tf
这样,我只需要执行 terraform apply
即可部署所有服务。
第二个选项(我看到一些开发人员正在使用它)是每个服务将位于单独的文件夹中,然后我们只进入要启动它的服务的文件夹,然后执行 {{1} }
我们将是这个项目的2至4个开发人员,我们中的一些人只会使用单独的资源。
您建议我遵循什么策略?或者,也许您还有其他想法和最佳做法?
感谢您的帮助。
答案 0 :(得分:0)
我们的工作方式是为每个服务使用单独的模块,并使用一个“基础”模块来设置VPC,子网,安全策略,CloudTrail等。
每种服务的模块都尽可能独立。例如,我们的RDS集群的模块创建集群,安全组,所有必要的IAM策略,Secrets Manager条目,用于监视的CloudWatch警报等。
然后,在顶部有一个部署“模块”,其中包括基础模块及其所需的任何其他模块。每个AWS帐户一个部署,因此我们为我们的开发帐户,产品帐户等进行了部署。
部署模块是我们设置模块间通信的地方。例如,如果Web服务器需要与RDS群集通信,我们将创建一个安全组规则,以将Web服务器模块中的SG连接到RDS模块中的SG(两个模块都将其安全组ID作为输出传递回去)。
将部署视为模块的购物清单,并在模块之间进行拼接。
如果您正在处理模块,并且更改是独立的,则可以执行terraform apply -target = module.modulename更改您的操作,而不会干扰其他操作。如果您的帐户有很多资源,这也很方便,因此计划和应用程序可以更快地运行。
P.S。我还强烈建议您使用DynamoDB为S3中存储的Terraform设置远程状态以进行锁定。如果您有多个开发人员,则您不想自己去管理状态文件,而会破坏彼此的工作。我通常在部署模块中有一个state.tf文件来设置远程状态。