Ошибка при создании экземпляра AWS DB через Terraform

#amazon-web-services #terraform #amazon-rds

#amazon-web-services #terraform #amazon-rds

Вопрос:

Я пытаюсь создать новый экземпляр AWS RDS через Terraform, но получаю странную ошибку, как показано в приведенном ниже фрагменте:

 resource "aws_db_subnet_group" "sng_marketplace_stg" {
  name     = "sng-marketplace-stg"

  tags = { Name = "Marketplace Staging" }

  subnet_ids = [
    "${aws_subnet.sbn_1_us.id}",
    "${aws_subnet.sbn_2_us.id}"
  ]
}

resource "aws_db_instance" "marketplace_staging" {
  identifier                  = "db-marketplace-stg-staging"
  engine                      = "postgres"
  engine_version              = "12.4"
  # ...
  # omitted
  # ...
  db_subnet_group_name        = "${aws_db_subnet_group.sng_marketplace_stg.id}"
}

 
    1. 1-я группа создает группу подсети с именем sng-marketplace-stg этот шаг в порядке, и TF может применяться.
    1. На 2-м шаге возникает ошибка a Error creating DB Instance: DBSubnetGroupNotFoundFault: DBSubnetGroup 'sng-marketplace-stg' not found.

Что ж, когда я получаю доступ к AWS Console RDS, группа подсети была создана, как и ожидалось, но если я повторно запускаю TF apply (или планирую), terraform покажет правильное изменение (создать новый экземпляр RDS), но при применении ошибка возникает снова, например, если группа подсети не существует.

Кто-нибудь видел эту ошибку раньше или какие-либо предложения по ее исправлению?

Спасибо 4 за любую помощь или направление к решению.


Полная трассировка ошибок здесь:

 Error: Error applying plan:

1 error occurred:
        * aws_db_instance.marketplace_staging: 1 error occurred:
        * aws_db_instance.marketplace_staging: Error creating DB Instance: DBSubnetGroupNotFoundFault: DBSubnetGroup 'sng-marketplace-stg' not found.
        status code: 404, request id: da567898-...
 

Комментарии:

1. Предоставленный вами код верен. Я не вижу причины, по которой это не сработало бы. Вы уверены, что приведенные вами фрагменты являются репрезентативными для вашего фактического кода?

2. Да, код правильный, но по какой-то причине (я не знаю) AWS <> Terraform не распознает ресурс.

Ответ №1:

У меня была такая же проблема с моим кодом, и я понял, что вам нужно добавить ресурс aws_db_parameter_group в свой main.tf досье.

Вот пример, извлеченный с официального сайта terraform

 resource "aws_db_parameter_group" "education" {
  name   = "education"
  family = "postgres13"

  parameter {
    name  = "log_connections"
    value = "1"
  }
}
 

Затем я запускаю terraform plan terraform apply и все работает нормально (убедитесь, что ваша роль IAM имеет все необходимые разрешения, вы можете добавить их, когда в консоли terraform появятся сообщения об ошибках, связанные с разрешениями).

Удачи!

Ответ №2:

Необходимо создать группу параметров БД.

 resource "aws_db_parameter_group" "education" {
  name   = "education"
  family = "postgres13"

  parameter {
    name  = "log_connections"
    value = "1"
  }
}
 

Также вы должны ссылаться на него при создании экземпляра db.

В вашем случае.

 resource "aws_db_instance" "marketplace_staging" {
  identifier                  = "db-marketplace-stg-staging"
  engine                      = "postgres"
  engine_version              = "12.4"
  # ...
  # omitted
  # ...
  db_subnet_group_name        = "${aws_db_subnet_group.sng_marketplace_stg.id}"
  parameter_group_name        = aws_db_parameter_group.education.name
}
 

Еще больше, если вы хотите разрешить трафик. Добавьте группу безопасности со ссылкой на ваш идентификатор vpc.

 resource "aws_security_group" "rds" {
  name   = "education_rds"
  vpc_id = module.vpc.vpc_id

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

  egress {
    from_port   = 5432
    to_port     = 5432
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = {
    Name = "education_rds"
  }
}
 

а также ссылайтесь на это при создании вашей базы данных. В вашем случае.

 resource "aws_db_instance" "marketplace_staging" {
  identifier                  = "db-marketplace-stg-staging"
  engine                      = "postgres"
  engine_version              = "12.4"
  # ...
  # omitted
  # ...
  db_subnet_group_name        = "${aws_db_subnet_group.sng_marketplace_stg.id}"
  parameter_group_name        = aws_db_parameter_group.education.name
  vpc_security_group_ids      = [aws_security_group.rds.id]
}
 

Ссылка: https://github.com/hashicorp/learn-terraform-rds/blob/main/main.tf