Я управляю проектом на Google Cloud Platform, который состоит из GKE и Cloud Run. Я хотел бы добиться гибкого и независимого развертывания для каждой функции Cloud Run: каждая функция должна расширять текущую инфраструктуру, но ее можно развертывать независимо, используя также CI/CD. Я хочу развернуть функции Cloud Run с помощью одного балансировщика нагрузки (т. е. одного домена), но разными путями (см.). Мне удалось достичь этой цели с помощью одного стека, но каждая новая функция или модификация требует всегда изменять основной репозиторий, а CI/CD должен всегда использовать основной репозиторий для развертывания каждой функции.
Я хотел бы использовать подход микростеков , но пулуми, похоже, не позволяет модифицировать «общий» компонент URLMap из каждого микростека. Мне нужен этот компонент, чтобы сопоставить балансировщику нагрузки правильный путь и серверную службу.
Структуры микростековых репозиториев:
Инфрарепозиторий с инициализацией основных компонентов (без ненужных параметров):
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)
Что не так в моем подходе?
Мой подход к микростекам с «общим» компонентом URLMap (хоть это и не самое элегантное решение, но работает хорошо):
Ограничение: если изменения в функции Cloud Run влияют на URLMap (например, добавление нового пути), репозиторий инфраструктуры необходимо повторно развернуть, чтобы отразить эти изменения.