Boto3 Cloudformation Ошибка: Ошибка формата шаблона: неподдерживаемая структура - PullRequest
2 голосов
/ 25 марта 2019

Я не могу загрузить параметры в клиент облачной информации python boto3.

Ниже приведен мой файл параметров:

[
  {"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
        )

Когда я устанавливаю клиент boto3 с Cloudformation и вызываю его, я получаю сообщение об ошибке, описанное ниже.Вызов работает без параметров, поэтому это определенно связано с файлом параметров.

    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.

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

Вот как мне удалось решить эту проблему:

  1. Чтобы загрузить файл параметров (который загружается как список словарей), у меня был следующий код:

    с открытым (файл_параметра) как f: параметры = json.load (f)

    для l в параметрах: l ['UsePreviousValue'] = eval ('False')

  2. Чтобы передать шаблон Cloudformation, я использовал следующий код (в основном читая его как строку):

    с open (cloudformation_template) как g: template_body = g.read ()

Наконец, я передал обе переменные в клиент облачной информации:

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

Что меня не устраивало, так это то, что клиент boto3 «Облачная информация» ожидает «списоксловари 'для параметров, но ожидает' строку 'для шаблона облачной информации.

Это очень неприятно, и я пытаюсь найти способ поднять это до AWS.

0 голосов
/ 26 марта 2019

Я полагаю, что невозможно получить этот ответ на основе предоставленного вами образца кода.

Я думаю, что вы, возможно, пытались 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.

Ошибка возникает при передаче файла : // URI или URL-адреса для параметра TemplateBody.

Более того, я считаю, что получить такой ответ просто невозможноесли вы действительно что-то передали в TemplateURL.

См. также:

  • этот связанный ответ, для воспроизведения этого сообщения об ошибке с помощью AWS CLI.
  • API документы где TemplateBody и TemplateURL документированы.
...