2017-06-21 130 views
3

Terraform 0.9.5。Terraform共享状态

我在组建一个小组,我们的基础架构团队和自动化团队将使用以标准方式,进而创建资源模块的过程中创建堆栈来提供不同的ENVS。一切运作良好。

喜欢用terraform共享状态的所有球队成为一个问题。我已经配置terraform来使用s3后端,它是版本化和加密的,通过一个Dynamo数据库表添加了一个锁。完善。所有具有本地户口的工作...好问题...

我们有多个AWS账户,1 IAM,1计费,1进行生产,1用于非生产,1共享服务等...你会得到我要去的地方。我的问题如下。

我作为用户在我们的IAM帐户进行身份验证,并承担所需的角色。直到我引入terraform后端配置才能将s3用于共享状态之前,这一直像梦一样工作。它看起来像terraform内的后端配置需要在〜/ .aws/credentials中设置默认凭证。它看起来像这些必须是s3存储桶创建帐户的本地用户。

有没有办法让后台的配置设置这样一种方式,它会使用供应商中配置vim的信任状和作用?有没有更好的方式来配置共享状态和锁定?任何建议表示欢迎:)

更新:得到这个工作。我在创建s3存储桶的帐户中创建了一个新用户。创建了一个策略,在特定的s3存储桶和dynamodb表上允许新用户s3:DeleteObject,GetObject,PutObject,ListBucket和dynamodb:*。创建一个自定义凭证文件并添加分配给该新用户的访问密钥和密钥的默认配置文件。使用后端配置类似于

terraform { 
required_version = ">= 0.9.5" 

backend "s3" { 
bucket     = "remote_state" 
key      = "/NAME_OF_STACK/terraform.tfstate" 
region     = "us-east-1" 
encrypt     = "true" 
shared_credentials_file = "PATH_TO_CUSTOM_CREDENTAILS_FILE" 
lock_table    = "MY_LOCK_TABLE" 
} 
} 

它的工作原理,但有一个初始配置需要发生在您的配置文件,以使其工作。如果有人知道更好的设置或可以识别我的后端配置问题,请让我知道。

+0

从你的描述来看,很多主要的观点都是基于这个观点的。 Terraform从不要求您共享状态文件。 – BMW

+0

它似乎按预期工作。我为每个堆栈使用不同的密钥,并使用一个dynamodb表。 – DMcKenna

回答

3

Terraform预计后端配置是静态的,并且不允许它包含插值变量,因为在配置中的其他地方可能会出现这种情况,因为在完成其他工作之前需要对后端进行初始化。

由于这个原因,使用不同的AWS账户多次应用相同的配置可能会非常棘手,但有两种方法是可能的。


最低摩擦的方式是建立一个单一的S3桶和DynamoDB表专用于状态存储在所有的环境中,并使用S3许可和/或IAM政策施加粒状访问控制。

采用此策略的组织有时会在单独的“管理”AWS账户中创建S3存储桶,然后将存储区中的各个状态对象的限制访问授予将在其他每个账户中运行Terraform的特定角色。

该解决方案的优点是,一旦在S3中正确设置了Terraform,就可以常规地使用Terraform,而无需任何不寻常的工作流程:在后端配置单个S3存储桶,并通过环境变量提供适当的凭据, 。一旦后端初始化,使用state environments(即将在Terraform 0.10中将其重命名为工作空间)为单个配置的每个目标环境创建单独的状态。

当然,缺点是需要管理围绕S3的更复杂的访问配置,而不是简单地依靠整个AWS账户的粗略访问控制。由于DynamoDB上的访问控制功能不够灵活,因此DynamoDB也更具挑战性。


如果一个复杂的结构S3是不希望的,复杂度可以被替代地使用partial configuration移入Terraform工作流程。在此模式下,配置中仅提供了一部分后端设置,运行terraform init时在命令行上提供了其他设置。

这使得选项运行之间有所不同,但因为它需要额外的参数,以提供采用这种方法将使用包装脚本适当地根据当地惯例配置Terraform大多数组织。这可以只是一个简单的shell脚本,它运行带有合适参数的terraform init

然后这允许通过在命令行上提供自定义凭证文件来改变自定义凭证文件。在这种情况下,不使用状态环境,相反,在环境之间切换需要根据新的后端配置重新初始化工作目录。

该解决方案的优势在于,只要差异可以表示为CLI选项,它就不会对S3和DynamoDB的使用施加任何特定的限制。

缺点是需要异常的工作流程或包装脚本来配置Terraform。