Микростеки Pulumi с общим компонентом

Я управляю проектом на Google Cloud Platform, который состоит из GKE и Cloud Run. Я хотел бы добиться гибкого и независимого развертывания для каждой функции Cloud Run: каждая функция должна расширять текущую инфраструктуру, но ее можно развертывать независимо, используя также CI/CD. Я хочу развернуть функции Cloud Run с помощью одного балансировщика нагрузки (т. е. одного домена), но разными путями (см.). Мне удалось достичь этой цели с помощью одного стека, но каждая новая функция или модификация требует всегда изменять основной репозиторий, а CI/CD должен всегда использовать основной репозиторий для развертывания каждой функции.

Я хотел бы использовать подход микростеков , но пулуми, похоже, не позволяет модифицировать «общий» компонент URLMap из каждого микростека. Мне нужен этот компонент, чтобы сопоставить балансировщику нагрузки правильный путь и серверную службу.

Структуры микростековых репозиториев:

  • Инфраструктура: основной репозиторий, который создает общие ресурсы (например, включение облачных сервисов, соединитель доступа к VPC, Cloud NAT...).
  • Библиотека инфраструктуры: ресурсы компонентов, которые будут использоваться совместно с другими «микростеками» (например, запуск в облаке).
  • Несколько репозиториев для каждого микросервиса (т. е. микростека).

Инфрарепозиторий с инициализацией основных компонентов (без ненужных параметров):


managed_ssl_certificate = gcp.compute.ManagedSslCertificate(...)

url_map = URLMap("cloud-run-url-map",
                      host_rules=[
                          URLMapHostRuleArgs(
                              hosts=["example.com"],
                              path_matcher = "example"
                          )],
                      path_matchers=[
                          URLMapPathMatcherArgs(
                              name = "example",
                              default_service=self.function_backend_service.self_link.apply(lambda self_link: self_link),
                        # Each Cloud Run function should add its path
                        path_rules=[]
                        ...
                          )])

http_load_balancer = gcp.compute.TargetHttpsProxy(url_map=url_map.id,
                                                  ssl_certificates=[managed_ssl_certificate.id],
                                                  ...)

forwarding_rule = gcp.compute.GlobalForwardingRule(target=http_load_balancer.id,
                                                    ...)

Библиотека инфраструктуры, которая используется каждой функцией Cloud Run и требует редактирования «Карты URL-адресов»:


class MyCloudRun(ComponentResource):
    self.function = pulumi_gcp.cloudrunv2.Service(...)

    # Create a serverless network endpoint group (NEG) for the Cloud Run service
    cloud_run_neg = pulumi_gcp.compute.RegionNetworkEndpointGroup(...)

    # Create the backend service that points to the Cloud Run NEG
    self.function_backend_service = pulumi_gcp.compute.BackendService(...)

    # How to manage the URL Map? How to add the new URLMapPathMatcherPathRuleArgs ?
    # I tried to retrive the existing URL Map as follow but I got Duplicate resource URN; try giving it a unique name
    # Moreover, I am not sure how pulumi can delete the correct URLMapPathMatcherPathRuleArgs when removing the function

    original_path_matcher = URLMap.get(resource_name = "my_name",id = "my_id")
    new_path_rule = URLMapPathMatcherPathRuleArgs(
    paths=["/test"],
    service=self.function_backend_service)
    # The update logic is much more complex, but let's assume that original_path_matcher[0] exist and the operation of append does not create duplicate of URL Matcher.
    original_path_matcher[0].path_rules.append(new_path_rule)

Что не так в моем подходе?

Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
0
90
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мой подход к микростекам с «общим» компонентом URLMap (хоть это и не самое элегантное решение, но работает хорошо):

  • Репозитории микростеков: каждая функция Cloud Run имеет собственный репозиторий. Эти репозитории экспортируют информацию, необходимую для URLMap, например путь и внутреннюю службу.
  • Библиотека инфраструктуры: библиотека, общая для всех функций Cloud Run, содержит код для развертывания функций и экспорта параметров URLMap.
  • Репозиторий инфраструктуры: репозиторий инфраструктуры содержит конфигурацию каждого стека. Сюда входит информация о том, какую функцию развернуть (со ссылкой на стек и имя функции) для доступа к экспортированным переменным. Этот подход позволяет управлять всем жизненным циклом URLMap, включая удаление при удалении функции Cloud Run.

Ограничение: если изменения в функции Cloud Run влияют на URLMap (например, добавление нового пути), репозиторий инфраструктуры необходимо повторно развернуть, чтобы отразить эти изменения.

Другие вопросы по теме