Поиск по сайту:

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


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

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

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

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

Предпосылки

  1. Основное понимание Terraform.
  2. Основные сведения о корзине S3.
  3. Terraform установлен в вашей системе.
  4. Аккаунт AWS (создайте, если у вас его нет).
  5. access_key и secret_key пользователя AWS IAM. (Нажмите здесь, чтобы узнать, как создать пользователя IAM с ключом доступа и секретным ключом в 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\, чтобы вы могли получить доступ к своему аккаунту из интерфейса командной строки.

Используйте следующую команду, чтобы экспортировать значения \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

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

vim variables.tf

variable "region" {
     description = "Region of AWS VPC"
}

Создайте main.tf, который отвечает за создание таблицы DynamoDB. Этот main.tf будет считывать значения переменных из variable.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 = "Region of AWS VPC"
}

Rahuls-MacBook-Pro:terraform rahul$ cat 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"
  }
}


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\, так как нет изменений в Backend для Provider.

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

terraform plan

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

terraform apply

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

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

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

terraform destroy

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

Заключение

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