在 AWS Step Functions 中使用动态键生成 JSON 对象

Tof*_*nov 6 amazon-web-services aws-step-functions

背景:我正在尝试向 AWS Step Functions 中的状态机
添加步骤。DynamoDB:GetItemGetItem API 接受以下格式的输入:

{
  "TableName": "MyDynamoDBTable",
  "Key": {
    "Column": {
      "S": "MyEntry"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

其中“Column”是主键名称,“MyEntry”是主键值。问题是我希望能够使用 JSON 路径引用动态指定主键名称和值。

不幸的是,AWS 不允许我传递主键名称(“Column”)的值引用。所以我不能做类似的事情

{
  "TableName": "MyDynamoDBTable",
  "Key.$": {
    "$.ColumnName": {
      "S": "MyEntry"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

问题:

我能想到的唯一解决方法(虽然有点难看)是使用States.StringToJsonStates.Format内部函数的组合首先生成字段输入的字符串化版本Key.$,然后从字符串转换为 JSON。就像是:

{
  "TableName.$": "$.TableName",
  "Key.$": "States.StringToJson(States.Format('\{\"{}\":\{\"S.$\":\"{}\"\}\}', $.PrimaryKeyName, $.PrimaryKeyValue))"
  }
Run Code Online (Sandbox Code Playgroud)

理论上它应该有效,但 AWS Step Functions 似乎对转义双引号不满意?它无法解析上面的定义。

所以我的问题是:
有没有办法让这项工作发挥作用?(通过某种方式转义双引号,或者通过完全不同的方法)

Tof*_*nov 5

经过大量的实验,我终于找到了一种让动态键起作用的方法。我正在使用Pass定义如下的步骤parameters

{
  "Key.$": "States.StringToJson(States.Format('\\{\"{}\":\\{\"S\":\"{}\"\\}\\}', $.HashKeyName, $.HashKeyValue))"
}
Run Code Online (Sandbox Code Playgroud)

显然,秘密在于\\转义时使用 double{}符号。转义毕竟不是问题,尽管AWS 文档"中没有对此进行记录。

此转换的结果如下:

{
  "Key": {
    "MyHashKeyName": {
      "S": "MyHashKeyValue"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)