在远程管理Terraform的状态

在CloudFormation中,堆栈的状态是由AWS进行管理的,但在Terraform中,默认情况下不进行管理。

如果在没有设置状态管理的情况下运行terraform apply命令,则会在本地终端生成状态管理文件。该文件将以terraform.tfstate的名称创建。

状态管理的好处 de

以下是优点。

    • リモートに状態を保存と状態のロックができるため、状態の破損を防ぐことができる

 

    リモートに状態を保存することで、複数人で同じ状態を共有できる

如果采用本地管理,就不会出现计算机损坏无法进行基础设施管理或者状态管理文件丢失的风险。

让我们试着实施

准备一个用于状态管理的堆栈。

在Terraform中,您可以使用S3和DynamoDB进行状态管理。

状態管理ファイルはS3中进行存储,以及使用DynamoDB来防止冲突。

同时,由于官方推荐以以下方式管理状态管理堆栈,因此似乎更好单独进行管理。

以下引用:

“我们不能控制风向,但我们可以调整自己的航向。”

Terraform是一个管理基础设施的管理工具,因此,理想情况下,由Terraform使用的基础设施应该存在于Terraform管理之外。

引用来源:官方网站 – 多账户AWS架构

在这里,由于麻烦,我们将执行以下堆栈以进行构建。

因为表需要具有名为LockID的主键,所以只需要设置这个。

/**
 * state管理用のS3 & DynamoDB 作成用スタック
 * stack ディレクトリ内のtf実行前にこちらを先に実行する
*/

terraform {
  required_version = "0.12.5"
}

provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_s3_bucket" "terraform_state" {
  // ダメだったら別の名前にする
  bucket = "terraform-state-kento75"
  versioning {
    enabled = true
  }
}

resource "aws_dynamodb_table" "terraform_state_lock" {
  name           = "terraform_state_lock"
  read_capacity  = 1
  write_capacity = 1
  hash_key       = "LockID"

  attribute {
   // 必須
    name = "LockID"
    type = "S"
  }
}

创建一个简单的堆栈

通过配置后端,您可以实现使用先前创建的S3和DynamoDB进行状态管理的功能。

terraform {
  required_version = "0.12.5"

  // state lock 設定
  // state管理用 S3, DynamoDB は別管理
  backend "s3" {
    bucket         = "terraform-state-kento75" # state管理用バケット
    region         = "ap-northeast-1"
    key            = "terraform.tfstate"
    encrypt        = true
    dynamodb_table = "terraform_state_lock"
  }
}

请参考此链接以获取其他已实施的堆栈的详细信息。

当执行terraform init命令时,我们可以确认后端已经设置为S3。

$ terraform init

Initializing the backend...

Successfully configured the backend "s3"! Terraform will automatically
use this backend unless the backend configuration changes.

Initializing provider plugins...

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

我来创建一个栈。

$ terraform apply
スクリーンショット 2020-02-29 19.40.26.png

数据将被添加到DynamoDB中。

スクリーンショット 2020-02-29 19.42.52.png

我要试试真的会被锁起来吗?

我們將在另一個會話中同時執行terraform plan,以確認會有什麼操作行為。

先前执行的那个正常运行了,但后来执行的那个会出现以下错误。

$ terraform plan

Error: Error locking state: Error acquiring the state lock: ConditionalCheckFailedException: The conditional request failed
        status code: 400, request id: 86SS1900A1DIKG5ORN24PRLDG3VV4KQNSO5AEMVJF66Q9ASUAAJG
Lock Info:
  ID:        aff55b1a-0cbf-d759-7e3b-e778a391925a
  Path:      terraform-state-kento75/terraform.tfstate
  Operation: OperationTypePlan
  Who:       kento@KentonoMacBook-Pro.local
  Version:   0.12.5
  Created:   2020-02-29 10:46:17.720234 +0000 UTC
  Info:      


Terraform acquires a state lock to protect the state from being written
by multiple users at the same time. Please resolve the issue above and try
again. For most commands, you can disable locking with the "-lock=false"
flag, but this is not recommended.

总结

通过实现Terraform的后端功能,可以防止多人操作时发生意外事故,因此建议尽可能进行实施。

广告
将在 10 秒后关闭
bannerAds