web-dev-qa-db-ja.com

DynamoDBを使用したTerraform状態のロック

Terraformレイアウトは、多くのaws(100+)アカウントに対してTerraformを実行し、Terraform状態ファイルを中央のS3バケットにリモートで保存するようになっています。

新しいロック機能は便利に聞こえ、実装したいのですが、S3バケットと同じアカウントで中央のDynamoDBテーブルを利用できるかどうか、または各AWSアカウントでDynamoDBテーブルを作成する必要があるかどうかわかりません?

11
user1619524

Terraform DynamoDBロックを使用するには、以下の手順に従います

1.terraformを使用してAWSDynamoDBを作成し、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. terraformを実行して、AWSでDynamoDBテーブルを作成します

terraform apply

使用例

1. DynamoDBテーブルを使用して、AWSでのterraform.stateの作成をロックします。 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. terraformS3およびDynamoDBバックエンドを初期化します

terraform init

3.terraformを実行してEC2サーバーを作成します

terraform apply

コードを確認するには、 Github DynamoDB Locking Example に移動します。

11

単一のDynamoDBテーブルを使用して、すべてのアカウントの状態ファイルのロックを制御できます。これは、状態を保存するS3バケットが複数ある場合でも機能します。

DynamoDBテーブルは LockID、bucketName/pathとして設定されます にキー設定されています。あなたがそれらのユニークな組み合わせを持っている限り、あなたは大丈夫です(あなたはあなたの状態管理にもっと大きな問題を抱えているべきです)。

明らかに、1つのアカウントでモノを作成するユーザーがDynamoDBのアイテムを管理できるようにするには、クロスアカウントIAMポリシーを設定する必要があります。

9
ydaetskcoR