Я был большим поклонником Terraform для многих моих недавних работ. Есть что -то в модульности, которую он привносит в инфраструктуру как код, который мне действительно нравится. Если вы не проверили мои предыдущие посты вокруг Terraform, дайте им прочитание.
- Как запустить тесты браузера через Cypress в вашем трубопроводе CI/CD с AWS Codebuild
- Создание конвейера CI/CD с репозиторием GIT за ~ 30 секунд с использованием Terraform и AWS
- Как постоянно развернуть статический веб -сайт в стиле, используя GitHub и AWS
В то время как Terraform — отличный инструмент, всегда стоит немного времени, чтобы исследовать другие варианты. Получение голубя или застрявшего с одним инструментом, языком или структурой может быть рецептом для катастрофы в большинстве случаев. Стоит знать, какие другие варианты есть, а также преимущества, а также недостатки их использования. Тот, который привлек мое внимание несколько месяцев назад в инфраструктуре, поскольку пространство кода, это Pulumi Анкет
Что интересно в Pulumi, так это то, что он устраняет один из самых больших барьеров для входа в инфраструктуру как код, еще один язык для изучения. В отличие от Terraform, для обучения нет другого специфичного для домена (DSL). Если вы знаете JavaScript, TypeScript, Python или Go, вы можете начать кодификацию своей инфраструктуры прямо из коробки.
В этом посте я собираюсь дать краткое представление о Пулуми и как начать с него. Затем мы собираемся использовать Pulumi для настройки статического ведра веб -сайта и распределения Cloudfront в AWS, который я использовал в других примерах Terraform. После этого мы можем взглянуть на некоторые преимущества и недостатки между ними.
Начало работы с Пулуми
Как и в случае с большинством вещей, связанных с технологиями, мы должны сначала установить Pulumi. Если вы работаете MacOS, мы можем взять это напрямую из пиво
Анкет
$ brew install pulumi
Быстрая проверка здравомыслия версии должна показать, что мы все установили.
$ pulumi version
Напечатана версия? Отлично, давайте перейдем к следующему шагу.
Как и Terraform, Pulumi поддерживает несколько облачных провайдеров, включая AWS, Azure, Google Cloud, Open Stack, Kubernetes и даже свои собственные облачные структуры.
Для этого поста мы собираемся использовать Pulumi с AWS. Если у вас еще нет AWS CLI Установлен и настроен, вы должны сделать это сейчас. По умолчанию Pulumi собирается использовать учетные данные, которые вы создаете при настройке CLI AWS через AWS Configure
Анкет
Использование Pulumi с Amazon Web Services
Для начала мы собираемся создать проект Pulumi Barebones, используя команду ниже.
$ pulumi new aws-javascript --dir pulumi-static
Это сначала подскажет вам войти в Pulumi, продолжить и нажмите Enter, чтобы открыть вход в ваш браузер. После входа в систему вы можете вернуться к терминалу и закончить настройку.
- Оставьте имя проекта по умолчанию.
- Оставьте описание проекта по умолчанию.
- Создать
-dev
стек. - Выберите
Нет
Когда предложено с опцией создания.
Теперь мы должны быть в состоянии посмотреть на содержимое нашего Pulumi-Static
Папка и посмотрите, что у нас есть два файла Pulumi YAML, а также index.js
и, конечно, наши пакетные файлы.
Если бы мы открылись pulumi.io И вход мы также увидим, что у нас есть проект, Pulumi-Static
с двумя стеками в нем. Мы также можем проверить это в нашей командной строке, перечислив наши стеки.
$ pulumi stack ls
Теперь давайте погрузимся в наш index.js
Подайте и предоставьте некоторую инфраструктуру AWS. Когда мы впервые откроем наш файл, мы видим, что он уже имеет какой -то код внутри него. Давайте остановимся на секунду и поговорим о том, что в настоящее время делает этот код.
"use strict"; const pulumi = require("@pulumi/pulumi"); const aws = require("@pulumi/aws"); const bucket = new aws.s3.Bucket("my-bucket"); exports.bucketName = bucket.bucketDomainName;
Это код, представляющий некоторую инфраструктуру AWS. Более конкретно мы видим, что это создает новое ведро S3 по имени My-Bucket
И тогда имя этого ведра экспортируется. Обратите внимание, что это просто традиционный JavaScript, не нужно изучать другой язык, специфичный для домена.
Мы можем пойти дальше и запустить этот код из командной строки, чтобы обеспечить нашу инфраструктуру AWS. Сначала мы бегаем NPM Установка
И тогда мы можем запустить наш вверх
командование
$ npm install $ pulumi up
Выберите Pulumi-Static-Dev
Как стек, мы хотим предоставить.
После того, как мы выбрали нашу стек, нам представлен план, какие ресурсы будут созданы, обновлены или уничтожены. Очень похоже на План терраформ
командование
Previewing update (pulumi-static-dev): Type Name Plan + pulumi:pulumi:Stack pulumi-static-pulumi-static-dev create + └─ aws:s3:Bucket my-bucket create Resources: + 2 to create
Выберите Да
в подсказке подтверждения, чтобы создать ведро. Это создаст наше ведро S3 на основе кода, на который мы только что посмотрели. Как только наш стек создан, мы должны увидеть следующие журналы от Pulumi.
Updating (pulumi-static-dev): Type Name Status + pulumi:pulumi:Stack pulumi-static-pulumi-static-dev created + └─ aws:s3:Bucket my-bucket created Outputs: bucketName: "my-bucket-ed42950.s3.amazonaws.com" Resources: + 2 created
Потрясающий! Мы предоставили нашу первую инфраструктуру AWS с использованием Pulumi. Давайте изменим нашу инфраструктуру, чтобы не только создать ведро S3, но и включить статическое хостинг веб -сайта на этом ведре.
Использование Pulumi для обеспечения нашей статической инфраструктуры веб -сайта
Чтобы включить хостинг веб -сайтов S3 для нашего ведра, нам нужно добавить дополнительную недвижимость, а также политику ведра, которая позволяет публично считывать. Это также очень легко сделать в Pulumi. Вот как выглядит наш код после добавления хостинга веб -сайта в нашу ведро.
"use strict"; const pulumi = require("@pulumi/pulumi"); const aws = require("@pulumi/aws"); const websiteBucket = new aws.s3.Bucket("my-bucket", { website: { indexDocument: "index.html" } }); let bucketPolicy = new aws.s3.BucketPolicy("publicReadPolicy", { bucket: websiteBucket.bucket, policy: websiteBucket.bucket.apply(publicReadPolicyForBucket) }); exports.websiteUrl = siteBucket.websiteEndpoint; function publicReadPolicyForBucket(bucketName) { return JSON.stringify({ Version: "2012-10-17", Statement: [ { Effect: "Allow", Principal: "*", Action: ["s3:GetObject"], Resource: [ `arn:aws:s3:::${bucketName}/*` // policy refers to bucket name explicitly ] } ] }); }
Здесь мы добавляем Веб -сайт
Свойство конфигурации в ведро, которое мы создаем. Затем мы определяем Bucketpolicy
Это прилагается к нашему сайте ведро. Политика позволяет любому выполнять S3: GetObject
На нашем ведре, которое необходимо для статического веб -сайта из ведра S3.
Мы можем применить эти изменения в нашем стеке, запустив другой вверх
командование в нашей командной строке.
$ pulumi up
Мы должны увидеть, что наша политика ведра будет создана и что наше текущее ведро будет обновляться.
Previewing update (pulumi-static-dev): Type Name Plan Info pulumi:pulumi:Stack pulumi-static-pulumi-static-dev ~ ├─ aws:s3:Bucket my-bucket update [diff: +website] + └─ aws:s3:BucketPolicy publicReadPolicy create Resources: + 1 to create ~ 1 to update 2 changes. 1 unchanged
После того, как мы выполним обновление, мы должны увидеть, что наш URL -адрес размещения статического веб -сайта S3.
Outputs: - bucketName: "my-bucket-e4e2278.s3.amazonaws.com" + websiteUrl: "my-bucket-e4e2278.s3-website-us-west-2.amazonaws.com" Resources: + 1 created ~ 1 updated 2 changes. 1 unchanged
Потрясающий! Теперь у нас есть ковш S3, настроенное для размещения статического веб -сайта, и все это было предоставлено через Pulumi с использованием JavaScript.
Давайте продлим это еще раз, добавив распределение Cloudfront, которое находится перед нашим ведром сайта S3. Это требует, чтобы мы создали новое распространение и установили наше ведро S3 в качестве происхождения. Вот как выглядит наш код после добавления CROUDFRONT CDN в нашу инфраструктуру.
"use strict"; const pulumi = require("@pulumi/pulumi"); const aws = require("@pulumi/aws"); const websiteBucket = new aws.s3.Bucket("my-bucket", { website: { indexDocument: "index.html" } }); let bucketPolicy = new aws.s3.BucketPolicy("publicReadPolicy", { bucket: websiteBucket.bucket, policy: websiteBucket.bucket.apply(publicReadPolicyForBucket) }); const cloudFrontDistribution = new aws.cloudfront.Distribution("myBucketDistribution", { enabled: true, defaultRootObject: "index.html", origins: [ { customOriginConfig: { httpPort: 80, httpsPort: 443, originProtocolPolicy: "match-viewer", originSslProtocols: ["TLSv1", "SSLv3"] }, originId: websiteBucket.websiteEndpoint, domainName: websiteBucket.websiteEndpoint } ], defaultCacheBehavior: { viewerProtocolPolicy: "redirect-to-https", allowedMethods: ["GET", "HEAD", "OPTIONS"], cachedMethods: ["GET", "HEAD", "OPTIONS"], forwardedValues: { cookies: { forward: "none" }, queryString: false, }, targetOriginId: websiteBucket.websiteEndpoint }, restrictions: { geoRestriction: { locations: [], restrictionType: "none" } }, viewerCertificate: { cloudfrontDefaultCertificate: true } }); exports.websiteUrl = cloudFrontDistribution.domainName; function publicReadPolicyForBucket(bucketName) { return JSON.stringify({ Version: "2012-10-17", Statement: [ { Effect: "Allow", Principal: "*", Action: ["s3:GetObject"], Resource: [ `arn:aws:s3:::${bucketName}/*` // policy refers to bucket name explicitly ] } ] }); }
Ключ, которую мы добавили здесь, — это переменная CloudFrontDistribution
. Он определяет все части для нашего распределения CDN. Это включает в себя поведение по умолчанию кеша, происхождение для нашего ведра на веб -сайте S3, а также ограничения по умолчанию и сертификат SSL для наших конечных пользователей.
Еще один забег Pulumi Up
Должен предоставить наше новое распределение Cloudfront.
$ pulumi up Previewing update (pulumi-static-dev): Type Name Plan pulumi:pulumi:Stack pulumi-static-pulumi-static-dev + └─ aws:cloudfront:Distribution myBucketDistribution create Resources: + 1 to create 3 unchanged
Как только мы подтвердили обновление, мы должны увидеть, что наше доменное имя CloudFront выводится для нас.
Updating (pulumi-static-dev): Type Name Status pulumi:pulumi:Stack pulumi-static-pulumi-static-dev + └─ aws:cloudfront:Distribution myBucketDistribution created Outputs: ~ websiteUrl: "my-bucket-e4e2278.s3-website-us-west-2.amazonaws.com" => "d2stkileejh34y.cloudfront.net" Resources: + 1 created 3 unchanged
Точно так же мы предоставили инфраструктуру поддержать статический веб -сайт в AWS. У нас есть ведро S3 для хостинга и распределение CloudFront для нашей сети доставки контента. Все это было настроено через JavaScript, который Pulumi работает для предоставления нашей инфраструктуры.
Довольно круто, верно? Мы смогли написать код, который мы знаем, и любим предоставить необходимую инфраструктуру в веб -сервисах Amazon. Мы могли бы продолжить расширение этого кода, чтобы добавить псевдонимы DNS для нашего распространения и даже загрузить наши статические файлы веб -сайтов.
Чтобы закрыть вещи, давайте оглянемся на некоторые сходства, различия, преимущества и недостатки, связанные с Pulumi, по сравнению с Terraform.
Размышляя о Пулуми
Стоит отметить, что Pulumi — это другой инструмент, чем Terraform, и, честно говоря, всегда есть место для большего количества инструментов. Каждый инструмент, который входит в инфраструктуру в качестве кодового пространства, дает различные идеи и мнения. Мы можем согласиться с некоторыми из них и не согласиться с другими, это абсолютно нормально. Используйте то, что лучше всего подходит для вашего рабочего процесса.
Тем не менее, вот некоторые мысли, которые я использовал Pulumi.
- Написание вашей инфраструктуры на тех же языках программирования, которые вы используете ежедневно, потрясающе! Избегание кривой обучения, связанной с еще одним DSL, является огромным добавлением ценности. Кроме того, представляя нашу инфраструктуру в коде, таком как JavaScript, мы могли бы легко добавить тесты, используя фреймворки, которые мы уже знаем и любим. Проверка — это то, что заставило многих разработчиков, использующих Terraform, там также есть решения, но не так знакомы, как тестирование кода JavaScript.
план
Команды потрясающие, когда дело доходит до инфраструктуры обеспечения. Приятно видеть, что у Pulumi и Terraform есть общие планы. Очень полезно увидеть визуализацию того, что будет создано, обновлено и уничтожено, когда вы обеспечиваете инфраструктуру через код.- Вход в систему для использования инструмента командной строки нечетная. С Terraform мы можем установить CLI и немедленно использовать его. Это не так с Пулуми, и я считаю, что это разрушительно.
- Государство, государство, государство. Terraform и Pulumi отслеживают вашу инфраструктуру с помощью каких -либо файлов состояний. Вот как они знают, что добавить, обновить и удалять. Разница между ними заключается в том, что Pulumi по умолчанию хранит ваше состояние в веб -бэкэнге (таким образом, этап входа, упомянутый выше). Terraform, с другой стороны, хранит ваше государство по умолчанию по умолчанию.
- Документ Требуется поля. Это действительно заставило меня орехи, пытаясь предоставить распределение Cloudfront с помощью Pulumi. На самом деле мне пришлось открыть их исходный код, чтобы увидеть, какие значения они ожидали при создании нового распределения. На мой взгляд, эта категория прибила эту категорию, Все задокументировано в одном месте и говорит мне, каковы необходимые свойства Анкет
- Не смешивайте мой шоколад с вашей облачной информацией. Смысл таких инструментов, как Terraform и Pulumi, заключается в том, что я могу использовать что -то немного более дружелюбное, чем облачная формация. Ничего против CF, но иногда это умственный прыжок, который не делает. С Pulumi отсутствие документации означало, что мне нужно было найти, какие значения CloudFormation используются для предоставления таких вещей, как распределение CloudFront. Это характерно для инфраструктуры внутри AWS, поэтому ваш пробег может варьироваться.
Это мои мысли об использовании Pulumi в течение нескольких недель. Буду ли я использовать его для нового проекта над Terraform? Вряд ли потому, что я уже нарастал на HCL в Terraform, поэтому у меня нет кривой обучения, которую некоторые, возможно, придется подняться. Я также считаю, что документация вокруг Terraform лучше, и это значительно ускоряет вещи в моей среде развития.
Pulumi — очень способный инструмент и предлагает множество преимуществ, которые Terraform, включая написание кода на языках, которые вы уже знаете и любите. Но у него все еще есть несколько грубых пятен, которые могли бы использовать лак.
Попробуйте это сами, создайте что -то, используя это и посмотрите, перевешивают ли преимущества какие -либо потенциальные недостатки. Знание более одного инструмента никого никогда не повредит! Как всегда, не стесняйтесь задавать вопросы или поделиться своим собственным опытом ниже.
Вы голодны, чтобы узнать еще больше о веб -сервисах Amazon?
Если вы хотите начать свое путешествие AWS, но чувствуете себя потерянным с того, с чего начать, рассмотрим Проверка моего курса . Мы сосредотачиваемся на хостинге, защите и развертывании статических веб -сайтов на AWS. Позволяя нам выучить более 6 различных сервисов AWS, как мы их используем. После того, как вы освоили основы, мы можем затем погрузиться в Две бонусные главы Чтобы охватывать более продвинутые темы, такие как инфраструктура, как код и постоянное развертывание.
Оригинал: «https://dev.to/kylegalbraith/how-pulumi-compares-to-terraform-for-infrastructure-as-code-434j»