Перейти к основному содержимому

Cloud Development Kit для Terraform

· 4 мин. чтения

Что это такое? Удобнее ли обычного Terraform? И можно ли им заменить Serverless framework?

Что такое TF CDK?

Cloud Development Kit позволит вам описывать ресурсы Terraform на привычном вам языке программирования, используя все его нативные конструкции (циклы, условия и т.п.).

Первыми такую концепцию описания ресурсов представили AWS, выпустив в 2018 году первые беты своего CDK.

На самом деле, CDK для Terraform использует концепцию «стека приложения» из библиотеки AWS.

Как же работает TF CDK?

CDK, основываясь на описании инфраструктуры на одном из поддерживаемых языков (Go, TypeScript, Python, Java и C#), синтезирует JSON документ описанного формата, который в свою очередь может быть использован Terraform’ом для развертывания инфраструктуры.

Для того чтобы начать пользоваться CDK, вам нужно установитьего при помощи npm.

npm install -g cdktf-cli

Теперь разберемся откуда же возьмутся библиотеки для языка программирования, если для терраформа описаны лишь провайдеры? Варианта два:

  1. Для самых популярных провайдеров вы можете установить предкомпилированные пакеты.
  2. Во всех остальных случаях нужно лишь указать в cdktf.json список используемых провайдеров и выполнить командуcdktf get. Она скачает нужные провайдеры и сгененрирует на их основе все необходимое.
Схема генерации библиотек для CDK

Архитектура CDK приложения

Приложения написанные с использованием CDKTF представляют собой дерево из конструктов, которые в документации AWS определены как «классы, описывающие “часть состояния системы”».

Тремя основными классами для создания приложения с CDKTF являются App, Stackи Resource.

Каждый проект построенный на CDKTF имеет один или насколько инстансов App— это контейнеры для конфигурации инфраструктуры, которую вы создаете и развертываете. App может содержать несколько [Stack](https://developer.hashicorp.com/terraform/cdktf/concepts/stacks), которые представляют наборы связанной инфраструктуры. Stack синтезирует отдельную конфигурацию терраформа, аналог рабочей директории.

Стеки позволяют разделить управление состоянием внутри приложения. Например, вы можете захотеть развернуть отдельные ресурсы инфраструктуры для разработки и тестирования. Подробнее в документации.

Resource описывает отдельный объект инфраструктуры, точно так же как и в обычном терраформе.

В чем же здесь удобство?

Во-первых, вы пишете код не на json или hcl, а на вашем любимом языке программирования. У вас есть вся мощь IDE, которые умеют отлично навигироваться по коду и давать подсказки.

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

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

Например, в вашей организации принято использовать бакеты S3 с включенным шифрованием и версионированием. Для того, чтобы сделать это в обычном терраформе вам нужно не забыть определить эти параметры каждый раз, когда вы описываете бакет. Используя CDK вы же можете описать свой ресурс, который будет основан на Bucket, назвать его EncryptedVersionedBucket, описать для него один раз все необходимые параметры, а затем поделиться им с коллегами.

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

TF CDK vs Serverless Framework

Если рассматривать Serverless Framework только как средство декларативного деплоя функций, то тут на мой взгляд CDK удобнее. Вам не нужно забираться как описать что-то в YAML.

Но Serverless имеет неплохой набор плагинов и пусть они не всегда хорошо совместимы друг с другом, ожидают разное формат конфигурационного файла, но они добавляют функциональность, которой вам может не хватать в CDK.

Пример.

Чтобы продемонстрировать TF CDK, я переписал деплой одного из моих старых примеров из поста про serverless snapshot’ы с использованием CDK.

yc-serverless-snapshot/main.ts at b06b3e360f402af71833d54b63ab7f0930f1d36c ·… _A complete solution to make periodic Disc snapshots in Yandex Cloud - yc-serverless-snapshot/main.ts at…_github.com

Еще идеи для вдохновения можно поискать тут. Стоит отметить, что примеры отсюда используют AWS CDK, но так как TF CDK перенял от него все основные концепции, их можно переписать и для него.

GitHub - aws-samples/aws-cdk-examples: Example projects using the AWS CDK _This repository contains a set of example projects for the AWS Cloud Development Kit. This repo is our official list of…_github.com

Еще один полезный ресурс по этой теме — https://cdk.dev/. Там можно найти ссылки на статьи и примеры с использованием AWS CDK, Terraform CDK и K8s CDK.