2017-04-04 46 views
8

我们的Terraform布局使我们能够为许多aws(100+)帐户运行Terraform,并将Terraform状态文件远程保存到中央S3存储桶。使用DynamoDB的Terraform状态锁定

新的锁定功能听起来很有用,希望实现它,但我不确定是否可以在与S3存储桶相同的帐户中使用中央DynamoDB表,或者是否需要在每个表中创建一个DynamoDB表的AWS账户?

回答

6

您可以使用单个DynamoDB表来控制所有帐户的状态文件锁定。即使您有多个S3存储桶来存储状态,这也可以工作。

DynamoDB表的键是LockID which is set as a bucketName/path。所以只要你有一个独特的组合,你会很好(你应该或者你有更大的问题与你的国家管理)。

显然,您需要设置跨帐户IAM策略,以允许用户在一个帐户中创建事物,以便能够管理DynamoDB中的项目。

+0

谢谢,我会尽快回复并反馈。 – user1619524

+0

对此有何反馈? – reedobrien

+0

是的,试过了,它对我来说工作得很好。我手动设置了表格,然后通过.tf文件将terraform连接到它。注意:我使用Jirawat的其他答案作为语法示例(在用法示例下)。此外,我正在使用terraform 0.9.7,所以我不得不使用lock_table而不是用于更高版本的dynamodb_table。 – kjbradley

3

要使用terraform DynamoDB锁定,进行如下

1.创建一个AWS DynamoDB的步骤与terraform锁定terraform.tfstate。

provider "aws" { 
    region = "us-east-2" 
} 


resource "aws_dynamodb_table" "dynamodb-terraform-lock" { 
    name = "terraform-lock" 
    hash_key = "LockID" 
    read_capacity = 20 
    write_capacity = 20 

    attribute { 
     name = "LockID" 
     type = "S" 
    } 

    tags { 
    Name = "Terraform Lock Table" 
    } 
} 

2.Execute terraform到AWS创建DynamoDB表

terraform申请

用法示例

1.使用DynamoDB表锁定terraform.state创建在AWS上。作为EC2示例

terraform { 
    backend "s3" { 
    bucket = "terraform-s3-tfstate" 
    region = "us-east-2" 
    key = "ec2-example/terraform.tfstate" 
    dynamodb_table = "terraform-lock" 
    encrypt = true 
    } 
} 

provider "aws" { 
    region = "us-east-2" 
} 

resource "aws_instance" "ec2-example" { 
    ami = "ami-a4c7edb2" 
    instance_type = "t2.micro"  
} 

dynamodb_table值必须与我们创建的DynamoDB表的名称匹配。

2.Initialize的terraform S3和DynamoDB后端

terraform初始化

3.Execute terraform创建EC2服务器

terraform申请

看到代码,去 Github DynamoDB Locking Example