Правильное использование PartiQL и AWS SDK?

#typescript #amazon-web-services #aws-sdk #partiql

Вопрос:

У меня есть следующая лямбда-функция

 const partiQl = "UPDATE '?' SET hits = hits   1 WHERE path = "'?'" RETURNING ALL NEW *"
console.log(partiQl)
console.log(event.path)
console.log(process.env.HITS_TABLE_NAME)

const execStatementCommand = new ExecuteStatementCommand({
  Statement: partiQl,
  Parameters: [
    { "S": process.env.HITS_TABLE_NAME } , 
    { "S": event.path } 
  ]
});
console.log(execStatementCommand)
 

А значения путей-это в основном URL-адреса с косой чертой ‘/’

И я получаю эту ошибку, но не могу понять, почему:

 2021-10-12T02:56:41.021Z    23d1ea78-48d2-4390-b100-2a3479697e4f    ERROR   Statement wasn't well formed, can't be processed: Expected identifier for simple path
 

событие.значение пути для тестового запуска равно /test
и HITS_TABLE передается из вызова CDK.
есть какие-нибудь идеи?

Обновить

Я изменил инструкцию partiqlна это, и ошибка изменилась на имя таблицы, которое не поддерживается.

 const partiQl = `UPDATE "?" SET hits = hits   1 WHERE "path" = "?" RETURNING ALL NEW *`
 

вот новая ошибка:

 ERROR   
Table name should be within the length [3, 255] 
and only contain 'a-z', 'A-Z', '0-9', '-', '_', '.'.
 

Если я включу аргументы непосредственно в строку, похоже, что это решит проблему с разделением:

 const partiQl = `UPDATE "${process.env.HITS_TABLE_NAME}" SET hits = hits   1 `   
  `WHERE "path" = "${event.path}" RETURNING ALL NEW *`
console.log(partiQl)

const execStatementCommand = new ExecuteStatementCommand({
  Statement: partiQl
});
 

Нет хороших примеров для partiqlи AWS SDK v3, есть идеи, почему?

Обновить

using the second method, I get the following error

 User: arn:XXXX is not authorized to perform: dynamodb:PartiQLUpdate on resource: arn:YYYYY
 

even though I have granted read and write permission to the table using this method:

 table.grantReadWriteData(this.handler);
 

I have looked at https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-iam.html

and the list of permission I need the lambda to have are:

 "dynamodb:PartiQLInsert",
"dynamodb:PartiQLUpdate",
"dynamodb:PartiQLDelete",
"dynamodb:PartiQLSelect"
 

do I have to create a custom IAM policy to add these?
Sorry I am very new to AWS in general.

UPDATE

after adding the following policy rule, the following error occurs:

   this.handler.role?.addToPolicy(new iam.PolicyStatement({
    effect: iam.Effect.ALLOW,
    resources: [table.tableArn],
    actions: [
      'dynamodb:PartiQLUpdate', 
      'dynamodb:PartiQLSelect',
      'dynamodb:PartiQLInsert',
      'dynamodb:PartiQLDelete'
    ]
  }));
 

и вот следующая ошибка:

 ERROR   Where clause does not contain a mandatory equality on all key attributes
 

Я предполагаю, что это связано с тем, что вызов обновления не находит никаких строк.