【问题标题】:Boto3 Cloudformation Error: Template format error: unsupported structureBoto3 Cloudformation 错误:模板格式错误:不支持的结构
【发布时间】: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.

【问题讨论】:

标签: python amazon-web-services amazon-cloudformation boto3


【解决方案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】:

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

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

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

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

    2. 为了传递 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。

    【讨论】:

      猜你喜欢
      • 2017-12-30
      • 2017-06-18
      • 2019-04-26
      • 2018-08-28
      • 2014-11-10
      • 2011-07-14
      • 2020-12-19
      • 2017-08-13
      • 1970-01-01
      相关资源
      最近更新 更多