#module-boundary-inputs-outputs
Как провести границу модуля? Что выносить в inputs, что в outputs?
Что отвечать
Модуль - чёрный ящик с контрактом. Inputs - всё что меняется между использованиями (имя bucket'а, регион, теги). Outputs - всё что понадобится снаружи для других ресурсов (ARN, endpoint, id). Внутри модуля - locals и реализация. Антипаттерн: модуль с 40 input'ами, где половина дублирует поля ресурса AWS - тогда модуль не упрощает, а добавляет слой. Хороший модуль скрывает решения, не транзакционно пробрасывает каждую опцию провайдера.
Что хотят услышать
Senior должен: - назвать критерий «хорошего» input'а: меняется между вызовами, не имеет разумного default'а в контексте модуля - сказать что output должен возвращать то, что нужно соседним ресурсам, а не «всё на всякий случай» - каждый output это часть public API, его удаление - breaking change - различить три уровня: variable (вход), local (внутренняя константа), output (выход). Local НЕ output - не утекает - упомянуть `description` обязательно для всех variable и output, особенно для shared-модулей: это документация, читают коллеги через `terraform-docs`
Подводные камни
- ✗ Сделать input на каждый атрибут AWS-ресурса - модуль превращается в alias для ресурса, без добавленной ценности
- ✗ Не дать default'ы на input'ы там, где разумный default есть - каждый вызывающий пишет одно и то же
- ✗ Выложить через output sensitive значение без `sensitive = true` - случайно засветишь в CI-логах
Follow-up
- ? Чем отличается `variable` от `local` концептуально?
- ? Можно ли давать default на input типа `object()`? Что внутри?
- ? Когда output должен быть `sensitive = true`?
Глубина в базе знаний