Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Порядок Security group в compute instances (ECS) #327

Open
DmitriyMurzin opened this issue Nov 5, 2024 · 4 comments
Open

Порядок Security group в compute instances (ECS) #327

DmitriyMurzin opened this issue Nov 5, 2024 · 4 comments

Comments

@DmitriyMurzin
Copy link

Добрый день.

Мы используем terraform для назначения Security Group на интерфейсы ECS, при применении нескольких sg одновременно (а это необходимо, чтобы сохранить все доступы и функционал) - порядок применения их в облаке получается случайный. То есть, вне зависимости от порядка в манифесте, то, что получается в облаке - всегда непредсказуемо и правим вручную.

Terraform Version

Terraform v1.5.7.

Affected Resource(s)

  • sbercloud_compute_instance
  • sbercloud_networking_secgroup

или

  • huaweicloud_compute_instance
  • huaweicloud_networking_secgroup

Terraform Configuration Files

resource "sbercloud_compute_instance" "ecs_01" {
  name              = "terraform-ecs"
  image_id          = data.sbercloud_images_image.ubuntu_image.id
  flavor_id         = "s6.large.2"
  security_groups   = ["default"]
  availability_zone = "ru-moscow-1a"
  key_pair          = "put_here_the_name_of_your_existing_key_pair"

  system_disk_type = "SAS"
  system_disk_size = 16

  security_groups = [
    "sb-sg-prod-basic-services-basic",
    "sb-sg-prod-basic-services-dns"
  ]

  network {
    uuid = data.sbercloud_vpc_subnet.subnet_01.id
  }
}

Debug Output

~ resource "sbercloud_compute_instance" "ecs_01" {
id = "aa5cef99-7fa8-4ebe-a3c2-f40ddc85fcf4"
name = "ecs-01"
~ security_groups = [
- "default",
+ "sb-sg-prod-basic-services-basic",
+ "sb-sg-prod-basic-services-dns",
]

Expected Behavior

Security группы будут применятся в том порядке, котором мы указываем их в sbercloud_compute_instance

Actual Behavior

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

Steps to Reproduce

  1. Создать несколько ресурсов sg и ecs для проверки
  2. terrform plan
  3. terraform apply
@0ohmresistor
Copy link
Collaborator

0ohmresistor commented Nov 26, 2024

Добрый день!

Чтобы жёстко задать порядок добавления security groups, попробуйте использовать такой подход, как в манифесте ниже:

resource "sbercloud_compute_instance" "instance_1" {
  name               = "delete-me-later"
  image_id           = data.sbercloud_images_image.ubuntu_image.id
  flavor_id          = "s7n.medium.2"
  security_group_ids = []
  availability_zone  = "ru-moscow-1a"
  system_disk_type   = "SAS"
  network {
    uuid = " "
  }
}

resource "sbercloud_networking_secgroup" "secgroup_1" {
  name        = "secgroup_1"
  description = "delete me"
}

resource "sbercloud_networking_secgroup" "secgroup_2" {
  name        = "secgroup_2"
  description = "delete me too"
}

resource "sbercloud_networking_secgroup" "secgroup_3" {
  name        = "secgroup_2"
  description = "sample text"
}

resource "terraform_data" "associate_sg1" {
  depends_on = [sbercloud_compute_instance.instance_1, sbercloud_networking_secgroup.secgroup_1]

  provisioner "local-exec" {
    command = <<EOT
cloud ECS NovaAssociateSecurityGroup --addSecurityGroup.name=${sbercloud_networking_secgroup.secgroup_1.id} --server_id=${sbercloud_compute_instance.instance_1.id} --cli-region=ru-moscow-1
    EOT
  }
}

resource "terraform_data" "associate_sg2" {
  depends_on = [sbercloud_compute_instance.instance_1, terraform_data.associate_sg1]

  provisioner "local-exec" {
    command = <<EOT
cloud ECS NovaAssociateSecurityGroup --addSecurityGroup.name=${sbercloud_networking_secgroup.secgroup_2.id} --server_id=${sbercloud_compute_instance.instance_1.id} --cli-region=ru-moscow-1
    EOT
  }
}

resource "terraform_data" "associate_sg3" {
  depends_on = [sbercloud_compute_instance.instance_1, terraform_data.associate_sg2]

  provisioner "local-exec" {
    command = <<EOT
cloud ECS NovaAssociateSecurityGroup --addSecurityGroup.name=${sbercloud_networking_secgroup.secgroup_3.id} --server_id=${sbercloud_compute_instance.instance_1.id} --cli-region=ru-moscow-1
    EOT
  }
}

Обратите внимание, что для работы provisioner, у вас должна быть установлена cloud CLI https://support.hc.sbercloud.ru/en-us/usermanual/cloudcli/hcli_01.html

@DmitriyMurzin
Copy link
Author

А можно не придумывая ничего с local-exec и cli, сделать, что бы все работало через провайдера как нужно?

@HypnoChaka
Copy link
Collaborator

Terraform - это дополнительный инструмент для работы с облаком.
В API тоже нет приоритизации применения групп к созданной ECS. Попробуйте использовать приоритизацию самих правил(priority в блоке rule).

@HypnoChaka
Copy link
Collaborator

HypnoChaka commented Nov 29, 2024

Я протестировал(пересоздавал порядка 5 раз) и у меня порядок соответствует манифесту:

resource "sbercloud_compute_instance" "ecs_01" {
name = "terraform-ecs"
image_id = data.sbercloud_images_image.ubuntu_image.id
flavor_id = "s6.large.2"
availability_zone = "ru-moscow-1a"
key_pair = "*****"

system_disk_type = "SAS"
system_disk_size = 16

security_groups = [
"default",
"issue-332-cce-eni-qyfr7",
"issue-332-cce-node-qyfr7"
]

{07ECADFB-0E59-4134-8321-A167FFF85AD8}

Это относится к случаю, когда мы не создаём группы одновременно с ECS, а используем существующие.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants