Эффективное управление стоимостью облачных ресурсов с помощью Infracost и Open Policy Agent в Jenkins

Эффективное управление стоимостью облачных ресурсов с помощью Infracost и Open Policy Agent в Jenkins

13 июня 2023 г.

На этапе развертывания решающим вопросом является оценка стоимости ресурсов, необходимых для развертывания вашего замечательного приложения в рамках выделенного или рекомендованного бюджета. Если не ответить на этот вопрос, это может привести к превышению выделенной или заложенной в бюджет суммы из-за затрат на создание ресурсов.

Одним из инструментов, который был разработан для проверки стоимости облачных ресурсов, является Infracost. Infracost — ценный инструмент, предназначенный для мониторинга и контроля стоимости облачных ресурсов. В отличие от таких инструментов, как калькулятор AWS, Infracost отличается автоматизированным подходом. Просто анализируя формат JSON ваших ресурсов, созданных Terraform, в качестве аргумента для команды Infracost CLI. , он автоматически предоставляет ежемесячную оценку затрат на развертываемые ресурсы, в то время как калькулятор AWS требует ручного ввода каждого создаваемого ресурса.

Эта статья призвана помочь вам, читатель, получить смету расходов на ваши облачные ресурсы с помощью Infracost. Он охватывает создание политики Open Policy Agent (OPA) для обеспечения соблюдения ежемесячных бюджетных ограничений и интеграцию команды infracost в конвейер Jenkins. Подробные инструкции по настройке Infracost см. в официальной документации.

Файлы terraform для создаваемых ресурсов хранятся в папке terrafom, которая находится в том же месте, что и Jenkinsfile. Это формат расположения файлов, используемый в этой статье.

Когда мы выполняем команду Infracost в конвейере Jenkins, мы используем официальный образ докера Infracost в качестве агента Jenkins, наряду с настройкой основных переменных среды.

Вот пример того, как должна быть настроена конфигурация:

agent {
  docker {
    image 'infracost/infracost:ci-latest'
    args "--user=root --entrypoint=''"
          }
       }
environment {
   INFRACOST_API_KEY = credentials("INFRACOST_API_KEY")
   INFRACOST_VCS_PROVIDER = 'github'
   INFRACOST_VCS_REPOSITORY_URL = 'https://github.com/Okeybukks/devops-automation'
    }

Чтобы получить свой INFRACOST_API_KEY, вы можете запустить эту команду в своем кли.

infracost configure get api_key

Кроме того, вы можете получить доступ к информационной панели Infracost, войти в систему, используя свои учетные данные, перейти к «Настройки организации» и нажать кнопку «Копировать» рядом с ключом API. Этот ключ необходимо надежно хранить как секретный текст в учетных данных Jenkins с идентификатором INFRACOST_API_KEY. Учитывая, что наш репозиторий Git размещен на GitHub, установите для параметра INFRACOST_VCS_PROVIDER значение «GitHub». Кроме того, укажите INFRACOST_VCS_REPOSITORY_URL в качестве URL-адреса репозитория, содержащего папку Jenkinsfile и Terraform.

После настройки Infracost для Jenkins следующий шаг включает в себя выполнение команды разбивка Infracost. Эта команда анализирует план Terraform и предоставляет оценку стоимости облачных ресурсов, предназначенных для развертывания. Полученный результат сохраняется в формате файла JSON, который будет использоваться нашей политикой OPA.

 stage("Check Financial Expense of Infrastructures Job with Infracost"){
   agent {
     docker {
       image 'infracost/infracost:ci-latest'
       args "--user=root --entrypoint=''"
             }
         }
   environment {
       INFRACOST_API_KEY = credentials("INFRACOST_API_KEY")
       INFRACOST_VCS_PROVIDER = 'github'
       INFRACOST_VCS_REPOSITORY_URL = 'https://github.com/Okeybukks/devops-automation'
            }
   steps{
       dir("./terraform") {
          sh 'echo "This is the financial check job"'     
          sh 'infracost breakdown --path . --format json --out-file infracost.json'
          archiveArtifacts artifacts: 'infracost.json'
           } 
          }
   }

Файлы terraform расположены в папке terraform, поэтому для перехода в папку terraform мы будем использовать блок dir.

Команда разбивка инфраструктуры принимает пару аргументов со значениями, передаваемыми ей.

--path принимает путь, по которому расположены файлы terraform. Поскольку мы уже находимся в папке terraform, мы используем . для ссылки на путь.

--format принимает формат вывода команды разбивка инфраструктуры.

--out-file берет имя файла, в который вы хотите сохранить вывод разбивка инфракостов.

Чтобы разрешить использование выходного файла, сгенерированного командой infracost break, на последующих этапах, этот файл анализируется командой "archiveArtifacts", преобразуя его в артефакт. Для более полного понимания создания и копирования артефактов я приглашаю вас изучить статью Я писал на артефактах Jenkins.

Чтобы установить ограничение затрат на создание ресурсов, используется политика OPA. В этой статье мы накладываем ограничение в 100 долларов на выделенные ресурсы. OPA служит комплексным набором инструментов и платформой для реализации политик во всей облачной экосистеме. Чтобы глубже изучить OPA, вы можете найти дополнительную информацию, нажав здесь

Политики OPA написаны на языке rego, поэтому файл политики имеет суффикс .rego.

документация для rego служит исчерпывающим ресурсом для понимания формулировок политики. В этой статье будет представлена ​​простая политика, которая проверяет, превышает ли совокупная месячная оценка ваших облачных ресурсов предустановленную максимальную месячную оценку, которая не должна превышаться.

package infracost

