Создание локальных модулей с помощью cdktf

Я пытаюсь создать модуль Terraform в CDKTF, следуя документации на https://developer.hashicorp.com/terraform/cdktf/concepts/modules

Я создал модуль, как показано в коде:

#!/usr/bin/env python
from constructs import Construct
from cdktf import App, TerraformStack, TerraformOutput
from imports.aws.provider import AwsProvider
from imports.aws.s3_bucket import S3Bucket

class MyStack(TerraformStack):
    def __init__(self, scope: Construct, id: str):
        super().__init__(scope, id)

        AwsProvider(self, "AWS", region = "eu-west-1", profile = "<MY-PROFILE>")

        bucket_name = '<MY-BUCKET-NAME>'
        # define resources here
        s3_bucket = S3Bucket(
            self, 'testBucket',
            bucket=bucket_name
        )

        TerraformOutput(self, "my_output", value=s3_bucket.arn)

app = App()
MyStack(app, "s3_module")

app.synth()

Затем я создал еще одну папку для основного стека и добавил модуль в файл cdktf.json.

{
  "language": "python",
  "app": "pipenv run python main.py",
  "projectId": "e2b44a02-65b2-42de-ab52-3863d211c94c",
  "sendCrashReports": "true",
  "terraformProviders": [
  "hashicorp/aws@~>4.0"
  ],
  "terraformModules": [{
     "name": "s3_module",
     "source": "../s3_module"
  }],
 "codeMakerOutput": "imports",
 "context": {
    "excludeStackIdFromLogicalIds": "true",
    "allowSepCharsInLogicalIds": "true"
  }
}

Я также назвал модуль в main.py:

#!/usr/bin/env python
from constructs import Construct 
from cdktf import App, TerraformStack
from imports.s3_module import S3Module
from imports.aws.provider import AwsProvider

class MyStack(TerraformStack):
    def __init__(self, scope: Construct, id: str):
        super().__init__(scope, id)

        AwsProvider(self, "AWS", region = "eu-west-1", profile = "<MY-PROFILE>")

        # define resources here
        my_module = S3Module(self, 's3_module')
    

app = App()
MyStack(app, "service_v2")

app.synth()

Однако, когда я запускаю «cdktf deploy», Terraform не добавляет никаких ресурсов:

Можете ли вы помочь мне понять, где ошибка? Спасибо

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Насколько я понимаю, поле terraformModules в файле cdktf.json предназначено для сообщения о том, какие модули Terraform вы хотите использовать, то есть каталоги, содержащие .tf файлы.

Это то, что позволяет команде cdktf get узнать, какие привязки Python вам нужны, чтобы она могла сгенерировать их в ваш каталог imports/. Включение операторов импорта для работы.

Если вместо этого вы хотите выделить части конфигурации вашей инфраструктуры в отдельные модули Python, вы можете адаптировать стратегию, в которой вы создаете подклассы из Construct, следующим образом:

Пример модуля: s3_bucket.py:

import constructs
import cdktf
from imports.aws.provider import AwsProvider
from imports.aws.s3_bucket import (
    S3Bucket
)

class S3BucketInfra(constructs.Construct):

    def __init__(self, scope: constructs.Construct,
                        construct_id: str,
                        bucket_name: str,
                        provider: AwsProvider):
        super().__init__(scope=scope, id=construct_id)
        self.bucket = S3Bucket( self,
                                'bucket',
                                bucket=bucket_name,
                                force_destroy=False,
                                provider=provider  )

Пример основного модуля: main.py:

import constructs
import cdktf
from s3_bucket import (
    S3BucketInfra
)

class SomeExampleStack(cdktf.TerraformStack):

    def __init__(self, scope: constructs.Construct, construct_id: str):
        super().__init__(scope=scope, id=construct_id)
        self.some_bucket = S3BucketInfra(   scope=self,
                                            construct_id='some-bucket',
                                            bucket_name='testBucket',
                                            provider=AwsProvider(self, "AWS", region = "eu-west-1", profile = "<MY-PROFILE>")  )


app = cdktf.App()
SomeExampleStack(scope=app, construct_id = "service_v2")
app.synth()

Я сам новичок в CDKTF, и документация немного тонкая, но это то, что сработало для меня :)

Это решение также работает для меня :). Но как тогда использовать модули, хранящиеся в репозитории (Bitbucket или GitHub)? Я хотел бы переписать приложение и перевести все файлы terraform (команда init вызывает все модули с определенным тегом). Обязательно ли мне создавать библиотеку для установки через pipenv? Спасибо :)

Alberto.Garau 14.02.2023 13:52

Под «модулями, хранящимися в репозитории» вы подразумеваете обычные Terraform? то есть файлы .tf?

willcode.io 14.02.2023 14:31

Точно. У меня есть файлы .tf в репозитории

Alberto.Garau 14.02.2023 14:37

Можете ли вы указать значение source в виде [email protected]:hashicorp/example.git для записей "terraformModules" ?

willcode.io 14.02.2023 14:43

Да, я использую эти модули для всех своих развертываний, меняя версии по мере обновления ([email protected]:hashicorp/example.git//services/aws-module/etl?ref=vx.x.x). Если я помещу этот URL-адрес в cdktf.json, он должен работать (надеюсь). Но хотелось бы выровнять весь код, написав все на CDKTF.

Alberto.Garau 14.02.2023 14:54

Имеет смысл. Я бы просто просмотрел эти модули .tf и вместо этого переписал бы их как модули Python. Затем каждый предоставит класс, который расширяется от constructs.Construct, который вы можете повторно использовать из другого места. Эти модули могут существовать как автономные пакеты Python, например. на своем собственном PyPi или просто перенесите в свой основной репозиторий

willcode.io 14.02.2023 15:03

Я понял. Теперь я попытаюсь пойти по этому пути, непосредственно создав устанавливаемый пакет PyPi. Спасибо, "ты дал мне надежду" :D

Alberto.Garau 14.02.2023 15:19

Другие вопросы по теме