我无法将参数加载到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
)
答案 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传递了任何内容,那么根本无法获得该响应。
另请参阅:
答案 1 :(得分:0)
这是我能够解决此问题的方法:
为了加载参数文件(作为字典列表加载),我有以下代码:
,其中open(parameter_file)为f: parameters = json.load(f)
对于参数中的l的: 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。
答案 2 :(得分:0)
因此,TemplateBody参数需要CloudFormation模板文件的内容/ str,而不仅仅是文件名。
以下内容应该令人满意。
python