Создание инфраструктуры AWS с помощью CDK for Terraform

Оглавление

  • Введение
  • Что такое CDKTF
  • Как работает CDKTF
  • Примеры использования CDKTF
  • Шаги к работе с CDK for Terraform
    • Шаг 1 Установка предварительных требований
      • Установите Terraform
      • Установите менеджер пакетов node
      • Установите pipenv
      • Настройте учетные данные облака AWS
    • Шаг 2 Установите CDKTF
    • Шаг 3 Создайте проект CDKTF
    • Шаг 4 Определение инфраструктуры AWS с помощью Python
    • Шаг 5 Развертывание инфраструктуры
      • pipenv install
      • cdktf get
      • cdktf synth
      • cdktf deploy
  • Очистка демонстрационной версии
    • cdktf destroy
  • Компоненты и архитектура
  • CDK для Terraform некоторые ключевые концепции
    • Конструкции
    • Провайдер
    • Ресурсы
    • Модули
  • Заключение
  • Библиография и ссылки

Введение

Terraform является одним из наиболее широко используемых инструментов для предоставления инфраструктуры в виде кода. Он написан с использованием Hashicorp Language или HCL сокращенно.
В 2021 году Hashicorp представила поддержку создания инфраструктуры с помощью наиболее распространенных языков программирования и назвала ее Cloud Development Kit for Terraform (CDK for Terraform) или CDKTF.

В этой статье мы рассмотрим, как приступить к созданию инфраструктуры в CDKTF для облачного провайдера AWS. Я буду использовать язык Python для создания инфраструктуры в AWS с помощью CDKTF.

Компания Hashicorp представила Terraform CDK в связи с растущей популярностью поддержки инструментов Infrastructure as code, основанных на языках программирования. Другими инструментами являются AWS CDK и Pulumi.


Что такое CDKTF

Согласно документации по Terraform CDKTF

Cloud Development Kit for Terraform (CDKTF) позволяет вам использовать знакомые языки программирования для определения и предоставления инфраструктуры. Это дает вам доступ ко всей экосистеме Terraform без изучения HashiCorp Configuration Language (HCL) и позволяет использовать возможности существующего инструментария для тестирования, управления зависимостями и т. д.

CDKTF в настоящее время поддерживает TypeScript, Python, Java, C# и Go (экспериментально), а CDK для Terraform находится в стадии бета-версии (по состоянию на Mar-2022).

Как работает CDKTF

CDK for Terraform использует концепции и библиотеки из AWS Cloud Development Kit для преобразования вашего кода в файлы конфигурации инфраструктуры для Terraform.

На высоком уровне вы будете:

Создавать приложение: Использовать встроенный или собственный шаблон для создания проекта на выбранном вами языке.

Определять инфраструктуру: Используйте выбранный язык для определения инфраструктуры, которую вы хотите предоставить одному или нескольким провайдерам. CDKTF автоматически извлекает схему из провайдеров и модулей Terraform для генерации необходимых классов для вашего приложения.

Развертывание: Используйте команды cdktf CLI для предоставления инфраструктуры с помощью Terraform или синтезируйте свой код в конфигурационный файл JSON, который другие могут использовать непосредственно с Terraform.

Примеры использования CDKTF

CDKTF предлагает множество преимуществ, но это не правильный выбор для каждого проекта. Ниже приведены возможные сценарии использования CDKTF:

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

Шаги к освоению CDK for Terraform

  • Теперь давайте приступим к практической работе с CDKTF

Шаг 1 Установка предварительных требований

  • Нам необходимо установить Terraform и NodeJS для CDKTF.
  • Также нам нужно настроить учетные данные AWS для настройки инфраструктуры в AWS

Установите Terraform

  • Перейдите в раздел загрузки Terraform и установите Terraform v1.0+.

Установите менеджер пакетов node

  • Перейдите к репозиторию nodesource на GitHub и следуйте инструкциям для установки NodeJS

Установите pipenv

  • Установите менеджер пакетов Python pipenv с помощью команды
