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

时间:2019-03-25 15:16:26

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

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

下面是我的参数文件:

@Override
protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) {
  Object principal = null;

  // Try login stuff if token exists...
  String token = request.getHeader("the-token-key");
  if (token != null && !token.empty()) {
    ...

    // If successful, correctly set principal
    principal = ...;

    // Else login failed, redirect or throw exception??
  }

  return principal;
}

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

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

当我使用Cloudformation建立boto3客户端并调用它时,出现以下错误。该调用无需参数即可工作,因此绝对与参数文件有关。

    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
        )

3 个答案:

答案 0 :(得分:0)

我相信您不可能根据您提供的代码示例获得该答复。

我认为您可能尝试了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。

答案 1 :(得分:0)

这是我能够解决此问题的方法:

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

    ,其中open(parameter_file)为f:    parameters = json.load(f)

    对于参数中的l的

    :    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。

答案 2 :(得分:0)

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

以下内容应该令人满意。

python