Что такое ресурс в контексте Infrastructure as Code (IaC)?

«Что такое ресурс в контексте Infrastructure as Code (IaC)?» — вопрос из категории Архитектура и DevOps-практики, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В контексте IaC (Infrastructure as Code) ресурс — это абстракция, представляющая любой компонент инфраструктуры (физический или логический), который можно создавать, настраивать, обновлять и уничтожать через код. Ресурсы описываются декларативно, а инструмент IaC (например, Terraform, AWS CloudFormation, Pulumi) управляет их жизненным циклом.

Ключевые характеристики ресурса в IaC:

  • Декларативное описание: Вы определяете желаемое состояние (например, "должен быть EC2 инстанс типа t3.micro"), а не последовательность команд для его создания.
  • Идемпотентность: Многократное применение конфигурации приводит к одному и тому же результату. Если ресурс уже существует в нужном состоянии, инструмент ничего не меняет.
  • Зависимости: Ресурсы могут зависеть друг от друга (например, Security Group должна быть создана до EC2 инстанса). Инструменты IaC автоматически вычисляют и соблюдают порядок создания.
  • Состояние (State): Инструмент хранит состояние развёрнутой инфраструктуры (что было создано, с какими параметрами) и сравнивает его с кодом, определяя план изменений.

Пример ресурса в Terraform (HCL) для AWS:

# Объявление ресурса виртуальной машины в AWS
resource "aws_instance" "app_server" {
  # Аргументы ресурса (конфигурация)
  ami           = "ami-0c55b159cbfafe1f0" # Amazon Linux 2 AMI
  instance_type = "t2.micro"

  # Мета-аргумент для определения зависимостей
  depends_on = [aws_security_group.app_sg]

  # Пользовательские теги
  tags = {
    Name = "ExampleAppServerInstance"
    Environment = "Development"
  }
}

# Ресурс Security Group, от которого зависит EC2
resource "aws_security_group" "app_sg" {
  name        = "app-security-group"
  description = "Allow HTTP and SSH"

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

Типы ресурсов: Виртуальные машины, сети, балансировщики нагрузки, базы данных, контейнеры, IAM-роли, политики и т.д. Каждый провайдер (AWS, Azure, Kubernetes) предлагает свой набор ресурсов.