首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用terraform进行terraform后端的初始设置

使用terraform进行terraform后端的初始设置
EN

Stack Overflow用户
提问于 2017-12-21 03:23:09
回答 15查看 24.3K关注 0票数 76

我刚刚开始使用terraform,我希望能够使用作为后端来存储我的项目状态。

代码语言:javascript
复制
terraform {
    backend "s3" {
      bucket = "tfstate"
      key = "app-state"
      region = "us-east-1"
    }
}

我觉得用terraform为后端存储基础设施设置我的S3存储桶、IAM组和策略是明智的。

如果我在应用初始terraform基础设施之前设置后端状态,它会合理地抱怨后端存储桶尚未创建。因此,我的问题变成了,如何使用terraform设置我的terraform后端,同时保持terraform跟踪的后端的状态。看起来像是嵌套的玩偶问题。

我有一些关于如何围绕这个问题编写脚本的想法,例如,检查存储桶是否存在或是否设置了某个状态,然后引导terraform,最后在第一次运行后将terraform tfstate从本地文件系统复制到s3。但在走上这条艰难的道路之前,我想我应该确保我没有遗漏一些显而易见的东西。

EN

回答 15

Stack Overflow用户

发布于 2018-01-21 07:59:25

要使用terraform远程状态进行设置,我通常在我的dev和prod terraform文件夹中有一个名为remote-state的单独文件夹。

下面的main.tf文件将为您发布的内容设置远程状态:

代码语言:javascript
复制
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表名中添加一些内容,以分隔不同的环境。

票数 75
EN

Stack Overflow用户

发布于 2018-10-15 05:01:44

基于Austin Davis的巨大贡献,下面是我使用的一个变体,其中包括对数据加密的要求:

代码语言:javascript
复制
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
}
票数 23
EN

Stack Overflow用户

发布于 2017-12-25 13:58:34

正如您已经发现的,您不能首先使用terraform来构建terraform所需的组件。

虽然我理解让terraform“追踪一切”的倾向,但这是非常困难的,而且比它的价值更令人头疼。

我通常通过创建一个简单的bootstrap shell脚本来处理这种情况。它会创建类似这样的东西:

  1. 用于状态存储的s3存储桶
  2. 将版本控制添加到所述存储桶
  3. 具有terraform builds

所需特定策略的terraform IAM用户和组

虽然你应该只需要运行一次(从技术上讲),但我发现当我开发一个新系统时,我会反复旋转和拆卸东西。因此,将这些步骤放在一个脚本中会使操作变得简单得多。

我通常将脚本构建为幂等。这样,您就可以多次运行它,而不必担心创建重复的存储桶、用户等

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47913041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档