Сейчас в связи с санкциями публичный Terraform репозиторий https://registry.terraform.io блокирует доступ из подсанкционных регионов.
Когда мы пытаемся обойти блокировки на локальных устройствах, это не представляет большой сложности. Например, включив VPN с выходом в другом регионе. Но бывают ситуации, когда включать VPN затруднительно или не целесообразно.
Я столкнулся с этим, когда перестали работать запуски terraform команд в CI/CD процессах, которые запускались в эфемерных контейнерах. Поднимать VPN в контейнере? Поднимать VPN на ноде? Выглядит как overengineering.
Попытка 1
Погуглив, нашёл в интернете сервис, реализующий Provider Network Mirror Protocol. Большой плюс в простоте использования. Достаточно было в домашней директории создать файл .terraformrc
:
provider_installation {
network_mirror {
url = "https://provider-registry-protocol-name/"
}
}
и всё работает!
Но с этим подходом было две проблемы:
а что там внутри? Исходного кода не вижу. А не внедрят ли мне что-то нехорошее в скачиваемые пакеты?
а что если оно в один прекрасный момент умрёт? Все мои процессы встанут.
Риски принял, работал с этим подходом.
Но вот в один прекрасный день всё действительно умерло: закончилась аренда домена того сервиса (не буду уточнять какого). И всё у меня сломалось.
Попытка 2
Нужно было срочно всё завести обратно, завтра отпуск, а ничего не работает.
Первыми на ум пришли прокси и обратный прокси. Обратный прокси проще делается, начал с него. Завёл элементарный nginx с простым proxy_pass в неподсанкционном регионе, оттопырил его в свою сеть и поменял в .terraformrc
адрес на свой.
Сначала долго не понимал, почему всё не работает. Потом с удивлением обнаружил, что API Provider Network Mirror Protocol вообще не похож на API самого репозитория (Provider Registry Protocol). Зачем они так сделали — не понятно. Нужен сервис, который будет мапить один API в другой. В интернете такого не нашёл в свободном доступе. Решил написать свой в опенсорс.
Попытка 3. Решение
Итак, написал опенсорс сервис, который реализует протокол Provider Network Mirror Protocol. Любой желающий может его развернуть в своей инфраструктуре и не сомневаться во внутренностях.
Ссылка на исходный код https://github.com/jonasasx/terraform-registry-mirror.
Кому не охота или нет возможности разворачивать его самостоятельно, может воспользоваться моей инсталляцией: https://terraform-registry-mirror.ru/. Пока она запущена в качестве прототипа (не рассчитана на большую нагрузку). Но если увижу к ней интерес, то подготовим к нагрузкам.
Для работы достаточно создать файл в домашней директории .terraformrc
:
provider_installation {
network_mirror {
url = "https://terraform-registry-mirror.ru/"
}
}
Это можно легко сделать и в любой CI/CD джобе.
Кому интересно помочь с проектом: добро пожаловать, заводите тикеты, присылайте пулл реквесты, оставляйте комментарии.
Спасибо за внимание!
PS связь со мной: https://t.me/jonasasx