Получение идентификатора модуля Terraform группы безопасности AWS

#amazon-web-services #terraform #amazon-ecs #terraform-provider-aws

#amazon-веб-сервисы #terraform #amazon-ecs #terraform-поставщик-aws

Вопрос:

Я использовал этот модуль для создания группы безопасности внутри VPC. Одним из результатов является security_group_id , но я получаю эту ошибку:

Error: Unsupported attribute
│ 
│   on ecs.tf line 39, in resource "aws_ecs_service" "hello_world":
│   39:     security_groups = [module.app_security_group.security_group_id]
│     ├────────────────
│     │ module.app_security_group is a object, known only after apply
│ 
│ This object does not have an attribute named "security_group_id".
 

Мне нужна группа безопасности для службы ECS:

 resource "aws_ecs_service" "hello_world" {
  name            = "hello-world-service"
  cluster         = aws_ecs_cluster.container_service_cluster.id
  task_definition = aws_ecs_task_definition.hello_world.arn
  desired_count   = 1
  launch_type     = "FARGATE"

  network_configuration {
    security_groups = [module.app_security_group.security_group_id]
    subnets         = module.vpc.private_subnets
  }

  load_balancer {
    target_group_arn = aws_lb_target_group.loadbalancer_target_group.id
    container_name   = "hello-world-app"
    container_port   = 3000
  }

  depends_on = [aws_lb_listener.loadbalancer_listener, module.app_security_group]
}
 

Я понимаю, что я могу узнать идентификатор группы безопасности только после ее создания. Вот почему я добавил depends_on часть в строку ECS, но она продолжала возвращать ту же ошибку.

Обновить

Я указал count значение 1 в модуле app_security_group, и это ошибка, которую я получаю сейчас.

Error: Unsupported attribute
│ 
│   on ecs.tf line 39, in resource "aws_ecs_service" "hello_world":
│   39:     security_groups = module.app_security_group.security_group_id
│     ├────────────────
│     │ module.app_security_group is a list of object, known only after apply
│ 
│ Can't access attributes on a list of objects. Did you mean to access an attribute for a specific element of the list, or across all elements of the list?
 

Обновление II

Это объявление модуля:

 module "app_security_group" {
  source  = "terraform-aws-modules/security-group/aws//modules/web"
  version = "3.17.0"

  name        = "${var.project}-web-sg"
  description = "Security group for web-servers with HTTP ports open within VPC"
  vpc_id      = module.vpc.vpc_id

  #   ingress_cidr_blocks = module.vpc.public_subnets_cidr_blocks
  ingress_cidr_blocks = ["0.0.0.0/0"]
}
 

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

1. У вас есть a count в app_security_group модуле?

2. @ErvinSzilagyi Я добавил один сейчас, со счетом 1, но я все еще получаю аналогичную ошибку. Пожалуйста, ознакомьтесь с моим обновленным вопросом.

3. Что такое объявление модуля?

4. Нет, вы не должны добавлять a count , если это не требуется (например: вам нужно более одного ресурса). Эта ошибка This object does not have an attribute named может возникнуть в определенной ситуации, когда у вас есть count на модуле. Похоже, в вашем случае это не проблема

5. @MattSchuchard Я добавил его к вопросу

Ответ №1:

Я взглянул на этот модуль. Проблема в том, что версия 3.17.0 модуля просто не имеет выходных security_group_id данных . Вы используете действительно старую версию.

Последняя версия с сайта 4.7.0 — это то, что вы хотели бы обновить до этой. На самом деле, любая версия выше 4.0.0 имеет security_group_id , так что вам нужно, по крайней мере 4.0.0 .

Ответ №2:

Поскольку вы используете count, пожалуйста, попробуйте ниже.

 network_configuration {
    security_groups = [module.app_security_group[0].security_group_id]
    subnets         = module.vpc.private_subnets
  }