sudo apt install pipenv
Войдите в полноэкранный режим Выйдите из полноэкранного режима

Настройка учетных данных облака AWS

  • Terraform по умолчанию использует учетные данные AWS, которые доступны в одном из файлов Environment Variables или Shared Credentials.
  • Обратитесь к документации по аутентификации AWS в Terraform для настройки AWS auth для Terraform.

Шаг 2 Установка CDKTF

  • Установите CDK последней версии с помощью команды,
npm install --global cdktf-cli@latest
Войдите в полноэкранный режим Выйти из полноэкранного режима
  • Проверьте установку, выполнив команду,
cdktf help
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь у нас есть все необходимое, чтобы приступить к созданию инфраструктуры в AWS с помощью Python

Шаг 3 Создание проекта CDKTF

  • Новые пользователи могут выполнить команду cdktf init для создания проекта cdktf для определенного языка программирования
  • Команда cdktf init создает необходимые файлы, необходимые для начала разработки инфры с использованием языка программирования
  • Ниже приведен пример вывода cdktf init, который показывает опции выбора деталей проекта и языка программирования
  • Я создал каталог примеров под названием aws-tier для демонстрационных целей
$ mkdir aws-tier
$ cd aws-tier

$ cdktf init
The 'npm view' command generated an error stream with content [npm notice 
npm notice New patch version of npm available! 8.5.2 -> 8.5.5
npm notice Changelog: <https://github.com/npm/cli/releases/tag/v8.5.5>
npm notice Run `npm install -g npm@8.5.5` to update!
npm notice]
Newer version of Terraform CDK is available [0.9.4] - Upgrade recommended
Welcome to CDK for Terraform!

By default, cdktf allows you to manage the state of your stacks using Terraform Cloud for free.
cdktf will request an API token for app.terraform.io using your browser.

If login is successful, cdktf will store the token in plain text in
the following file for use by subsequent Terraform commands:
    USER_HOME_DIR/.terraform.d/credentials.tfrc.json

Note: The local storage mode isn't recommended for storing the state of your stacks.

? Do you want to continue with Terraform Cloud remote state management? No
? What template do you want to use? python-pip

Initializing a project using the python-pip template.
? projectName: aws-tier
? projectDescription: A simple getting started project for cdktf.
Requirement already satisfied: cdktf~=0.8.3 in USER_HOME_DIR/.local/lib/python3.9/site-packages (from -r requirements.txt (line 1)) (0.8.3)
Requirement already satisfied: jsii<2.0.0,>=1.47.0 in USER_HOME_DIR/.local/lib/python3.9/site-packages (from cdktf~=0.8.3->-r requirements.txt (line 1)) (1.50.0)
Requirement already satisfied: publication>=0.0.3 in USER_HOME_DIR/.local/lib/python3.9/site-packages (from cdktf~=0.8.3->-r requirements.txt (line 1)) (0.0.3)
Requirement already satisfied: constructs<11.0.0,>=10.0.12 in USER_HOME_DIR/.local/lib/python3.9/site-packages (from cdktf~=0.8.3->-r requirements.txt (line 1)) (10.0.14)
Requirement already satisfied: python-dateutil in /usr/lib/python3/dist-packages (from jsii<2.0.0,>=1.47.0->cdktf~=0.8.3->-r requirements.txt (line 1)) (2.8.1)
Requirement already satisfied: attrs~=21.2 in USER_HOME_DIR/.local/lib/python3.9/site-packages (from jsii<2.0.0,>=1.47.0->cdktf~=0.8.3->-r requirements.txt (line 1)) (21.2.0)
Requirement already satisfied: typing-extensions<5.0,>=3.7 in USER_HOME_DIR/.local/lib/python3.9/site-packages (from jsii<2.0.0,>=1.47.0->cdktf~=0.8.3->-r requirements.txt (line 1)) (4.0.1)
Requirement already satisfied: cattrs<1.10,>=1.8 in USER_HOME_DIR/.local/lib/python3.9/site-packages (from jsii<2.0.0,>=1.47.0->cdktf~=0.8.3->-r requirements.txt (line 1)) (1.9.0)
========================================================================================================

  Your cdktf Python project is ready!

  cat help                Prints this message

  Compile:
    python3 ./main.py     Compile and run the python code.

  Synthesize:
    cdktf synth [stack]   Synthesize Terraform resources to cdktf.out/

  Diff:
    cdktf diff [stack]    Perform a diff (terraform plan) for the given stack

  Deploy:
    cdktf deploy [stack]  Deploy the given stack

  Destroy:
    cdktf destroy [stack] Destroy the given stack

  Learn more about using modules and providers https://cdk.tf/modules-and-providers

