Как передать аргументы в задание Glue в CloudFormation YAML?

Вы можете передать аргументы заданию AWS Glue с помощью параметра --arguments (см. здесь).

CloudFormation документация говорит, что DefaultArguments - это «пары ключ-значение строки UTF-8 к строке UTF-8» и их тип - «объект JSON». Поскольку YAML - это супернабор JSON, я ожидал, что смогу передавать такие аргументы в шаблоне CloudFormation (YAML):

DefaultArguments:
  "--arguments": {"--test_argument": "foo"}

Однако при развертывании CloudFormation возникает эта ошибка:

Ошибка проверки свойства: [значение свойства {/ DefaultArguments / - arguments =} не соответствует типу {String}]

Как правильно указать значения?


person malana    schedule 10.10.2018    source источник


Ответы (2)


Правильный способ передачи нескольких параметров:

DefaultArguments:
  "--argument1": value1
  "--argument2": value2

а затем доступ к ним в задании (например, в Python) следующим образом:

from awsglue.utils import getResolvedOptions
args = getResolvedOptions(sys.argv, ['argument1', 'argument2'])
print args['argument1']
print args['argument2']

Что меня смутило, так это то, что для передачи параметров с помощью AWS CLI вы используете явную --arguments='--argument1="value1"' структуру, но в CloudFormation вы указываете аргументы один за другим.

person malana    schedule 16.10.2018
comment
Мне не хватало --. Впрочем, цитаты не нужны. - person jsallaberry; 11.09.2019

Значение ключа --arguments должно быть строкой, но на самом деле вы даете ему отображение (или, говоря языком JSON, объект), потому что он начинается с {. Вы должны указать значение в кавычках, и, поскольку у вас есть двойные кавычки в значении, лучше всего делать это в одинарных кавычках:

DefaultArguments:
  "--arguments": '{"--test_argument": "foo"}'

(любые существующие одинарные кавычки в значении, которое вам нужно избежать, поставив две одинарные кавычки)

Если ваш JSON более сложен, может быть полезно использовать скаляры свернутого стиля. Внутри них { также не имеет особого значения, и (одиночные) символы новой строки, за которыми следуют пробелы, заменяются одним пробелом. Таким образом, следующие данные загружаются в те же данные, что и решение выше:

DefaultArguments:
  "--arguments": >
    {"--test_argument": 
        "foo"}

Конечно, поскольку YAML (1.2) является надмножеством JSON, glue может легко предположить, что значение уже проанализировано, если оно не является строкой, но это не кажется таким умным и всегда ожидает JSON в строковой форме.

person Anthon    schedule 11.10.2018
comment
Когда я передаю аргументы как '{"--test_argument": "foo"}', CloudFormation передает их Glue как {"--arg1"="arg1", "--arg2"="arg2"}, который затем терпит неудачу, потому что getResolvedOptions Glue использует argparse, который не понимает ввод JSON, и я получаю awsglue.utils.GlueArgumentError: argument --arg1 is required. - person malana; 11.10.2018
comment
Это определенно не определение объекта JSON, которое они ожидают в скаляре, а просто строка (JSON). Вероятно, вам следует просто указать его, как в командной строке. - person Anthon; 11.10.2018
comment
Это то, о чем я думал. Когда я делаю '--arg1="arg1" --arg2="arg2"', Glue не находит arg2. Похоже на ошибку. Я отказался от поддержки AWS. - person malana; 11.10.2018
comment
Может быть, они ожидают, что список JSON в строке является значением для ключа --arguments? Как 2_? - person Anthon; 11.10.2018