Как использовать входное значение в разделе ExpressionAttributeNames задачи «Шаговая функция DynamoDB»? - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь использовать ресурс DynamoDB внутри функции шага, и я не могу использовать значение из ввода шага в пределах ExpressionAttributeValues.

Вот моя запись перед запуском функции шага:

{
  "groupId": "5c9e4c4e-088c-48bb-9e41-8d7b6227f117",
  "invitationStatus": {
    "johndoe@example.com": "unsent"
  }
}

Вот входные данные для шага:

{
  "email": "johndoe@example.com",
  "groupId": "5c9e4c4e-088c-48bb-9e41-8d7b6227f117"
}

Вот мое определение шага:

"Mark Invitation Sent": {
  "Comment": "Marks an invitation as having been sent",
  "Type": "Task",
  "Resource": "arn:aws:states:::dynamodb:updateItem",
  "Parameters": {
    "TableName": "[my-table-name]",
    "Key": {
      "groupId": {
        "S.$": "$.groupId"
      }
    },
    "UpdateExpression": "SET invitationStatus.#email = :sent",
    "ExpressionAttributeNames": {
      "#email": "$.email"
    },
    "ExpressionAttributeValues": {
      ":sent": {
        "S": "sent"
      }
    }
  },
  "End": true
}

А вот запись после выполнения шага:

{
  "groupId": "5c9e4c4e-088c-48bb-9e41-8d7b6227f117",
  "invitationStatus": {
    "$.email": "sent",
    "johndoe@example.com": "unsent"
  }
}

Как видите, он использует буквальное значение "$ .email" вместо фактического значения (johndoe@example.com). Что я делаю не так?

1 Ответ

0 голосов
/ 20 марта 2020

Нашел мой ответ в https://states-language.net/spec.html#parameters:

Когда имя поля заканчивается на «. $» И его значение можно использовать для генерации извлеченного значения, как описано выше в поле «Параметры» поле заменяется другим полем, имя которого является исходным именем за вычетом суффикса «. $», а значение - «Извлеченное значение».

Что в основном означает, что мне нужно изменить "#email" до "#email.$". Внесение этого изменения в определение моего шага решило мою проблему:

"Mark Invitation Sent": {
  "Comment": "Marks an invitation as having been sent",
  "Type": "Task",
  "Resource": "arn:aws:states:::dynamodb:updateItem",
  "Parameters": {
    "TableName": "[my-table-name]",
    "Key": {
      "groupId": {
        "S.$": "$.groupId" //This is where I should have realized I already had an example of something that works
      }
    },
    "UpdateExpression": "SET invitationStatus.#email = :sent",
    "ExpressionAttributeNames": {
      "#email.$": "$.email" //This is the only changed line
    },
    "ExpressionAttributeValues": {
      ":sent": {
        "S": "sent"
      }
    }
  },
  "End": true
}
...