========================================================================================================

Вход в полноэкранный режим Выйти из полноэкранного режима
  • Также можно выполнить следующую команду для выбора шаблона на основе python-pip и бэкенда local.
cdktf init --template="python-pip" --local
Войти в полноэкранный режим Выйти из полноэкранного режима
  • Мы видим, что приведенные ниже файлы были созданы командой cdktf init.
$ ls
cdktf.json  help  main.py  requirements.txt
Войти в полноэкранный режим Выйти из полноэкранного режима

Шаг 4 Определение инфраструктуры AWS с помощью Python

  • Клонируйте образец репозитория с GitHub
  • Мы можем увидеть несколько файлов, но нас интересуют два из них
    • Файл1: main.py — Это основной файл, который содержит определение инфраструктуры на языке программирования python.
#!/usr/bin/env python
from constructs import Construct
from cdktf import App, TerraformStack, TerraformOutput
from imports.aws import AwsProvider, ec2


class CDKDemoStack(TerraformStack):
  def __init__(self, scope: Construct, ns: str):
    super().__init__(scope, ns)

    AwsProvider(self, "Aws", region="us-west-2")

    cdkdemoInstance = ec2.Instance(self, "cdkdemo",
      ami="ami-005e54dee72cc1d00",
      instance_type="t2.micro",
    )

    TerraformOutput(self, "cdkdemo_public_ip",
      value=cdkdemoInstance.public_ip
    )

app = App()
CDKDemoStack(app, "cdkdemo-terraform")

app.synth()
Вход в полноэкранный режим Выйти из полноэкранного режима
  • Файл2: cdktf.json — Этот файл содержит определение версии облачного провайдера, также содержит ссылки на модули Terraform.
    • Я изменил terraformProviders и добавил "hashicorp/aws@~> 3.67.0".
{
  "language": "python",
  "app": "pipenv run python main.py",
  "projectId": "project_id_generated_by_init",
  "terraformProviders": [
    "hashicorp/aws@~> 3.67.0"
  ],
  "terraformModules": [],
  "codeMakerOutput": "imports",
  "context": {
    "excludeStackIdFromLogicalIds": "true",
"allowSepCharsInLogicalIds": "true"
  }
}
Вход в полноэкранный режим Выйдите из полноэкранного режима
  • Скопируйте содержимое вышеуказанных файлов в соответствующие файлы нашего демонстрационного проекта aws-tier.

Шаг 5 Установка Infra

pipenv install

  • Поскольку мы выбрали шаблон python.pip, нам нужно выполнить команду pipenv install.
  • Она преобразует файл requirements.txt в Pipfile, а также создаст Pipfile.lock.
$ pipenv install
requirements.txt found, instead of Pipfile! Converting…
Warning: Your Pipfile now contains pinned versions, if your requirements.txt did. 
We recommend updating your Pipfile to specify the "*" version, instead.
Pipfile.lock not found, creating…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (d69941)!
Installing dependencies from Pipfile.lock (d69941)…
  🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 9/9 — 00:00:02
To activate this project's virtualenv, run the following:
 $ pipenv shell
Вход в полноэкранный режим Выход из полноэкранного режима

