我刚刚开始使用terraform,我希望能够使用作为后端来存储我的项目状态。
terraform {
backend "s3" {
bucket = "tfstate"
key = "app-state"
region = "us-east-1"
}
}我觉得用terraform为后端存储基础设施设置我的S3存储桶、IAM组和策略是明智的。
如果我在应用初始terraform基础设施之前设置后端状态,它会合理地抱怨后端存储桶尚未创建。因此,我的问题变成了,如何使用terraform设置我的terraform后端,同时保持terraform跟踪的后端的状态。看起来像是嵌套的玩偶问题。
我有一些关于如何围绕这个问题编写脚本的想法,例如,检查存储桶是否存在或是否设置了某个状态,然后引导terraform,最后在第一次运行后将terraform tfstate从本地文件系统复制到s3。但在走上这条艰难的道路之前,我想我应该确保我没有遗漏一些显而易见的东西。
发布于 2018-01-21 07:59:25
要使用terraform远程状态进行设置,我通常在我的dev和prod terraform文件夹中有一个名为remote-state的单独文件夹。
下面的main.tf文件将为您发布的内容设置远程状态:
provider "aws" {
region = "us-east-1"
}
resource "aws_s3_bucket" "terraform_state" {
bucket = "tfstate"
versioning {
enabled = true
}
lifecycle {
prevent_destroy = true
}
}
resource "aws_dynamodb_table" "terraform_state_lock" {
name = "app-state"
read_capacity = 1
write_capacity = 1
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
}然后使用cd remote-state进入这个文件夹,运行terraform init && terraform apply -这应该只需要运行一次。您可以在存储桶和dynamodb表名中添加一些内容,以分隔不同的环境。
发布于 2018-10-15 05:01:44
基于Austin Davis的巨大贡献,下面是我使用的一个变体,其中包括对数据加密的要求:
provider "aws" {
region = "us-east-1"
}
resource "aws_s3_bucket" "terraform_state" {
bucket = "tfstate"
versioning {
enabled = true
}
lifecycle {
prevent_destroy = true
}
}
resource "aws_dynamodb_table" "terraform_state_lock" {
name = "app-state"
read_capacity = 1
write_capacity = 1
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
}
resource "aws_s3_bucket_policy" "terraform_state" {
bucket = "${aws_s3_bucket.terraform_state.id}"
policy =<<EOF
{
"Version": "2012-10-17",
"Id": "RequireEncryption",
"Statement": [
{
"Sid": "RequireEncryptedTransport",
"Effect": "Deny",
"Action": ["s3:*"],
"Resource": ["arn:aws:s3:::${aws_s3_bucket.terraform_state.bucket}/*"],
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
},
"Principal": "*"
},
{
"Sid": "RequireEncryptedStorage",
"Effect": "Deny",
"Action": ["s3:PutObject"],
"Resource": ["arn:aws:s3:::${aws_s3_bucket.terraform_state.bucket}/*"],
"Condition": {
"StringNotEquals": {
"s3:x-amz-server-side-encryption": "AES256"
}
},
"Principal": "*"
}
]
}
EOF
}发布于 2017-12-25 13:58:34
正如您已经发现的,您不能首先使用terraform来构建terraform所需的组件。
虽然我理解让terraform“追踪一切”的倾向,但这是非常困难的,而且比它的价值更令人头疼。
我通常通过创建一个简单的bootstrap shell脚本来处理这种情况。它会创建类似这样的东西:
所需特定策略的terraform IAM用户和组
虽然你应该只需要运行一次(从技术上讲),但我发现当我开发一个新系统时,我会反复旋转和拆卸东西。因此,将这些步骤放在一个脚本中会使操作变得简单得多。
我通常将脚本构建为幂等。这样,您就可以多次运行它,而不必担心创建重复的存储桶、用户等
https://stackoverflow.com/questions/47913041
复制相似问题