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 错误:模板格式错误:不支持的结构的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 cloudformation 模板创建 cloudwatch 事件?
boto3 ses InvalidParameterValue 错误由于 unicode 字符