Boto3 Cloudformation 错误:模板格式错误:不支持的结构

Posted

技术标签:

【中文标题】Boto3 Cloudformation 错误:模板格式错误:不支持的结构【英文标题】:Boto3 Cloudformation Error: Template format error: unsupported structure 【发布时间】:2019-08-15 21:12:39 【问题描述】:

我无法将参数加载到 python boto3 Cloudformation 客户端。

下面是我的参数文件:

[
  "ParameterKey": "pVpcId",   "ParameterValue": "vpc-XXXXXX",
  "ParameterKey": "pContact", "ParameterValue": "XDXDXX",
  "ParameterKey": "pCC",      "ParameterValue": "XXXXX" ,
  "ParameterKey": "pFormat",  "ParameterValue": "True"
]

我正在通过以下方式将其加载到程序中:

    with open(parameter_file, 'r') as infile:
        parameters=ast.literal_eval(infile.read())
        client = boto3.client('cloudformation',aws_access_key_id=access_key,aws_secret_access_key=secret_key,aws_session_token=session_token,region_name=region)

        response = client.create_stack(
            StackName=stack_name,
            TemplateURL=stack_url,
            Parameters=parameters
        )

当我使用 Cloudformation 建立 boto3 客户端并调用它时,我收到如下所述的错误。调用不带参数,所以肯定跟参数文件有关。

    Traceback (most recent call last):
    File "cf_create_stack", line 85, in <module>
        Parameters=parameters
    File "/usr/lib/python2.7/site-packages/botocore/client.py", line 357, in _api_call
        return self._make_api_call(operation_name, kwargs)
    File "/usr/lib/python2.7/site-packages/botocore/client.py", line 661, in _make_api_call
        raise error_class(parsed_response, operation_name)
    botocore.exceptions.ClientError: An error occurred (ValidationError) when calling the CreateStack operation: Template format error: unsupported structure.

【问题讨论】:

您是否从 CLI 尝试过同样的事情? docs.aws.amazon.com/cli/latest/reference/cloudformation/…. 对以下@swap709 有任何反馈吗?我想 100% 确定。 【参考方案1】:

因此 TemplateBody 参数需要 CloudFormation 模板文件的内容/字符串,而不仅仅是文件名。

以下应该可以令人满意地工作。

cf_template = open('batch-job-cft.yml').read()
cf_client.create_stack(StackName='Batch Job', TemplateBody=cf_template)

# OR

# Optimal usage would be as below
with open('batch-job-cft.yml', 'r') as cf_file:
    cft_template = cf_file.read()
    cf_client.create_stack(StackName='Batch Job', TemplateBody=cft_template)

【讨论】:

谢谢,在这个问题上卡了很久。大多数示例只是传递不适用于 boto 的 'file://'。【参考方案2】:

根据您提供的代码示例,我认为您不可能得到该响应。

我想你可能尝试过TemplateBody 而不是TemplateURL

要重现错误消息,请尝试以下简单示例:

#!/usr/bin/env python

import boto3
import ast

parameter_file = 'parameters.json'

client = boto3.client('cloudformation')

with open(parameter_file, 'r') as infile:
    parameters = ast.literal_eval(infile.read())

response = client.create_stack(
    StackName='TestStack',
    TemplateBody='file://cloudformation.yml',
    Parameters=parameters
)

如果您将参数文件和模板放在预期的位置并运行它,您应该会看到您看到的确切错误消息:

Traceback (most recent call last):
  File "test.py", line 17, in <module>
    Parameters=parameters
  File "/Users/alexharvey/git/home/python-test/virtualenv/lib/python2.7/site-packages/botocore/client.py", line 357, in _api_call                                     
    return self._make_api_call(operation_name, kwargs)
  File "/Users/alexharvey/git/home/python-test/virtualenv/lib/python2.7/site-packages/botocore/client.py", line 661, in _make_api_call                                
    raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (ValidationError) when calling the CreateStack operation: Template format error: unsupported structure.            

注意这个错误:

模板格式错误:不支持的结构

来自AWS API,而不是 Boto3。

当您将file:// URI 或 URL 传递给 TemplateBody 参数时会导致该错误。

此外,我相信如果您真的向 TemplateURL 传递任何内容,则根本不可能得到该响应。

另见:

this 相关答案,用于使用 AWS CLI 重现此错误消息。 API docs 记录了 TemplateBody 和 TemplateURL。

【讨论】:

【参考方案3】:

我是这样解决这个问题的:

    为了加载参数文件(作为字典列表加载),我有以下代码:

    open(parameter_file) 为 f: 参数=json.load(f)

    对于 l in 参数: l['UsePreviousValue']=eval('False')

    为了传递 Cloudformation 模板,我使用了以下代码(基本上将其读取为字符串):

    使用 open(cloudformation_template) 作为 g: template_body=g.read()

最后,我将两个变量都传递到 cloudformation 客户端:

response = client.create_stack(
    StackName=stack_name,
    TemplateBody=template_body,
    Parameters=parameters
)

对我来说出了问题的是 boto3 'Cloudformation' 客户端需要一个“字典列表”作为参数,但需要一个“字符串”作为 cloudformation 模板。

这非常令人沮丧,我正在尝试找到一种方法将其提交给 AWS。

【讨论】:

以上是关于Boto3 Cloudformation 错误:模板格式错误:不支持的结构的主要内容,如果未能解决你的问题,请参考以下文章

使用 boto3 列出 100 多个堆栈

如何使用 cloudformation 模板创建 cloudwatch 事件?

boto3 ses InvalidParameterValue 错误由于 unicode 字符

如何处理boto3的错误?

复制任务设置 JSON 上的 Boto3 DMS 'modify_replication_task' 错误

python boto3错误管理