您可以通过--arguments
参数将参数传递给AWS Glue作业(请参阅here)。
CloudFormation documentation表示DefaultArguments是“ UTF-8字符串到–UTF-8字符串键值对”,其类型是“ JSON对象”。由于YAML是JSON的超级集,所以我期望能够在(YAML)CloudFormation模板中传递这样的参数:
DefaultArguments:
"--arguments": {"--test_argument": "foo"}
但是,它会在CloudFormation部署期间引发此错误:
属性验证失败:[属性{/ DefaultArguments /-arguments =}的值与类型{String}不匹配
如何正确指定值?
答案 0 :(得分: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中,您直接指定了不同的参数。
答案 1 :(得分:0)
键--arguments
的值必须是一个字符串,但实际上是给它一个映射(或用JSON说一个对象),因为它以{
开头。您应该对值加引号,并且由于值中有双引号,所以最好使用单引号:
DefaultArguments:
"--arguments": '{"--test_argument": "foo"}'
(值中任何现有的单引号都需要通过放置两个单引号来转义)
如果您的JSON更复杂,那么使用折叠样式标量可能会有所帮助。其中{
也没有特殊含义,并且(单)换行符后跟空格被单个空格代替。因此,以下将加载与上述解决方案相同的数据:
DefaultArguments:
"--arguments": >
{"--test_argument":
"foo"}
当然,在YAML(1.2)是JSON的超集的情况下,glue
可以轻松地假设一个值(如果它不是字符串)已经被解析,但是它似乎并不那么聪明,并且总是期望字符串形式的JSON。