【发布时间】:2019-04-18 07:07:18
【问题描述】:
我正在将整个 CloudFormation 堆栈迁移到 Troposphere,包括 Lambda 和依赖 Lambda 的 CFN 自定义资源。
我的目标之一是完全规避模板文件的创建,使 Python 代码成为唯一的“真实来源”(即没有创建模板文件,因此可以对其进行编辑,从而导致配置漂移)。
这需要以下能力:
将类似文件的对象传递给 SAM 构建器(而不是文件名)
从 Python 而不是 CLI 调用 AWS SAM 构建器
我的第一个天真的想法是,我可以从 aws-sam-cli 导入一些模块,并在其周围放置一个 io.StringIO 的包装器(将模板保存为类似文件的对象),然后就可以了!然后我查看了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 插件中 - 这是用科特林!
我目前的解决方法是将 CFN 模板创建为临时文件,并将它们传递给从 Python 调用的 CLI 命令——我一直不喜欢这种方法。
我可能会向 aws-sam-cli 团队提出功能请求,看看他们说什么,除非其中有人读到此内容。
【问题讨论】:
标签: aws-sam-cli