deny[out] {

    # define a variable
    maxMonthlyCost = 100.0

    msg := sprintf(
        "Total monthly cost must be less than $%.2f (Current monthly cost is $%.2f)",
        [maxMonthlyCost, to_number(input.totalMonthlyCost)],
    )

    out := {
        "msg": msg,
        "failed": to_number(input.totalMonthlyCost) >= maxMonthlyCost
    }
}

Строка package infracost — это пакет или модуль infracost, используемый OPA для понимания содержимого выходного файла из команды infracost разбивки. Политики OPA записываются в блоке deny[out]. Любой код, написанный вне этого блока, вернет ошибку rego_parse_error.

maxMonthlyCost – это определенная переменная, которая представляет собой максимальную сумму, предусмотренную в бюджете для наших ресурсов.

Сообщение, которое будет выводиться в конвейер Jenkins, и сообщение фиксации GitHub, если заданное условие не выполняется, определяется в блоке msg.

Логика условия задается с помощью блока out. Общая оценка стоимости наших ресурсов сохраняется в переменной input.totalMonthlyCost. Эта переменная является переменной по умолчанию в языке rego. input.totalMonthlyCost – это общая ежемесячная стоимость, рассчитанная с помощью инфрароста.

Согласно нашей политике, если to_number(input.totalMonthlyCost) >= maxMonthlyCost имеет значение true, конвейер останавливается и предотвращается переход к следующему этапу конвейера. Сообщение в блоке msg объясняет нам, что мы не можем двигаться дальше. Содержимое этой политики хранится в файле с именем infracost-policy.rego. Это имя файла можно изменить, но к нему должен быть добавлен формат .rego.

Когда политика написана, она затем анализируется командой infracost comment github. Вот так выглядит сцена.

stage("Post Infracost comment"){
  agent {
     docker {
        image 'infracost/infracost:ci-latest'
        args "--user=root --entrypoint=''"
             }
        }
  environment {
     INFRACOST_API_KEY = credentials("INFRACOST_API_KEY")
     INFRACOST_VCS_PROVIDER = 'github'
     INFRACOST_VCS_REPOSITORY_URL = 'https://github.com/Okeybukks/devops-automation'
     INFRACOST_VCS_BASE_BRANCH = 'main'
     GITHUB_TOKEN = credentials("GITHUB_TOKEN")
     GITHUB_REPO = "Okeybukks/devops-automation"
         }
  steps{
     dir('./terraform'){
         sh 'echo "This is the financial check job"'
         copyArtifacts filter: 'infracost.json', fingerprintArtifacts: true, projectName: 'test', selector: specific ('${BUILD_NUMBER}')    

         sh 'infracost comment github --path infracost.json --policy-path infracost-policy.rego 
                    --github-token $GITHUB_TOKEN --repo $GITHUB_REPO --commit $GIT_COMMIT'
         }
     }
 }

При наблюдении вы заметите добавление новых переменных среды, необходимых для этого этапа. Поскольку команда infracost будет отвечать за публикацию сообщения о коммите в наш репозиторий, для эффективного выполнения этой задачи ей потребуются определенные разрешения на доступ к GitHub.

Создайте классический токен с установленным флажком разрешения репо. Если вы можете прочитать, как сгенерировать классический токен GitHub, используя этот токены доступа">статья. После создания сохраните его в своих учетных данных Jenkins, используя секретный текст, и сохраните его с идентификатором GITHUB_TOKEN .

Также необходимо имя репозитория GitHub для этого проекта. Сохраните это значение в идентификаторе GITHUB_REPO.

Вывод команды разбивка инфракоста сохраняется в файле infracost.json. Для доступа к файлу на этом этапе используется copyArtifacts.

Теперь у нас есть все значения аргументов, необходимые команде infracost comment github для использования нашей политики при создании проверки на создание ресурса.

Значение --path – это файл, созданный с помощью команды разбивка инфракоста, т. е. infracost.json

.Значение

--policy — это файл политики, который мы создали, т. е. infracost-policy.rego .

Значение

--github-token — это наш классический токен GitHub, хранящийся в GITHUB_TOKEN .

--repo — это имя репозитория проекта, хранящегося в GITHUB_REPO

.

--commit требуется для публикации фиксации запроса на вытягивание. Его значение хранится в переменной $GIT_COMMIT, одной из переменных Jenkins по умолчанию.

Когда вы запускаете свой конвейер, у вас должно быть что-то подобное, если оценка ваших ресурсов превышает установленную отметку.

+ infracost comment github --path infracost.json --policy-path infracost-policy.rego --github-token **** --repo Okeybukks/devops-automation --commit a0e8fa201d81ba9d2a508e4adc55e2b8f1ffca6d
time="2023-06-12T04:29:15Z" level=info msg="Finding matching comments for tag infracost-comment"
time="2023-06-12T04:29:21Z" level=info msg="Found 0 matching comments"
time="2023-06-12T04:29:21Z" level=info msg="Creating new comment"
time="2023-06-12T04:29:21Z" level=info msg="Created new comment https://github.com/Okeybukks/devops-automation/commit/a0e8fa201d81ba9d2a508e4adc55e2b8f1ffca6d#commitcomment-117572438"
Comment posted to GitHub

Error: Policy check failed:

 - Total monthly cost must be less than $100.00 (Current monthly cost is $168.72)

На этом статья заканчивается.

Внедрение этого подхода к мониторингу затрат не только приведет к экономии затрат на использование ресурсов, но и предотвратит непреднамеренное развертывание незапланированных облачных ресурсов. Спасибо, что прочитали.

:::информация Также опубликовано здесь.

Главное изображение для этой статьи было создано с помощью генератора изображений HackerNoon AI Image Generator с помощью подсказки "Скакучка, считающая монеты".

:::


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE