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

Posted

技术标签:

【中文标题】如何将参数传递给 CloudFormation YAML 中的 Glue 作业?【英文标题】:How do I pass arguments to a Glue job in CloudFormation YAML? 【发布时间】:2019-03-15 22:32:48 【问题描述】:

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

如何正确指定值?

【问题讨论】:

【参考方案1】:

传递多个参数的正确方式是

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 中,您要一个一个地指定参数。

【讨论】:

我错过了--。不过不需要引号。【参考方案2】:

--arguments 的值需要是一个字符串,但你实际上给它一个映射(或者在 JSON 中是一个对象),因为它以 开头。您应该引用该值,并且由于值中有双引号,因此最好使用单引号:

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

(您需要通过放置两个单引号来转义值中的任何现有单引号)

如果您的 JSON 更复杂,则使用折叠式标量可能会有好处。其中 也没有特殊含义,后跟空格的(单个)换行符被单个空格替换。因此,以下加载到与上述解决方案相同的数据:

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

当然,由于 YAML (1.2) 是 JSON 的超集,glue 可以很容易地假定如果一个值不是字符串,则它已经被解析,但它似乎并不那么聪明并且总是期望 JSON字符串形式。

【讨论】:

当我将参数作为'"--test_argument": "foo"' 传递时,CloudFormation 将它们作为"--arg1"="arg1", "--arg2"="arg2" 传递给Glue,然后由于Glue 的getResolvedOptions 使用不理解JSON 输入的argparse 而失败,我得到了awsglue.utils.GlueArgumentError: argument --arg1 is required. 这绝对不是他们期望在标量中的 JSON 对象定义,而只是一个 (JSON) 字符串。您可能应该像在命令行上一样提供它。 我就是这么想的。当我执行'--arg1="arg1" --arg2="arg2"' 时,Glue 找不到arg2。听起来像一个错误。我已经通过 AWS 支持削减了一张票。 他们是否期望字符串中的 JSON 列表是键 --arguments 的值?喜欢'["--arg1", "arg1", "--arg2", "arg2"]'

以上是关于如何将参数传递给 CloudFormation YAML 中的 Glue 作业?的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个参数传递给 Process?

如何使用 withColumn 将额外的参数传递给 UDF

如何将参数传递给 draw() 方法 - FLTK

如何在 SparkR 中将额外的参数传递给 spark.lapply?

将参数传递给javascript中的函数

如何使 cmake 将 D 参数传递给 ar 以可重现地构建静态库