Когда дело доходит до управления нашей инфраструктурой, как разработчики, мы часто сталкиваемся с двойным стандартом. Наш код контролируется версией, с учетом просмотров кода периодически проверяется с помощью тестовых жгутов. Мы не рискуем это.
Тем не менее, инфраструктура, управляющая нашим кодом, часто наиболее важной частью наших производственных систем, рассматривается по -разному. Войдите в свою учетную запись AWS, несколько кликов, предоставьте машину. С появлением Docker, по крайней мере, окружающая среда стала более воспроизводимой, но все же слишком многие из нас проводят свои дни, нажимая со своей учетной записью Superuser, чтобы Terraform The World.
Декларативная DSLS
Кстати, есть … ну, Terraform ! И другие решения тоже. Понятие Инфраструктура как код только начинает становиться новым дефолтом в мышлении DevOps. Определение вашей инфраструктуры, проведение некоторых базовых проверок здоровья и все, что контролируется версией, является огромным шагом вперед.
Декларативные DSL — это улучшение, но мы можем добиться большего. По нашему опыту в Codegram, часто вы можете потратить 80% своего времени на выяснение правильного заклинания модуля вашего облачного поставщика, с очень небольшой помощью от инструментов. Это означает, что цикл отладки мучительно медленный и часто очень расстраивающий. Тем более в без серверного контекста, где большая часть кода -это инфраструктурные клей -подски, ведра для хранения и лямбдас, все должны общаться друг с другом правильными способами с правильными разрешениями ACL.
Пулуми был создан для использования мощности языков программирования общего назначения для решения этих очень недостатков.
Введите Pulumi
Отказ от ответственности : Codegram никоим образом не связан с Pulumi.com. Ни одно из преимуществ, подробно описанных в этом посте, не требует подписки на Pulumi.com-вы можете просто использовать библиотеку с открытым исходным кодом.
Pulumi это библиотека с открытым исходным кодом, которая позволяет вам использовать язык программирования общего назначения для создания вашей инфраструктуры на вашем облачном поставщике. В Codegram мы обычно выбираем TypeScript в качестве языка для этой задачи.
В качестве примера, вот весь код, который требуется для создания ведра S3 и развернуть AWS Lambda, которая запускает каждый загруженный в него документ:
import * as aws from "@pulumi/aws"; const docsBucket = new aws.s3.Bucket("docs"); docsBucket.onObjectCreated("docsHandler", (e) => { for (const rec of e.Records || []) { console.log(`Hello from Lambda -- got an S3 Object: ${rec.s3.object.key}`); } }); export docsBucketName = docsBucket.bucketName;
Весь этот код клея проверяется типовым компилятором TypeScript-от записей внутри события S3, к свойствам созданного ведра S3 должны быть и их осмотреть. И это выходит далеко за рамки без сервера -будь то Вы развертываете в Kubernetes или Clain Docker Containers, вы готовы к работе.
На мой взгляд, преимущества этого подхода выходят далеко за рамки простого удобства. Читать дальше.
Расширенность через поставщиков терраформ
Несмотря на то, что Pulumi не зависит от Terraform, Pulumi Cli часто использует поставщиков Terraform, и есть приятный инструмент для создания библиотеки Pulumi от существующего поставщика терраформ. В нашем случае это было чрезвычайно полезно, так как нам нужно было управлять DNS с Dnsimple через Pulumi. Несмотря на то, что я впервые использовал инструмент генерации кода, это было всего час или два, пока у меня не было Dnsimple Integration работающий.
Повторяемые среды
Когда вы сохраняете всю свою инфраструктуру наряду с кодом, раскручивание в промежуточной среде или тестовой среде в другом облачном регионе, является тривиальным. Мы находим, что Pulumi помогает нам внести разрыв между запуском тестирование кусок кода и развернутая, повторяемая среда, предоставленная из нашего конвейера непрерывного развертывания.
Для такого агентства, как мы, это становится еще более важным -часто, проекты начинаются в наших облачных учетных записях, только чтобы затем перейти к клиенту -без уверенности в том, что среды полностью повторяются, и ничего не осталось, чтобы указать и щелкнуть Интерфейсы, это было бы сложной задачей, чтобы обеспечить плавную передачу (и поверьте мне, это было раньше).
Избегание блокировки поставщика облака
pulumi.cloud Прямо сейчас реализует много основных концепций облачного сервиса, облачно-оживленным образом.
Это позволяет вам абстрагировать множество облачных инструментов для облегчения развертывания многоклетного проекта. Однако, где бы ни находились текущие API, это просто код — вы можете использовать абстракцию, чтобы избежать блокировки вашей инфраструктуры для конкретного поставщика облака.
Без сервера и волшебные функции
Пулуми имеет концепцию волшебной функции. Это закрытие, которое будет упаковано в функцию лямбды или облака, и оно может ссылаться на элементы инфраструктуры. Эти элементы разрешаются во время обеспечения, поэтому они не являются динамичными, даже если они такие же гибкие, как если бы они были.
import * as aws from '@pulumi/aws' const inputBucket = new aws.s3.Bucket('input') const outputBucket = new aws.s3.Bucket('output') input.onObjectCreated('process', e => { for (const rec of e.Records || []) { const processed = processFile(rec.s3.object.key) uploadFile(outputBucket.bucketName.get(), processed) } })
В этом примере каждый раз, когда файл загружается в InputBucket
Мы называем лямбду, которая обрабатывает файл и загружает его в другое ведро. Закрытие, которое мы используем для определения Lambda, закрывается на outputBucket.bucketName
и вызывает get ()
в теме. Этот код, во время обеспечения, будет составлен в Lambda, которая будет содержать буквальное название выходного ведра, статически.
Мы получаем все выгоды от, казалось бы, динамической ссылки между элементами нашей инфраструктуры, без проблем управления конфигурацией -переменные среды с фигурной средой и так далее. Эти ссылки проверяются в Время компиляции , прежде чем провести время, и, очевидно, задолго до выполнения.
Волшебные функции помогают построить тип клеяного кода, который настолько утомительно писать в без серверов, беспрепятственно и с мощностью полного языка программирования и инструментов в вашем распоряжении.
Кодирование лучших практик
Когда дело доходит до управления инфраструктурой как команды, стандартизация лучших практик становится важной. Какие настройки мы используем для ведра для хранения? Всегда используем ли мы очереди, чтобы отделить производство и потребление? Какие настройки долговечности являются хорошими значениями по умолчанию?
Образуясь общие модели инфраструктуры в нашей собственной библиотеке компании, эти вопросы передаются в команду и отвечают в форме запросов на привлечение, проверки кода и технических дискуссий о реальном, осязаемом коде. Таким образом, мы уходим от одного человека, который Знает, как здесь все делается , к версии, контролируемые лучшие практики, принадлежащие всей команде.
Групная безопасность по умолчанию
В традиционном управлении инфраструктурой люди обычно по умолчанию создают суперпользователь первое, и Беспокойство о сжатии разрешений позже , когда все части определены и стабильны. Это звучит знакомо?
Чтобы избежать этого, наличие моделей инфраструктуры в коде означает, что вы можете абстрагировать гранулированные разрешения вокруг ресурсов. Всякий раз, когда вы создаете очередь, код, который делает, может убедиться, что только конкретное ведро для хранения может публиковать в него события, или что только конкретная машина или лямбда могут читать из него.
Как только он в библиотеке, это Пользователи (Члены команды) больше никогда не приходится беспокоиться о свободных разрешениях. Напишите один раз, беспокойтесь больше.
Бонусные очки: Тип безопасности
В Codegram TypeScript является нашим языком выбора для управления инфраструктурой. Множество вариантов, которые каждый облачный провайдер раскрывает в своем широком спектре предложений, и тот факт, что они часто изменяются, делает компилятор помогать бесценной.
Причина в том, что большая часть проверки параметров у облачных провайдеров выполняется в реальное время обеспечения конкретного ресурса, что означает, что для n ресурсов он может легко выродиться в действительно длинный цикл обратной связи.
Имея большую часть проверки параметров во время компиляции, вам даже не нужно запускать код, чтобы убедиться, что он соответствует. Кроме того, вы получаете большую помощь от вашего инструмента с точки зрения автоматического завершения.
Вдобавок ко всему, система типового типового типа достаточно мощная, чтобы обеспечить параметрический полиморфизм, который очень помогает в абстрагировании общих закономерности и очень помогает в нескольких облачных абстракциях.
Вывод
Управление инфраструктурой была утомительной задачей, которую немногие люди любили делать. С тех пор, как мы начали использовать Pulumi, он сливается с процессом разработки проекта от начала до конца, и он придает нам дополнительную уверенность в мобильности и повторяемости наших производственных сред.
А теперь иди и терраформировать мир! Каламбур предназначен.
Обложка фото Рикардо Гомеса Ангеля на Неспособный
Оригинал: «https://dev.to/codegram/infrastructure-as-code-with-pulumi-4fbm»