📲

stepfunctionsのCallAwsServiceでdynamoのgetItemの数値が文字列として扱われてしまう

に公開

stepfunctionsをcdkで書いており、dynamoからNumber型の値を参照したいことがあった。

いちいちlambda書くほどの処理でもないためCallAwsServiceを利用して、
Number型なのでN: 0のように出力して欲しいのだが、N: "0"のように文字列として取得されてしまった。
取得される仕様はAPIとかも同様で仕方がないので、これを数値として出力したい。

けっこうハマってしまって
結果、resultSelectorでstringToJsonを使うことで数値に変換すれば
数値として結果出力できるようになった。

サンプルコード

    const getItem = new tasks.CallAwsService(scope, 'GetItem', {
      service: 'dynamodb',
      action: 'getItem',
      parameters: {
        TableName: dynamoTable.tableName,
        Key: {
          keyId: {
            S: sfn.JsonPath.stringAt(`$.${keyIdPath}`),
          },
        },
      },
      iamResources: [dynamoTable.tableArn],
      inputPath: '$',
      resultPath: '$.GetItem',
      resultSelector: {
        // CallAwsServiceの結果がAttributeValue形式であり文字列で取得されてしまうため数値に変換
        Item: {
          <項目名>: {
            N: sfn.JsonPath.stringToJson(sfn.JsonPath.stringAt('$.Item.<項目名>.N')),
          },
        },
      },
    });

resultSelector利用する時って
いつもどうやるんだっけってなるから
将来の自分のためにもコード残しておく

Discussion