Terraform: как получить имя службы VPCE, когда она была создана динамически

Я пытаюсь получить (через terraform) DNS-имя динамически созданной конечной точки VPCE, используя ресурс данных , но проблема, с которой я сталкиваюсь, заключается в том, что имя службы неизвестно до тех пор, пока не будут созданы ресурсы. См. примечания ниже.

Есть ли способ получить эту информацию, поскольку жестко закодированное имя службы просто не работает для автоматизации?

например, это не будет работать, так как имя_службы является динамическим

          resource "aws_transfer_server" "sftp_lambda" {

      count                  = local.vpc_lambda_enabled
      domain                 = "S3"
      identity_provider_type = "AWS_LAMBDA"
      endpoint_type          = "VPC"
      protocols              = ["SFTP"]
      logging_role           = var.loggingrole
      function               = var.lambda_idp_arn[count.index]

      endpoint_details = {
         security_group_ids = var.securitygroupids
         subnet_ids         = var.subnet_ids
         vpc_id             = var.vpc_id
      }
    
      tags = {
        NAME = "tf-test-transfer-server"
        ENV  = "test"
      } 
    }

    data "aws_vpc_endpoint" "vpce" {
      count        = local.vpc_lambda_enabled
      vpc_id       = var.vpc_id
      service_name = "com.amazonaws.transfer.server.c-001"
      depends_on   = [aws_transfer_server.sftp_lambda]
    }

    output "transfer_server_dnsentry" {
        value = data.aws_vpc_endpoint.vpce.0.dns_entry[0].dns_name
    }

Примечание. VPCE был создан автоматически из ресурса сервера передачи AWSSFTP, для которого был настроен тип конечной точки VPC (не VPC_ENDPOINT, который в настоящее время устарел). У меня не было никакого контроля над присвоением имени службе конечной точки. Все это было создано в фоновом режиме.

Минимальная версия поставщика AWS: требуется 3.69.0.

Вот пример скрипта cloudformation для настройки сервера передачи SFTP с использованием Lambda в качестве IDP. Это автоматически создаст VPCE. Итак, моя цель здесь — вывести DNS-имя из автоматически созданной конечной точки VPC, используя terraform, если это вообще возможно.

пример настройки в cloudFormation

источник данных: aws_vpc_endpointресурс: aws_transfer_server

2 ответа

Я получил ответ от службы поддержки Hashicorp Terraform по этому поводу, и вот что они предложили:

вы можете получить сервис SFTP-Server-created-VPC-Endpoint, вызвав следующий экспортированный атрибут ресурса vpc_endpoint_service [a].

ПРИМЕЧАНИЕ. Существуют определенные настройки, из-за которых AWS создает дополнительные ресурсы помимо того, что вы настроили. Сервис передачи AWS SFTP является одним из них. Это поведение находится вне контроля Terraform и больше из-за того, как AWS спроектировал сервис.

Однако вы можете вернуть эту конечную точку VPC под контроль Terraform, импортировав конечную точку VPC, которую она создает от вашего имени, ПОСЛЕ создания службы передачи — через идентификатор VPCe [b]. Если вам нужны дополнительные идеи извлечения имени службы из вашей текущей настройки AWS, не стесняйтесь проверить этот пример [c].

Надеюсь, это поможет! Спасибо.

[a] https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/vpc_endpoint_service#service_name[b] https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/vpc_endpoint#import[c] https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/vpc_endpoint#gateway-load-balancer-endpoint-type

Есть путь вперед, как я поделился ранее с импортом, но, к сожалению, он не будет полностью автоматизирован.

При желании вы можете использовать поставщик [1] ​​и команду aws ec2 description-vpc-endpoint-services --service-names [2], чтобы получить нужные вам имена сервисов.

Боюсь, это последний обходной путь, который я могу предложить, как описано в нашем документе здесь [3] — который объяснит, как бы мы ни хотели, Terraform не может решить все варианты использования.

[1] https://www.terraform.io/language/resources/provisioners/remote-exec[2] https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/describe-vpc-endpoint-services.html[3] https://www.terraform.io/language/resources/provisioners/syntax

Я наконец нашел решение:

      data "aws_vpc_endpoint" "transfer_server_vpce" {
  count  = local.is_enabled
  vpc_id = var.vpc_id

  filter {
    name   = "vpc-endpoint-id"
    values = ["${aws_transfer_server.transfer_server[0].endpoint_details[0].vpc_endpoint_id}"]
  }
}
Другие вопросы по тегам