Terraform · 5 min read · Dec 10, 2025

Как управлять состоянием Terraform в ведре AWS S3

В этой статье мы рассмотрим, что такое состояние Terraform и как управлять им в ведре S3. Мы также увидим, что такое “блокировка” в Terraform и как ее реализовать. Для этого нам нужно создать ведро S3 и таблицу DynamoDB в AWS.

Перед тем как продолжить, давайте разберемся с основами состояния Terraform и блокировки.

  • Состояние Terraform (файл terraform.tstate):
    Файл состояния содержит информацию о том, какие ресурсы существуют, определенные в конфигурационных файлах terraform. Например, если вы создали экземпляр EC2 с помощью конфигурации terraform, то файл состояния содержит информацию о фактическом ресурсе, который был создан в AWS.
  • S3 как бэкенд для хранения файла состояния:
    Если мы работаем в команде, то хорошо хранить файл состояния terraform удаленно, чтобы другие члены команды могли к нему получить доступ. Для хранения состояния удаленно нам нужно две вещи: ведро s3 для хранения файла состояния и ресурс бэкенда terraform s3.
  • Блокировка:
    Если мы храним файл состояния удаленно, чтобы многие люди могли к нему получить доступ, то мы рискуем, что несколько человек попытаются внести изменения в один и тот же файл одновременно. Поэтому нам нужен механизм, который “заблокирует” состояние, если оно в данный момент используется другими пользователями. Мы можем достичь этого, создав таблицу dynamoDB для использования terraform.

Здесь мы рассмотрим все шаги, начиная с создания ведра S3 вручную, добавления к нему необходимой политики, создания таблицы DynamoDB с помощью Terraform и настройки Terraform для использования S3 в качестве бэкенда и DynamoDB для хранения блокировки.

Предварительные требования

  1. Базовое понимание Terraform.
  2. Базовое понимание ведра S3.
  3. Установленный Terraform на вашей системе.
  4. Учетная запись AWS (создайте, если у вас ее нет).
  5. ‘access_key’ и ‘secret_key’ пользователя IAM AWS. (Нажмите здесь, чтобы узнать, как создать пользователя IAM с ‘access_key’ и ‘secret_key’ в AWS, )

Что мы будем делать

  1. Создать ведро S3 и прикрепить к нему политику.
  2. Создать таблицу DynamoDB с помощью Terraform.
  3. Создать EC2 с использованием конфигурационных файлов Terraform.
  4. Удалить созданный экземпляр EC2 с помощью Terraform.

Создание ведра S3 и прикрепление к нему политики.

Нажмите здесь, чтобы узнать, как создать ведро S3 в учетной записи AWS. После создания ведра прикрепите к нему следующую политику.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1560164441598",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:PutObject*",
                "s3:List*",
                "s3:Get*",
                "s3:Delete*"
            ],
            "Resource": [
                "arn:aws:s3:::state-lock-rahul",
                "arn:aws:s3:::state-lock-rahul/*"
            ]
        }
    ]
}

Настройте “AWS_ACCESS_KEY_ID” и “AWS_SECRET_ACCESS_KEY”, чтобы вы могли получить доступ к своей учетной записи из CLI.

Используйте следующую команду, чтобы экспортировать значения “AWS_ACCESS_KEY_ID” и “AWS_SECRET_ACCESS_KEY”

export AWS_ACCESS_KEY_ID=AKIAQ6GAIA5XC2XMMM7W
export AWS_SECRET_ACCESS_KEY=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
echo $AWS_ACCESS_KEY_ID
echo $AWS_SECRET_ACCESS_KEY

После настройки ваших учетных данных вы можете просто протестировать их, перечислив ведра с помощью следующей команды.

aws s3 ls

Создание таблицы DynamoDB с помощью Terraform

Создайте ‘variables.tf’, который содержит объявление необходимых переменных.

vim variables.tf

variable "region" {
     description = "Регион AWS VPC"
}

Создайте ‘main.tf’, который отвечает за создание таблицы DynamoDB. Этот main.tf будет считывать значения переменных из variables.tf. Эта таблица будет использоваться для хранения блокировки.

provider "aws" {
      region     = "${var.region}"
}  
resource "aws_dynamodb_table" "terraform_locks" {  
  name         = "rahul-test-dynamodb-table"  
  billing_mode = "PAY_PER_REQUEST"  
  hash_key     = "LockID"  
  attribute {  
    name = "LockID"  
    type = "S"  
  }  
}

Первая команда, которую нужно использовать, это ‘terraform init’. Эта команда загружает и устанавливает плагины для провайдеров, используемых в конфигурации. В нашем случае это AWS.

