Я пытаюсь создать модуль 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 не добавляет никаких ресурсов:
Можете ли вы помочь мне понять, где ошибка? Спасибо
Насколько я понимаю, поле 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, и документация немного тонкая, но это то, что сработало для меня :)
Под «модулями, хранящимися в репозитории» вы подразумеваете обычные Terraform? то есть файлы .tf?
Точно. У меня есть файлы .tf в репозитории
Можете ли вы указать значение source
в виде [email protected]:hashicorp/example.git
для записей "terraformModules"
?
Да, я использую эти модули для всех своих развертываний, меняя версии по мере обновления ([email protected]:hashicorp/example.git//services/aws-module/etl?ref=vx.x.x). Если я помещу этот URL-адрес в cdktf.json, он должен работать (надеюсь). Но хотелось бы выровнять весь код, написав все на CDKTF.
Имеет смысл. Я бы просто просмотрел эти модули .tf и вместо этого переписал бы их как модули Python. Затем каждый предоставит класс, который расширяется от constructs.Construct
, который вы можете повторно использовать из другого места. Эти модули могут существовать как автономные пакеты Python, например. на своем собственном PyPi или просто перенесите в свой основной репозиторий
Я понял. Теперь я попытаюсь пойти по этому пути, непосредственно создав устанавливаемый пакет PyPi. Спасибо, "ты дал мне надежду" :D
Это решение также работает для меня :). Но как тогда использовать модули, хранящиеся в репозитории (Bitbucket или GitHub)? Я хотел бы переписать приложение и перевести все файлы terraform (команда init вызывает все модули с определенным тегом). Обязательно ли мне создавать библиотеку для установки через pipenv? Спасибо :)