Boto3云信息错误:模板格式错误:不支持的structu

2024-09-29 00:15:50 发布

您现在位置:Python中文网/ 问答频道 /正文

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

下面是我的参数文件:

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

我按以下方式将其加载到程序中:

^{pr2}$

当我用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.

Tags: 文件inapi参数usrlineerrorcall
3条回答

我是如何解决这个问题的:

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

    打开(参数_文件)为f: 参数=json.load文件(六)

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

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

    打开(cloudformation_模板)为g: template_body=g.read()

最后,我将这两个变量传递给cloudformation客户机:

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

对我来说,出问题的地方是boto3'Cloudformation'客户机需要一个'listofdictionaries'作为参数,但是对Cloudformation模板需要一个'string'。在

这是非常令人沮丧的,我正试图找到一种方法,以提高这一点的AWS。在

我相信基于您提供的代码示例,您不可能得到这样的响应。在

我想你可能试过TemplateBody而不是{}?在

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

#!/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
)

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

^{pr2}$

请注意,此错误:

Template format error: unsupported structure

来自AWS API,不是Boto3。在

file:// URI或URL传递到TemplateBody参数时会导致此错误。在

此外,我相信如果您真的向TemplateURL传递了任何信息,就不可能得到这样的响应。在

另请参见:

  • this相关答案,用于使用awscli重新生成此错误消息。在
  • API docs其中记录了TemplateBody和TemplateURL。在

因此TemplateBody参数需要CloudFormation模板文件的content/str,而不仅仅是文件名。在

以下各项应能令人满意地工作。在

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


# Optimally 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)

相关问题 更多 >