*terraform init

Вторая команда, которую нужно использовать, это ‘terraform plan’. Эта команда используется для просмотра изменений, которые произойдут в инфраструктуре.

terraform plan

Команда ‘terraform apply’ создаст ресурсы в AWS, указанные в файле main.tf. Вам будет предложено ввести данные для создания ресурсов.

terraform apply

Теперь вы можете перейти на панель управления DynamoDB в консоли, чтобы проверить, была ли создана таблица или нет.

На данный момент мы создали ведро S3 вручную из консоли S3 и таблицу DynamoDB с помощью Terraform. Мы не настроили ведро S3 в качестве бэкенда для хранения состояния и таблицу DynamoDB для хранения блокировки.

Чтобы достичь нашей цели, нам нужно изменить наш файл main.tf Terraform. После изменения кода и его выполнения, наше существующее локальное состояние будет скопировано в S3 Backend.

Обновите наш существующий main.tf следующим кодом.

vim main.tf

provider "aws" {
      region     = "${var.region}"
}
 
terraform {
  backend "s3" {
    bucket         = "state-lock-rahul"
    key            = "test/terraform.tfstate"
    region         = "eu-west-3"
    dynamodb_table = "rahul-test-dynamodb-table"
  }
}
 
resource "aws_dynamodb_table" "terraform_locks" {
  name         = "rahul-test-dynamodb-table"
  billing_mode = "PAY_PER_REQUEST"
  hash_key     = "LockID"
  attribute {
    name = "LockID"
    type = "S"
  }
}

Теперь, если вы попробуете команду “terraform plan”, чтобы увидеть, какой новый ресурс будет создан, команда завершится с ошибкой.

Вам будет предложено повторно инициализировать бэкенд.

Чтобы повторно инициализировать бэкенд, используйте команду “terraform init”. На этом этапе ваш локальный файл состояния будет скопирован в ведро S3.

terraform init

Вы можете наблюдать вывод, как показано на скриншоте ниже после выполнения команды “terraform init”, Terraform был включен для использования таблицы DynamoDB для получения блокировки. После включения блокировки, никакие две одинаковые операции над одним и тем же ресурсом не могут выполняться параллельно.

Вы можете перейти на панель управления S3 из консоли AWS, чтобы увидеть, был ли файл terraform.tfstate скопирован или нет.

Теперь вы снова можете создать новый ресурс и увидеть, что состояние будет сохранено в ведре S3. Чтобы создать новую тестовую таблицу DynamoDB, обновите файл main.tf следующим кодом.

vim main.tf

variable "region" {
     description = "Регион AWS VPC"
}

Rahuls-MacBook-Pro:terraform rahul$ cat main.tf 
provider "aws" {
      region     = "${var.region}"
}


tf {
  backend "s3" {
    bucket         = "state-lock-rahul"
    key            = "test/terraform.tfstate"
    region         = "eu-west-3"
    dynamodb_table = "rahul-test-dynamodb-table"
  }
}

resource "aws_dynamodb_table" "terraform_locks" {
  name         = "rahul-test-dynamodb-table"
  billing_mode = "PAY_PER_REQUEST"
  hash_key     = "LockID"
  attribute {
    name = "LockID"
    type = "S"
  }
}


resource "aws_dynamodb_table" "test-table" {
  name         = "rahul-test-table"
  billing_mode = "PAY_PER_REQUEST"
  hash_key     = "LockID"
  attribute {
    name = "LockID"
    type = "S"
  }
}

На этот раз нет необходимости выполнять “terraform init”, так как нет изменений в бэкенде для провайдера.

Вы можете просто использовать команду “terraform plan”, чтобы увидеть, какие новые ресурсы будут созданы.

terraform plan

Теперь выполните следующую команду, чтобы создать новую тестовую таблицу DynamoDb.

terraform apply

На скриншоте выше вы можете увидеть, что блокировка была включена, файл .tfstate копируется в S3.

Теперь в консоли вы можете видеть, что новая таблица была создана

Теперь, если вам больше не нужен ресурс, который вы создали с помощью Terraform, используйте следующую команду для удаления ресурсов.

terraform destroy

Как только вы удалите ресурсы, вы увидите, что таблица, которая использовалась для блокировки, также была удалена. Если вам также не нужно ведро S3, вы можете удалить его из консоли.

Заключение

В этой статье мы узнали о необходимости использования удаленного состояния и блокировки в Terraform. Мы рассмотрели шаги по использованию ведра S3 в качестве бэкенда для хранения состояния Terraform и таблицы DynamoDb для включения блокировки.

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.