Рубрики
Uncategorized

Как Pulumi сравнивается с терраформой для инфраструктуры как кода

Я был большим поклонником Terraform для многих моих недавних работ. Есть что -то в … с меткой AWS, DevOps, Tools, Technology.

Я был большим поклонником Terraform для многих моих недавних работ. Есть что -то в модульности, которую он привносит в инфраструктуру как код, который мне действительно нравится. Если вы не проверили мои предыдущие посты вокруг Terraform, дайте им прочитание.

В то время как 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, чтобы открыть вход в ваш браузер. После входа в систему вы можете вернуться к терминалу и закончить настройку.

  1. Оставьте имя проекта по умолчанию.
  2. Оставьте описание проекта по умолчанию.
  3. Создать -dev стек.
  4. Выберите Нет Когда предложено с опцией создания.

Теперь мы должны быть в состоянии посмотреть на содержимое нашего 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»