Я нахожусь в процессе миграции всех стеков CloudFormation в Troposphere, включая Lambda и Lambda-зависимые пользовательские ресурсы CFN.
Одна из моих целей - вообще обойти создание файлов шаблонов, делая Pythonкодировать единственный «источник правды» (т.е. без файлов шаблонов, которые создаются и, следовательно, могут быть отредактированы, что приводит к смещению конфигурации).
Для этого требуется способность:
Передать объект, подобный файлу, построителю SAM (вместо имени файла)
Вызов построителя SAM AWS из Python, а не из CLI
Моей первой наивной идеей было то, что я смогу импортировать несколько модулей из aws-sam-cli
, обернуть вокруг него обертку для io.StringIO
(чтобы сохранить шаблон как объект, похожий на файл) и presto!Затем я посмотрел на исходный код sam build
и вся надежда покинула меня:
Возможно, я не смогу использовать Docker / контейнеры для сборки, так как я сопоставлю среду сборки, включая файлы шаблонов.
AWS SAM CLI не имеет чисто вызываемого набора библиотечных функций, подобного boto3.Закрыть, но не совсем.
Вот ядро исходного кода Python
with BuildContext(template,
base_dir,
build_dir,
clean=clean,
manifest_path=manifest_path,
use_container=use_container,
parameter_overrides=parameter_overrides,
docker_network=docker_network,
skip_pull_image=skip_pull_image,
mode=mode) as ctx:
builder = ApplicationBuilder(ctx.function_provider,
ctx.build_dir,
ctx.base_dir,
manifest_path_override=ctx.manifest_path_override,
container_manager=ctx.container_manager,
mode=ctx.mode
)
try:
artifacts = builder.build()
modified_template = builder.update_template(ctx.template_dict,
ctx.original_template_path,
artifacts)
move_template(ctx.original_template_path,
ctx.output_template_path,
modified_template)
click.secho("\nBuild Succeeded", fg="green")
msg = gen_success_msg(os.path.relpath(ctx.build_dir),
os.path.relpath(ctx.output_template_path),
os.path.abspath(ctx.build_dir) == os.path.abspath(DEFAULT_BUILD_DIR))
click.secho(msg, fg="yellow")
Это зависит от ряда импортов из внутреннего aws-sam-cliбиблиотека со сборками, ориентированными на сборку:
from samcli.commands.build.build_context import BuildContext
from samcli.lib.build.app_builder import ApplicationBuilder, BuildError, UnsupportedBuilderLibraryVersionError, ContainerBuildNotSupported
from samcli.lib.build.workflow_config import UnsupportedRuntimeException
Понятно, что это означает, что это не так просто, как создать что-то вроде клиента boto3, и все!Похоже, мне придется раскошелиться на все это и выбросить почти все, что осталось с помощью команды сборки, контекста и окружения.
Интересно, что sam package
и sam deploy
, в соответствии сдокументы, это просто псевдонимы для aws cloudformation package
и aws cloudformation deploy
, что означает, что может использоваться в boto3!
Кто-нибудь, возможно, уже решил эту проблему?Я гуглил и искал здесь, но ничего не нашел.
Я использую PyCharm и AWS Toolkit , которые отлично подходят для разработки и отладкии оттуда я могу запускать сборки SAM, но он "спрятан" в плагинах PyCharm - которые написаны на Kotlin!
Мой текущий способ - создать шаблоны CFN как временныефайлы и передать их командам CLI, которые вызываются из Python - подход, который мне всегда не нравился.
Я могу добавить запрос на добавление в команду aws-sam-cli и посмотреть, что они скажут, если толькоодин из них читает это.