cdktf get

  • Эта команда генерирует CDK Constructs для провайдеров и модулей Terraform в проекте
  • Выполните команду cdktf get для получения необходимых ресурсов AWS, которые будут сохранены в каталоге imports.
  • Обратите внимание, что каталог import похож на временный каталог .terraform и должен быть проигнорирован при переносе кода в систему контроля исходных текстов, например git (проверьте файл .gitignore).
$ cdktf get
Generated python constructs in the output directory: imports
Вход в полноэкранный режим Выход из полноэкранного режима

cdktf synth

  • Синтезирует код Terraform для заданного приложения в каталоге.
  • Эта команда создает файл tfstate.
$ cdktf synth
Generated Terraform code for the stacks: cdkdemo-terraform
Войти в полноэкранный режим Выйти из полноэкранного режима
  • Приведенная выше команда создаст папку cdktf.out, содержащую всю сгенерированную конфигурацию Terraform JSON.

cdktf deploy

  • Развертывание и создание инфраструктуры в указанном провайдере
$ cdktf deploy
Deploying Stack: cdkdemo-terraform
Resources
 ✔ AWS_INSTANCE         cdkdemo             aws_instance.cdkdemo

Summary: 1 created, 0 updated, 0 destroyed.

Output: cdkdemo_public_ip = 34.209.44.175

Вход в полноэкранный режим Выйти из полноэкранного режима
  • При выполнении вышеуказанной команды в текущей директории будет создан файл tfstate.lock, так как при настройке проекта мы выбрали локальный бэкенд.

Очистка демонстрационной версии

cdktf destroy

  • Уничтожьте созданную инфру с помощью этой команды
$ cdktf destroy
Destroying Stack: cdkdemo-terraform
Resources
 ✔ AWS_INSTANCE         cdkdemo             aws_instance.cdkdemo

Summary: 1 destroyed.

Вход в полноэкранный режим Выйти из полноэкранного режима

Компоненты и архитектура

В соответствии с архитектурой, описанной в документации

CDKTF синтезирует инфраструктуру, которую вы определяете на поддерживаемом языке программирования, в конфигурационные файлы JSON, которые Terraform может использовать для управления инфраструктурой.

На диаграмме ниже показано, как синтез приложения CDKTF создает серию артефактов в назначенной выходной папке.

CDK для Terraform некоторые ключевые понятия

  • Необходимо отметить некоторые ключевые понятия в CDK for Terraform: 1. Конструкции, 2. Провайдер, 3. Модули и 4. Ресурсы

В соответствии с документацией CDKTF:

Конструкты

Construct — это общий термин, который вы можете использовать для описания частей вашего проекта CDK for Terraform (CDKTF), потому что каждый элемент в приложении CDKTF является потомком базового класса Construct. Все приложение, каждый стек и каждый ресурс являются конструктами.

Провайдер

Провайдер — это плагин Terraform, который позволяет пользователям управлять внешним API. Плагины провайдера, такие как провайдер AWS или провайдер cloud-init, выступают в качестве уровня перевода, который позволяет Terraform взаимодействовать с различными облачными провайдерами, базами данных и сервисами.

Ресурсы

Они являются наиболее важным элементом при определении инфраструктуры в приложениях CDKTF. Каждый ресурс описывает один или несколько объектов инфраструктуры, таких как виртуальные сети, вычислительные экземпляры или компоненты более высокого уровня, например, записи DNS.

Модули

Модуль Terraform — это один каталог, содержащий один или несколько файлов конфигурации.

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


Заключение

В этой статье я рассказал о том, как начать работу с CDKTF, концепциях cdktf, установке и настройке проекта.

Также я рассказал о некоторых важных командах для настройки и развертывания инфраструктуры в AWS.

Надеюсь, это было полезно.

Читайте другие статьи из серии учебников по Terraform, чтобы узнать о нем больше.

Библиография и ссылки

  • Создание инфраструктуры AWS с помощью Python-pip

  • Примеры CDKTF

  • CDKTF

  • Hashicorp Learn


Следуйте за мной и делитесь своими мыслями,

  • LinkedIn
  • Twitter
  • GitHub
  • gsaravanan.dev

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *