Запуск AWS SAM build из скрипта Python - PullRequest
0 голосов
/ 18 апреля 2019

Я нахожусь в процессе миграции всех стеков CloudFormation в Troposphere, включая Lambda и Lambda-зависимые пользовательские ресурсы CFN.

Одна из моих целей - вообще обойти создание файлов шаблонов, делая Pythonкодировать единственный «источник правды» (т.е. без файлов шаблонов, которые создаются и, следовательно, могут быть отредактированы, что приводит к смещению конфигурации).

Для этого требуется способность:

  1. Передать объект, подобный файлу, построителю SAM (вместо имени файла)

  2. Вызов построителя 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 и посмотреть, что они скажут, если толькоодин из них читает это.

...