Лу поднял вопрос о взаимодействии модулей Terraform в террафоре CDK:
Модульная взаимодействие — кажется, что CDK будет поддерживать регулярные модули террафора, для совместного использования кода. Но он остается замечен, если обмен модулем может быть изменен. Может ли проект CDK опубликовать модуль, который затем потребляется HCl? Если вам нужно будет изучать HCl для записи и поделиться модулем, который в основном поражает точку использования CDK в первую очередь.
Это отличный вопрос, и хотя я был уверен, что это то, что можно сделать сегодня уже, я думал, что это будет хороший пример, чтобы на самом деле построить. Итак, это то, что я сделал И я хотел бы поделиться с вами.
Общая концепция
Террафор CDK синтезирует от кода до HCl совместимых JSON. Это делает его менее вопросом Если Можно, но больше похоже на вопрос Как организовать код и как его распространять.
Ресурс против Terraformresource.
Концепция, которую я придумал, включает в себя Пользовательская конструкция , который является своего рода эквивалентного собственного террафома модуля на террафоре CDK. Это просто класс TymerctStry, который обернут другие конструкции террафора (EC2 экземпляр
в таком случае). Это может содержать больше конструкций, конечно, их можно было бы вложить, все, что вы можете себе представить — все это просто находятся в конце.
import { Construct } from 'constructs'; import { Resource } from 'cdktf'; import { Instance } from '../imports/providers/aws' export interface CustomInstanceProps { instanceType?: string; tags?: {[key: string]: string}; } export class CustomInstance extends Resource { public readonly instance: Instance; constructor(scope: Construct, name: string, props?: CustomInstanceProps) { super(scope, name); const { tags, instanceType = "t3.nano" } = props || {}; this.instance = new Instance(this, 'ubuntu2', { ami: "ami-0ff8a91507f77f867", availabilityZone: "us-east-1a", instanceType, tags }) } }
В отличие от сгенерированного Экземпляр
класс, CustomIntance
класс расширяет Ресурс И не Террафор Ресурс . В то время как CustomIntance
все еще узел в Конструирует Дерево, CustomIntance
Сам класс будет пропущен во время синтезатора. Только фактический Terraformresource
Классы будут представлены до HCl совместимых JSON. Это действительно просто контейнер для реальных террафовых ресурсов.
Распределение
Пакет NPM
С нашего CustomIntance
Класс TyplectStry, распространяющий это как пакет NPM простой. Обязательно настройте следующие ключи в вашем Package.json.
И выйти:
"main": "path/to/your/construct.js", "types": "path/to/your/construct.d.ts", "peerDependencies": { "cdktf": "^0.0.12", "constructs": "^3.0.0" },
Объявляя Peerdependonds
И не зависимости
Это важный момент здесь. В противном случае, вы, вероятно, окажутся в зависимости от ада.
Модуль террафора
Для того, чтобы распространять это как модуль террафора, это должно быть как-то синтезировано на JSON. Давайте построим стек без провайдера, и это будет значительно синтезировать на эквивалент модуля террафора.
import { Construct } from 'constructs'; import { App, TerraformStack, TerraformOutput, Token } from 'cdktf'; import { CustomInstance } from './construct' class MyStack extends TerraformStack { constructor(scope: Construct, name: string) { super(scope, name); const custom = new CustomInstance(this, 'Custom') new TerraformOutput(this, 'arn', { value: custom.instance.arn }) } }
Вместо того, чтобы игнорировать синтезированный выход в Git, давайте совершить это и настроить CDKTF
Использовать наилучшее имя папки ( модуль
В этом случае) для его вывода:
{ "language": "typescript", "app": "npm run --silent compile && node lib/module.js", "terraformProviders": [ "aws@~> 2.0" ], "codeMakerOutput": "imports", "output": "module" }
Для местного модуля Terraform Module было бы неплохо опустить Стек следы В сгенерированном JSON, поскольку это изменится в зависимости от того, где он построен. Немного JQ
может быть полезно здесь
cat ./cdktf.out/cdk.tf.json | jq 'walk(if type == "object" then with_entries(select(.key | test("\/\/") | not)) else . end)'
Средний/долгосрочный, нативную поддержку было бы лучше. Проверьте это Открыть вопрос здесь Отказ
Входные переменные
Terraporm входные переменные Еще не поддерживаются Terraform CDK. Есть Открытая проблема изменить это. Тем не менее, это случай, когда Убегающие люки пригодиться:
const stack = new MyStack(app, 'cdktf-hybrid-module'); // See issue linked above, this will be natively supported stack.addOverride('variable', { tags: { description: "Tags for the instance", type: "map(string)" }, instance_type: { description: "Instance type", type: "string" } })
Отсюда, это действительно полезно для любого другого модуля террафора:
module "instance" { source = "github.com/skorfmann/cdktf-hybrid-module//packages/cdktf-hybrid-module/module" instance_type = "t3.nano" tags = { "CDKTF" = "IS AWESOME" } }
Бонус: модуль террафора через NPM
Одна вещь, которую мне очень нравится в NPM: это не приносит никаких предположений о том, что вы намереваетесь отправить. Давайте использовать это, использовать нативный модуль террафора через NPM:)
npm init -y npm install cdktf-hybrid-module
А затем просто ссылайся из node_modules.
.
module "instance" { source = "./node_modules/cdktf-hybrid-module/module" instance_type = "t3.nano" tags = { "CDKTF" = "IS AWESOME" } }
Это может быть способ получить управление зависимостями для местных террафовых модулей через NPM. Я, конечно, не первый, кто имел эту идею, я почти уверен, что видел это в других постах в блоге.
Я думаю, что это может иметь смысл в сложных сценариях, где управление зависимостью важна и управлять вручную, это становится бременем.
Текущие ограничения
Как уже упоминалось несколько раз, на данный момент есть несколько пробелов на удобство использования:
- Выходы уже полностью поддерживаются
CDKTF
Но из-за случайного имена немного сложно использовать. Там ‘an Открытая проблема обратиться к этому - Переменные не поддерживаются в
CDKTF
Тем не менее, но все еще можно сделать с Убегающие люки Отказ Есть открытый вопрос - Поскольку на данный момент нет официальных пакетов пребультаских поставщиков, это должно встроить Сгенерированные конструкции Отказ
Последний пункт является самым большим недостатком на данный момент с моей точки зрения, но работа по улучшению этого ведется — увидеть этот открытый вопрос .
Вывод
Я думаю, что это демонстрирует, что гибридные пакеты CDK/Terraform модули полностью возможны и имеют множество будущих потенциалов. Хотел бы услышать, что вы думаете об этом!
Проверьте весь пример проекта, чтобы увидеть все это в полном контексте.
Skorfmann/cdktf-hybrid-модуль
Террафора CDK Construct, которая также используется как модуль террафора
В следующем посте мы построим пакет Python для нашего маленького CustomIntance
, быть в курсе!
Оригинал: «https://dev.to/skorfmann/a-terraform-cdk-construct-which-doubles-as-native-terraform-module-447k»