如何在CloudFormation YAML中将参数传递给Glue作业?

时间:2018-10-10 23:07:19

标签: yaml amazon-cloudformation aws-glue

您可以通过--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}不匹配

如何正确指定值?

2 个答案:

答案 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。