JavaScript resolver function reference for DynamoDB
The Amazon AppSync DynamoDB function enables you to use GraphQL
GetItem
The GetItem
request lets you tell the Amazon AppSync DynamoDB function to make a GetItem
request to DynamoDB, and enables you to specify:
-
The key of the item in DynamoDB
-
Whether to use a consistent read or not
The GetItem
request has the following structure:
type DynamoDBGetItem = { operation: 'GetItem'; key: { [key: string]: any }; consistentRead?: ConsistentRead; projection?: { expression: string; expressionNames?: { [key: string]: string }; }; };
The fields are defined as follows:
GetItem fields
-
operation
-
The DynamoDB operation to perform. To perform the
GetItem
DynamoDB operation, this must be set toGetItem
. This value is required. -
key
-
The key of the item in DynamoDB. DynamoDB items may have a single hash key, or a hash key and sort key, depending on the table structure. For more information about how to specify a “typed value”, see Type system (request mapping). This value is required.
-
consistentRead
-
Whether or not to perform a strongly consistent read with DynamoDB. This is optional, and defaults to
false
. projection
-
A projection that's used to specify the attributes to return from the DynamoDB operation. For more information about projections, see Projections. This field is optional.
The item returned from DynamoDB is automatically converted into GraphQL and JSON primitive types, and is
available in the context result (context.result
).
For more information about DynamoDB type conversion, see Type system (response mapping).
For more information about JavaScript resolvers, see JavaScript resolvers overview.
Example
The
following
example is a
function request handler for a GraphQL query getThing(foo: String!, bar: String!)
:
export function request(ctx) { const {foo, bar} = ctx.args return { operation : "GetItem", key : util.dynamodb.toMapValues({foo, bar}), consistentRead : true } }
For more information about the DynamoDB GetItem
API, see the DynamoDB API
documentation.
PutItem
The PutItem
request mapping document lets you tell the Amazon AppSync DynamoDB
function to make a
PutItem
request to DynamoDB, and enables you to specify the following:
-
The key of the item in DynamoDB
-
The full contents of the item (composed of
key
andattributeValues
) -
Conditions for the operation to succeed
The PutItem
request has the
following structure:
type DynamoDBPutItemRequest = { operation: 'PutItem'; key: { [key: string]: any }; attributeValues: { [key: string]: any}; condition?: ConditionCheckExpression; customPartitionKey?: string; populateIndexFields?: boolean; _version?: number; };
The fields are defined as follows:
PutItem fields
-
operation
-
The DynamoDB operation to perform. To perform the
PutItem
DynamoDB operation, this must be set toPutItem
. This value is required. -
key
-
The key of the item in DynamoDB. DynamoDB items may have a single hash key, or a hash key and sort key, depending on the table structure. For more information about how to specify a “typed value”, see Type system (request mapping). This value is required.
-
attributeValues
-
The rest of the attributes of the item to be put into DynamoDB. For more information about how to specify a “typed value”, see Type system (request mapping). This field is optional.
-
condition
-
A condition to determine if the request should succeed or not, based on the state of the object already in DynamoDB. If no condition is specified, the
PutItem
request overwrites any existing entry for that item. For more information about conditions, see Condition expressions. This value is optional. -
_version
-
A numeric value that represents the latest known version of an item. This value is optional. This field is used for Conflict Detection and is only supported on versioned data sources.
customPartitionKey
-
When enabled, this string value modifies the format of the
ds_sk
andds_pk
records used by the delta sync table when versioning has been enabled (for more information, see Conflict detection and sync in the Amazon AppSync Developer Guide). When enabled, the processing of thepopulateIndexFields
entry is also enabled. This field is optional. populateIndexFields
-
A boolean value that, when enabled along with the
customPartitionKey
, creates new entries for each record in the delta sync table, specifically in thegsi_ds_pk
andgsi_ds_sk
columns. For more information, see Conflict detection and sync in the Amazon AppSync Developer Guide. This field is optional.The item written to DynamoDB is automatically converted to GraphQL and JSON primitive types and is available in the context result (
context.result
).
The item written to DynamoDB is automatically converted into GraphQL and JSON primitive types and is
available in the context result (context.result
).
For more information about DynamoDB type conversion, see Type system (response mapping).
For more information about JavaScript resolvers, see JavaScript resolvers overview.
Example 1
The
following
example is a
function request handler for a GraphQL mutation updateThing(foo: String!, bar:
String!, name: String!, version: Int!)
.
If no item with the specified key exists, it’s created. If an item already exists with the specified key, it’s overwritten.
import { util } from '@aws-appsync/utils'; export function request(ctx) { const { foo, bar, ...values} = ctx.args return { operation: 'PutItem', key: util.dynamodb.toMapValues({foo, bar}), attributeValues: util.dynamodb.toMapValues(values), }; }
Example 2
The
following
example is a
function request
handler for a GraphQL mutation updateThing(foo: String!, bar: String!, name:
String!, expectedVersion: Int!)
.
This example verifies
that the item currently in DynamoDB has the version
field set to
expectedVersion
.
import { util } from '@aws-appsync/utils'; export function request(ctx) { const { foo, bar, name, expectedVersion } = ctx.args; const values = { name, version: expectedVersion + 1 }; let condition = util.transform.toDynamoDBConditionExpression({ version: { eq: expectedVersion }, }); return { operation: 'PutItem', key: util.dynamodb.toMapValues({ foo, bar }), attributeValues: util.dynamodb.toMapValues(values), condition, }; }
For more information about the DynamoDB PutItem
API, see the DynamoDB API
documentation.
UpdateItem
The UpdateItem
request enables you to tell the Amazon AppSync DynamoDB
function to make a
UpdateItem
request to DynamoDB and allows you to specify the following:
-
The key of the item in DynamoDB
-
An update expression describing how to update the item in DynamoDB
-
Conditions for the operation to succeed
The UpdateItem
request has the
following structure:
type DynamoDBUpdateItemRequest = { operation: 'UpdateItem'; key: { [key: string]: any }; update: { expression: string; expressionNames?: { [key: string]: string }; expressionValues?: { [key: string]: any }; }; condition?: ConditionCheckExpression; customPartitionKey?: string; populateIndexFields?: boolean; _version?: number; };
The fields are defined as follows:
UpdateItem fields
-
operation
-
The DynamoDB operation to perform. To perform the
UpdateItem
DynamoDB operation, this must be set toUpdateItem
. This value is required. -
key
-
The key of the item in DynamoDB. DynamoDB items may have a single hash key, or a hash key and sort key, depending on the table structure. For more information about specifying a “typed value”, see Type system (request mapping). This value is required.
-
update
-
The
update
section lets you specify an update expression that describes how to update the item in DynamoDB. For more information about how to write update expressions, see the DynamoDB UpdateExpressions documentation. This section is required.The
update
section has three components:-
expression
-
The update expression. This value is required.
-
expressionNames
-
The substitutions for expression attribute name placeholders, in the form of key-value pairs. The key corresponds to a name placeholder used in the
expression
, and the value must be a string corresponding to the attribute name of the item in DynamoDB. This field is optional, and should only be populated with substitutions for expression attribute name placeholders used in theexpression
. -
expressionValues
-
The substitutions for expression attribute value placeholders, in the form of key-value pairs. The key corresponds to a value placeholder used in the
expression
, and the value must be a typed value. For more information about how to specify a “typed value”, see Type system (request mapping). This must be specified. This field is optional, and should only be populated with substitutions for expression attribute value placeholders used in theexpression
.
-
-
condition
-
A condition to determine if the request should succeed or not, based on the state of the object already in DynamoDB. If no condition is specified, the
UpdateItem
request updates the existing entry regardless of its current state. For more information about conditions, see Condition expressions. This value is optional. -
_version
-
A numeric value that represents the latest known version of an item. This value is optional. This field is used for Conflict Detection and is only supported on versioned data sources.
customPartitionKey
-
When enabled, this string value modifies the format of the
ds_sk
andds_pk
records used by the delta sync table when versioning has been enabled (for more information, see Conflict detection and sync in the Amazon AppSync Developer Guide). When enabled, the processing of thepopulateIndexFields
entry is also enabled. This field is optional. populateIndexFields
-
A boolean value that, when enabled along with the
customPartitionKey
, creates new entries for each record in the delta sync table, specifically in thegsi_ds_pk
andgsi_ds_sk
columns. For more information, see Conflict detection and sync in the Amazon AppSync Developer Guide. This field is optional.
The item updated in DynamoDB is automatically converted into GraphQL and JSON primitive types and is available
in the context result
(context.result
).
For more information about DynamoDB type conversion, see Type system (response mapping).
For more information about JavaScript resolvers, see JavaScript resolvers overview.
Example 1
The following
example is a
function request
handler for the GraphQL mutation upvote(id: ID!)
.
In this example, an item in DynamoDB has its upvotes
and version
fields
incremented by 1.
import { util } from '@aws-appsync/utils'; export function request(ctx) { const { id } = ctx.args; return { operation: 'UpdateItem', key: util.dynamodb.toMapValues({ id }), update: { expression: 'ADD #votefield :plusOne, version :plusOne', expressionNames: { '#votefield': 'upvotes' }, expressionValues: { ':plusOne': { N: 1 } }, }, }; }
Example 2
The following
example is a
function request
handler for a GraphQL mutation updateItem(id: ID!, title: String, author: String,
expectedVersion: Int!)
.
This is a complex example that inspects the arguments and dynamically generates the update expression
that only includes the arguments that have been provided by the client. For example, if title
and author
are omitted, they are not updated. If an argument is specified but its value is
null
, then that field is deleted from the object in DynamoDB. Finally, the operation has a
condition, which verifies whether the item currently in DynamoDB has the version
field set to
expectedVersion
:
import { util } from '@aws-appsync/utils'; export function request(ctx) { const { args: { input: { id, ...values } } } = ctx; const condition = { id: { attributeExists: true }, version: { eq: values.expectedVersion }, }; values.expectedVersion += 1; return dynamodbUpdateRequest({ keys: { id }, values, condition }); } /** * Helper function to update an item * @returns an UpdateItem request */ function dynamodbUpdateRequest(params) { const { keys, values, condition: inCondObj } = params; const sets = []; const removes = []; const expressionNames = {}; const expValues = {}; // Iterate through the keys of the values for (const [key, value] of Object.entries(values)) { expressionNames[`#${key}`] = key; if (value) { sets.push(`#${key} = :${key}`); expValues[`:${key}`] = value; } else { removes.push(`#${key}`); } } let expression = sets.length ? `SET ${sets.join(', ')}` : ''; expression += removes.length ? ` REMOVE ${removes.join(', ')}` : ''; const condition = JSON.parse( util.transform.toDynamoDBConditionExpression(inCondObj) ); return { operation: 'UpdateItem', key: util.dynamodb.toMapValues(keys), condition, update: { expression, expressionNames, expressionValues: util.dynamodb.toMapValues(expValues), }, }; }
For more information about the DynamoDB UpdateItem
API, see the DynamoDB API
documentation.
DeleteItem
The DeleteItem
request lets you tell the Amazon AppSync DynamoDB function to make a
DeleteItem
request to DynamoDB, and enables you to specify the following:
-
The key of the item in DynamoDB
-
Conditions for the operation to succeed
The DeleteItem
request has the following structure:
type DynamoDBDeleteItemRequest = { operation: 'DeleteItem'; key: { [key: string]: any }; condition?: ConditionCheckExpression; customPartitionKey?: string; populateIndexFields?: boolean; _version?: number; };
The fields are defined as follows:
DeleteItem fields
-
operation
-
The DynamoDB operation to perform. To perform the
DeleteItem
DynamoDB operation, this must be set toDeleteItem
. This value is required. -
key
-
The key of the item in DynamoDB. DynamoDB items may have a single hash key, or a hash key and sort key, depending on the table structure. For more information about specifying a “typed value”, see Type system (request mapping). This value is required.
-
condition
-
A condition to determine if the request should succeed or not, based on the state of the object already in DynamoDB. If no condition is specified, the
DeleteItem
request deletes an item regardless of its current state. For more information about conditions, see Condition expressions. This value is optional. -
_version
-
A numeric value that represents the latest known version of an item. This value is optional. This field is used for Conflict Detection and is only supported on versioned data sources.
customPartitionKey
-
When enabled, this string value modifies the format of the
ds_sk
andds_pk
records used by the delta sync table when versioning has been enabled (for more information, see Conflict detection and sync in the Amazon AppSync Developer Guide). When enabled, the processing of thepopulateIndexFields
entry is also enabled. This field is optional. populateIndexFields
-
A boolean value that, when enabled along with the
customPartitionKey
, creates new entries for each record in the delta sync table, specifically in thegsi_ds_pk
andgsi_ds_sk
columns. For more information, see Conflict detection and sync in the Amazon AppSync Developer Guide. This field is optional.
The item deleted from DynamoDB is automatically converted into GraphQL and JSON primitive types and is
available in the context result (context.result
).
For more information about DynamoDB type conversion, see Type system (response mapping).
For more information about JavaScript resolvers, see JavaScript resolvers overview.
Example 1
The following
example is a
function request handler for a GraphQL mutation deleteItem(id: ID!)
. If an item exists with
this ID, it’s deleted.
import { util } from '@aws-appsync/utils'; export function request(ctx) { return { operation: 'DeleteItem', key: util.dynamodb.toMapValues({ id: ctx.args.id }), }; }
Example 2
The following
example is a
function request handler for a GraphQL mutation deleteItem(id: ID!, expectedVersion: Int!)
. If
an item exists with this ID, it’s deleted, but only if its version
field set to
expectedVersion
:
import { util } from '@aws-appsync/utils'; export function request(ctx) { const { id, expectedVersion } = ctx.args; const condition = { id: { attributeExists: true }, version: { eq: expectedVersion }, }; return { operation: 'DeleteItem', key: util.dynamodb.toMapValues({ id }), condition: util.transform.toDynamoDBConditionExpression(condition), }; }
For more information about the DynamoDB DeleteItem
API, see the DynamoDB API
documentation.
Query
The Query
request object lets you tell the Amazon AppSync DynamoDB resolver to make a Query
request to DynamoDB, and enables you to specify the following:
-
Key expression
-
Which index to use
-
Any additional filter
-
How many items to return
-
Whether to use consistent reads
-
query direction (forward or backward)
-
Pagination token
The Query
request object has the
following structure:
type DynamoDBQueryRequest = { operation: 'Query'; query: { expression: string; expressionNames?: { [key: string]: string }; expressionValues?: { [key: string]: any }; }; index?: string; nextToken?: string; limit?: number; scanIndexForward?: boolean; consistentRead?: boolean; select?: 'ALL_ATTRIBUTES' | 'ALL_PROJECTED_ATTRIBUTES' | 'SPECIFIC_ATTRIBUTES'; filter?: { expression: string; expressionNames?: { [key: string]: string }; expressionValues?: { [key: string]: any }; }; projection?: { expression: string; expressionNames?: { [key: string]: string }; }; };
The fields are defined as follows:
Query fields
-
operation
-
The DynamoDB operation to perform. To perform the
Query
DynamoDB operation, this must be set toQuery
. This value is required. -
query
-
The
query
section lets you specify a key condition expression that describes which items to retrieve from DynamoDB. For more information about how to write key condition expressions, see the DynamoDB KeyConditions documentation . This section must be specified.-
expression
-
The query expression. This field must be specified.
-
expressionNames
-
The substitutions for expression attribute name placeholders, in the form of key-value pairs. The key corresponds to a name placeholder used in the
expression
, and the value must be a string corresponding to the attribute name of the item in DynamoDB. This field is optional, and should only be populated with substitutions for expression attribute name placeholders used in theexpression
. -
expressionValues
-
The substitutions for expression attribute value placeholders, in the form of key-value pairs. The key corresponds to a value placeholder used in the
expression
, and the value must be a typed value. For more information about how to specify a “typed value”, see Type system (request mapping). This value is required. This field is optional, and should only be populated with substitutions for expression attribute value placeholders used in theexpression
.
-
-
filter
-
An additional filter that can be used to filter the results from DynamoDB before they are returned. For more information about filters, see Filters. This field is optional.
-
index
-
The name of the index to query. The DynamoDB query operation allows you to scan on Local Secondary Indexes and Global Secondary Indexes in addition to the primary key index for a hash key. If specified, this tells DynamoDB to query the specified index. If omitted, the primary key index is queried.
-
nextToken
-
The pagination token to continue a previous query. This would have been obtained from a previous query. This field is optional.
-
limit
-
The maximum number of items to evaluate (not necessarily the number of matching items). This field is optional.
-
scanIndexForward
-
A boolean indicating whether to query forwards or backwards. This field is optional, and defaults to
true
. -
consistentRead
-
A boolean indicating whether to use consistent reads when querying DynamoDB. This field is optional, and defaults to
false
. -
select
-
By default, the Amazon AppSync DynamoDB resolver only returns attributes that are projected into the index. If more attributes are required, you can set this field. This field is optional. The supported values are:
-
ALL_ATTRIBUTES
-
Returns all of the item attributes from the specified table or index. If you query a local secondary index, DynamoDB fetches the entire item from the parent table for each matching item in the index. If the index is configured to project all item attributes, all of the data can be obtained from the local secondary index and no fetching is required.
-
ALL_PROJECTED_ATTRIBUTES
-
Allowed only when querying an index. Retrieves all attributes that have been projected into the index. If the index is configured to project all attributes, this return value is equivalent to specifying
ALL_ATTRIBUTES
. SPECIFIC_ATTRIBUTES
-
Returns only the attributes listed in the
projection
'sexpression
. This return value is equivalent to specifying theprojection
'sexpression
without specifying any value forSelect
.
-
projection
-
A projection that's used to specify the attributes to return from the DynamoDB operation. For more information about projections, see Projections. This field is optional.
The results from DynamoDB are automatically converted into GraphQL and JSON primitive types and are available
in the context result (context.result
).
For more information about DynamoDB type conversion, see Type system (response mapping).
For more information about JavaScript resolvers, see JavaScript resolvers overview.
The results have the following structure:
{ items = [ ... ], nextToken = "a pagination token", scannedCount = 10 }
The fields are defined as follows:
-
items
-
A list containing the items returned by the DynamoDB query.
-
nextToken
-
If there might be more results,
nextToken
contains a pagination token that you can use in another request. Note that Amazon AppSync encrypts and obfuscates the pagination token returned from DynamoDB. This prevents your table data from being inadvertently leaked to the caller. Also note that these pagination tokens cannot be used across different functions or resolvers. -
scannedCount
-
The number of items that matched the query condition expression, before a filter expression (if present) was applied.
Example
The following
example is a
function request handler for a GraphQL query getPosts(owner: ID!)
.
In this example, a global secondary index on a table is queried to return all posts owned by the specified ID.
import { util } from '@aws-appsync/utils'; export function request(ctx) { const { owner } = ctx.args; return { operation: 'Query', query: { expression: 'ownerId = :ownerId', expressionValues: util.dynamodb.toMapValues({ ':ownerId': owner }), }, index: 'owner-index', }; }
For more information about the DynamoDB Query
API, see the DynamoDB API
documentation.
Scan
The Scan
request lets you tell the Amazon AppSync DynamoDB function to make a Scan
request to
DynamoDB, and enables you to specify the following:
-
A filter to exclude results
-
Which index to use
-
How many items to return
-
Whether to use consistent reads
-
Pagination token
-
Parallel scans
The Scan
request object has the following structure:
type DynamoDBScanRequest = { operation: 'Scan'; index?: string; limit?: number; consistentRead?: boolean; nextToken?: string; totalSegments?: number; segment?: number; filter?: { expression: string; expressionNames?: { [key: string]: string }; expressionValues?: { [key: string]: any }; }; projection?: { expression: string; expressionNames?: { [key: string]: string }; }; };
The fields are defined as follows:
Scan fields
-
operation
-
The DynamoDB operation to perform. To perform the
Scan
DynamoDB operation, this must be set toScan
. This value is required. -
filter
-
A filter that can be used to filter the results from DynamoDB before they are returned. For more information about filters, see Filters. This field is optional.
-
index
-
The name of the index to query. The DynamoDB query operation allows you to scan on Local Secondary Indexes and Global Secondary Indexes in addition to the primary key index for a hash key. If specified, this tells DynamoDB to query the specified index. If omitted, the primary key index is queried.
-
limit
-
The maximum number of items to evaluate at a single time. This field is optional.
-
consistentRead
-
A Boolean that indicates whether to use consistent reads when querying DynamoDB. This field is optional, and defaults to
false
. -
nextToken
-
The pagination token to continue a previous query. This would have been obtained from a previous query. This field is optional.
-
select
-
By default, the Amazon AppSync DynamoDB function only returns whatever attributes are projected into the index. If more attributes are required, then this field can be set. This field is optional. The supported values are:
-
ALL_ATTRIBUTES
-
Returns all of the item attributes from the specified table or index. If you query a local secondary index, DynamoDB fetches the entire item from the parent table for each matching item in the index. If the index is configured to project all item attributes, all of the data can be obtained from the local secondary index and no fetching is required.
-
ALL_PROJECTED_ATTRIBUTES
-
Allowed only when querying an index. Retrieves all attributes that have been projected into the index. If the index is configured to project all attributes, this return value is equivalent to specifying
ALL_ATTRIBUTES
. SPECIFIC_ATTRIBUTES
-
Returns only the attributes listed in the
projection
'sexpression
. This return value is equivalent to specifying theprojection
'sexpression
without specifying any value forSelect
.
-
-
totalSegments
-
The number of segments to partition the table by when performing a parallel scan. This field is optional, but must be specified if
segment
is specified. -
segment
-
The table segment in this operation when performing a parallel scan. This field is optional, but must be specified if
totalSegments
is specified. projection
-
A projection that's used to specify the attributes to return from the DynamoDB operation. For more information about projections, see Projections. This field is optional.
The results returned by the DynamoDB scan are automatically converted into GraphQL and JSON primitive types and
is available in the context result (context.result
).
For more information about DynamoDB type conversion, see Type system (response mapping).
For more information about JavaScript resolvers, see JavaScript resolvers overview.
The results have the following structure:
{ items = [ ... ], nextToken = "a pagination token", scannedCount = 10 }
The fields are defined as follows:
-
items
-
A list containing the items returned by the DynamoDB scan.
-
nextToken
-
If there might be more results,
nextToken
contains a pagination token that you can use in another request. Amazon AppSync encrypts and obfuscates the pagination token returned from DynamoDB. This prevents your table data from being inadvertently leaked to the caller. Also, these pagination tokens can’t be used across different functions or resolvers. -
scannedCount
-
The number of items that were retrieved by DynamoDB before a filter expression (if present) was applied.
Example 1
The following
example is a
function request handler for the GraphQL query: allPosts
.
In this example, all entries in the table are returned.
export function request(ctx) { return { operation: 'Scan' }; }
Example 2
The following
example is a
function request handler for the GraphQL query: postsMatching(title: String!)
.
In this example, all entries in the table are returned where the title starts with the title
argument.
export function request(ctx) { const { title } = ctx.args; const filter = { filter: { beginsWith: title } }; return { operation: 'Scan', filter: JSON.parse(util.transform.toDynamoDBFilterExpression(filter)), }; }
For more information about the DynamoDB Scan
API, see the DynamoDB API
documentation.
Sync
The Sync
request object lets you retrieve all the results from a DynamoDB table and then receive
only the data altered since your last query (the delta updates). Sync
requests can only be made to
versioned DynamoDB data sources. You can specify the following:
-
A filter to exclude results
-
How many items to return
-
Pagination Token
-
When your last
Sync
operation was started
The Sync
request object has the following structure:
type DynamoDBSyncRequest = { operation: 'Sync'; basePartitionKey?: string; deltaIndexName?: string; limit?: number; nextToken?: string; lastSync?: number; filter?: { expression: string; expressionNames?: { [key: string]: string }; expressionValues?: { [key: string]: any }; }; };
The fields are defined as follows:
Sync fields
-
operation
-
The DynamoDB operation to perform. To perform the
Sync
operation, this must be set toSync
. This value is required. -
filter
-
A filter that can be used to filter the results from DynamoDB before they are returned. For more information about filters, see Filters. This field is optional.
-
limit
-
The maximum number of items to evaluate at a single time. This field is optional. If omitted, the default limit will be set to
100
items. The maximum value for this field is1000
items. -
nextToken
-
The pagination token to continue a previous query. This would have been obtained from a previous query. This field is optional.
-
lastSync
-
The moment, in epoch milliseconds, when the last successful
Sync
operation started. If specified, only items that have changed afterlastSync
are returned. This field is optional, and should only be populated after retrieving all pages from an initialSync
operation. If omitted, results from the Base table will be returned, otherwise, results from the Delta table will be returned. basePartitionKey
-
The partition key of the Base table used when performing a
Sync
operation. This field allows aSync
operation to be performed when the table utilizes a custom partition key. This is an optional field. deltaIndexName
-
The index used for the
Sync
operation. This index is required to enable aSync
operation on the whole delta store table when the table uses a custom partition key. TheSync
operation will be performed on the GSI (created ongsi_ds_pk
andgsi_ds_sk
). This field is optional.
The results returned by the DynamoDB sync are automatically converted into GraphQL and JSON primitive types and
are available in the context result (context.result
).
For more information about DynamoDB type conversion, see Type system (response mapping).
For more information about JavaScript resolvers, see JavaScript resolvers overview.
The results have the following structure:
{ items = [ ... ], nextToken = "a pagination token", scannedCount = 10, startedAt = 1550000000000 }
The fields are defined as follows:
-
items
-
A list containing the items returned by the sync.
-
nextToken
-
If there might be more results,
nextToken
contains a pagination token that you can use in another request. Amazon AppSync encrypts and obfuscates the pagination token returned from DynamoDB. This prevents your table data from being inadvertently leaked to the caller. Also, these pagination tokens can’t be used across different functions or resolvers. -
scannedCount
-
The number of items that were retrieved by DynamoDB before a filter expression (if present) was applied.
-
startedAt
-
The moment, in epoch milliseconds, when the sync operation started that you can store locally and use in another request as your
lastSync
argument. If a pagination token was included in the request, this value will be the same as the one returned by the request for the first page of results.
Example 1
The following
example is a
function request handler for the GraphQL query: syncPosts(nextToken: String, lastSync:
AWSTimestamp)
.
In this example, if lastSync
is omitted, all entries in the base table are returned. If
lastSync
is supplied, only the entries in the delta sync table that have changed since
lastSync
are returned.
export function request(ctx) { const { nextToken, lastSync } = ctx.args; return { operation: 'Sync', limit: 100, nextToken, lastSync }; }
BatchGetItem
The BatchGetItem
request object lets you tell the Amazon AppSync DynamoDB function to make a
BatchGetItem
request to DynamoDB to retrieve multiple items, potentially across multiple tables.
For this request object, you must specify the following:
-
The table names where to retrieve the items from
-
The keys of the items to retrieve from each table
The DynamoDB BatchGetItem
limits apply and no condition
expression can be provided.
The BatchGetItem
request object has the following structure:
type DynamoDBBatchGetItemRequest = { operation: 'BatchGetItem'; tables: { [tableName: string]: { keys: { [key: string]: any }[]; consistentRead?: boolean; projection?: { expression: string; expressionNames?: { [key: string]: string }; }; }; }; };
The fields are defined as follows:
BatchGetItem fields
-
operation
-
The DynamoDB operation to perform. To perform the
BatchGetItem
DynamoDB operation, this must be set toBatchGetItem
. This value is required. -
tables
-
The DynamoDB tables to retrieve the items from. The value is a map where table names are specified as the keys of the map. At least one table must be provided. This
tables
value is required.-
keys
-
List of DynamoDB keys representing the primary key of the items to retrieve. DynamoDB items may have a single hash key, or a hash key and sort key, depending on the table structure. For more information about how to specify a “typed value”, see Type system (request mapping).
-
consistentRead
-
Whether to use a consistent read when executing a GetItem operation. This value is optional and defaults to false.
projection
-
A projection that's used to specify the attributes to return from the DynamoDB operation. For more information about projections, see Projections. This field is optional.
-
Things to remember:
-
If an item has not been retrieved from the table, a null element appears in the data block for that table.
-
Invocation results are sorted per table, based on the order in which they were provided inside the request object.
-
Each
Get
command inside aBatchGetItem
is atomic, however, a batch can be partially processed. If a batch is partially processed due to an error, the unprocessed keys are returned as part of the invocation result inside the unprocessedKeys block. -
BatchGetItem
is limited to 100 keys.
For the following example function request handler:
import { util } from '@aws-appsync/utils'; export function request(ctx) { const { authorId, postId } = ctx.args; return { operation: 'BatchGetItem', tables: { authors: [util.dynamodb.toMapValues({ authorId })], posts: [util.dynamodb.toMapValues({ authorId, postId })], }, }; }
The invocation result available in ctx.result
is as follows:
{ "data": { "authors": [null], "posts": [ // Was retrieved { "authorId": "a1", "postId": "p2", "postTitle": "title", "postDescription": "description", } ] }, "unprocessedKeys": { "authors": [ // This item was not processed due to an error { "authorId": "a1" } ], "posts": [] } }
The ctx.error
contains details about the error. The keys data,
unprocessedKeys, and each table key that was provided in the result in the
function request object are guaranteed to be present in the invocation result. Items that have been deleted
appear in the data block. Items that haven’t been processed are marked as
null inside the data block and are placed inside the unprocessedKeys block.
BatchDeleteItem
The BatchDeleteItem
request object lets you tell the Amazon AppSync DynamoDB function to make a
BatchWriteItem
request to DynamoDB to delete multiple items, potentially across multiple tables.
For this request object, you must specify the following:
-
The table names where to delete the items from
-
The keys of the items to delete from each table
The DynamoDB BatchWriteItem
limits apply and no condition
expression can be provided.
The BatchDeleteItem
request object has the following structure:
type DynamoDBBatchDeleteItemRequest = { operation: 'BatchDeleteItem'; tables: { [tableName: string]: { [key: string]: any }[]; }; };
The fields are defined as follows:
BatchDeleteItem fields
-
operation
-
The DynamoDB operation to perform. To perform the
BatchDeleteItem
DynamoDB operation, this must be set toBatchDeleteItem
. This value is required. -
tables
-
The DynamoDB tables to delete the items from. Each table is a list of DynamoDB keys representing the primary key of the items to delete. DynamoDB items may have a single hash key, or a hash key and sort key, depending on the table structure. For more information about how to specify a “typed value”, see Type system (request mapping). At least one table must be provided. The
tables
value is required.
Things to remember:
-
Contrary to the
DeleteItem
operation, the fully deleted item isn’t returned in the response. Only the passed key is returned. -
If an item has not been deleted from the table, a null element appears in the data block for that table.
-
Invocation results are sorted per table, based on the order in which they were provided inside the request object.
-
Each
Delete
command inside aBatchDeleteItem
is atomic. However a batch can be partially processed. If a batch is partially processed due to an error, the unprocessed keys are returned as part of the invocation result inside the unprocessedKeys block. -
BatchDeleteItem
is limited to 25 keys.
For the following example function request handler:
import { util } from '@aws-appsync/utils'; export function request(ctx) { const { authorId, postId } = ctx.args; return { operation: 'BatchDeleteItem', tables: { authors: [util.dynamodb.toMapValues({ authorId })], posts: [util.dynamodb.toMapValues({ authorId, postId })], }, }; }
The invocation result available in ctx.result
is as follows:
{ "data": { "authors": [null], "posts": [ // Was deleted { "authorId": "a1", "postId": "p2" } ] }, "unprocessedKeys": { "authors": [ // This key was not processed due to an error { "authorId": "a1" } ], "posts": [] } }
The ctx.error
contains details about the error. The keys data,
unprocessedKeys, and each table key that was provided in the function
request object are guaranteed to be present in the invocation result. Items that have been deleted are present
in the data block. Items that haven’t been processed are marked as null inside the data block and are placed inside the unprocessedKeys block.
BatchPutItem
The BatchPutItem
request object lets you tell the Amazon AppSync DynamoDB function to make a
BatchWriteItem
request to DynamoDB to put multiple items, potentially across multiple tables. For
this request object, you must specify the following:
-
The table names where to put the items in
-
The full items to put in each table
The DynamoDB BatchWriteItem
limits apply and no condition
expression can be provided.
The BatchPutItem
request object has the following structure:
type DynamoDBBatchPutItemRequest = { operation: 'BatchPutItem'; tables: { [tableName: string]: { [key: string]: any}[]; }; };
The fields are defined as follows:
BatchPutItem fields
-
operation
-
The DynamoDB operation to perform. To perform the
BatchPutItem
DynamoDB operation, this must be set toBatchPutItem
. This value is required. -
tables
-
The DynamoDB tables to put the items in. Each table entry represents a list of DynamoDB items to insert for this specific table. At least one table must be provided. This value is required.
Things to remember:
-
The fully inserted items are returned in the response, if successful.
-
If an item hasn’t been inserted in the table, a null element is displayed in the data block for that table.
-
The inserted items are sorted per table, based on the order in which they were provided inside the request object.
-
Each
Put
command inside aBatchPutItem
is atomic, however, a batch can be partially processed. If a batch is partially processed due to an error, the unprocessed keys are returned as part of the invocation result inside the unprocessedKeys block. -
BatchPutItem
is limited to 25 items.
For the following example function request handler:
import { util } from '@aws-appsync/utils'; export function request(ctx) { const { authorId, postId, name, title } = ctx.args; return { operation: 'BatchPutItem', tables: { authors: [util.dynamodb.toMapValues({ authorId, name })], posts: [util.dynamodb.toMapValues({ authorId, postId, title })], }, }; }
The invocation result available in ctx.result
is as follows:
{ "data": { "authors": [ null ], "posts": [ // Was inserted { "authorId": "a1", "postId": "p2", "title": "title" } ] }, "unprocessedItems": { "authors": [ // This item was not processed due to an error { "authorId": "a1", "name": "a1_name" } ], "posts": [] } }
The ctx.error
contains details about the error. The keys data,
unprocessedItems, and each table key that was provided in the request
object are guaranteed to be present in the invocation result. Items that have been inserted are in the
data block. Items that haven’t been processed are marked as null inside the data block and are placed inside the unprocessedItems block.
TransactGetItems
The TransactGetItems
request object lets you to tell the Amazon AppSync DynamoDB function to make a
TransactGetItems
request to DynamoDB to retrieve multiple items, potentially across multiple
tables. For this request object, you must specify the following:
-
The table name of each request item where to retrieve the item from
-
The key of each request item to retrieve from each table
The DynamoDB TransactGetItems
limits apply and no condition
expression can be provided.
The TransactGetItems
request object has the following structure:
type DynamoDBTransactGetItemsRequest = { operation: 'TransactGetItems'; transactItems: { table: string; key: { [key: string]: any }; projection?: { expression: string; expressionNames?: { [key: string]: string }; }[]; }; };
The fields are defined as follows:
TransactGetItems fields
-
operation
-
The DynamoDB operation to perform. To perform the
TransactGetItems
DynamoDB operation, this must be set toTransactGetItems
. This value is required. -
transactItems
-
The request items to include. The value is an array of request items. At least one request item must be provided. This
transactItems
value is required.-
table
-
The DynamoDB table to retrieve the item from. The value is a string of the table name. This
table
value is required. -
key
-
The DynamoDB key representing the primary key of the item to retrieve. DynamoDB items may have a single hash key, or a hash key and sort key, depending on the table structure. For more information about how to specify a “typed value”, see Type system (request mapping).
projection
-
A projection that's used to specify the attributes to return from the DynamoDB operation. For more information about projections, see Projections. This field is optional.
-
Things to remember:
-
If a transaction succeeds, the order of retrieved items in the
items
block will be the same as the order of request items. -
Transactions are performed in an all-or-nothing way. If any request item causes an error, the whole transaction will not be performed and error details will be returned.
-
A request item being unable to be retrieved is not an error. Instead, a null element appears in the items block in the corresponding position.
-
If the error of a transaction is TransactionCanceledException, the
cancellationReasons
block will be populated. The order of cancellation reasons incancellationReasons
block will be the same as the order of request items. -
TransactGetItems
is limited to 25 request items.
For the following example function request handler:
import { util } from '@aws-appsync/utils'; export function request(ctx) { const { authorId, postId } = ctx.args; return { operation: 'TransactGetItems', transactItems: [ { table: 'posts', key: util.dynamodb.toMapValues({ postId }), }, { table: 'authors', key: util.dynamodb.toMapValues({ authorId }), }, ], }; }
If the transaction succeeds and only the first requested item is retrieved, the invocation result available
in ctx.result
is as follows:
{ "items": [ { // Attributes of the first requested item "post_id": "p1", "post_title": "title", "post_description": "description" }, // Could not retrieve the second requested item null, ], "cancellationReasons": null }
If the transaction fails due to TransactionCanceledException
caused by the first request item, the invocation result available in ctx.result
is as
follows:
{ "items": null, "cancellationReasons": [ { "type":"Sample error type", "message":"Sample error message" }, { "type":"None", "message":"None" } ] }
The ctx.error
contains details about the error. The keys items
and cancellationReasons are guaranteed to be present in
ctx.result
.
TransactWriteItems
The TransactWriteItems
request object lets you tell the Amazon AppSync DynamoDB function to make a
TransactWriteItems
request to DynamoDB to write multiple items, potentially to multiple tables.
For this request object, you must specify the following:
-
The destination table name of each request item
-
The operation of each request item to perform. There are four types of operations that are supported: PutItem, UpdateItem, DeleteItem, and ConditionCheck
-
The key of each request item to write
The DynamoDB TransactWriteItems
limits apply.
The TransactWriteItems
request object has the following structure:
type DynamoDBTransactWriteItemsRequest = { operation: 'TransactWriteItems'; transactItems: TransactItem[]; }; type TransactItem = | TransactWritePutItem | TransactWriteUpdateItem | TransactWriteDeleteItem | TransactWriteConditionCheckItem; type TransactWritePutItem = { table: string; operation: 'PutItem'; key: { [key: string]: any }; attributeValues: { [key: string]: string}; condition?: TransactConditionCheckExpression; }; type TransactWriteUpdateItem = { table: string; operation: 'UpdateItem'; key: { [key: string]: any }; update: DynamoDBExpression; condition?: TransactConditionCheckExpression; }; type TransactWriteDeleteItem = { table: string; operation: 'DeleteItem'; key: { [key: string]: any }; condition?: TransactConditionCheckExpression; }; type TransactWriteConditionCheckItem = { table: string; operation: 'ConditionCheck'; key: { [key: string]: any }; condition?: TransactConditionCheckExpression; }; type TransactConditionCheckExpression = { expression: string; expressionNames?: { [key: string]: string}; expressionValues?: { [key: string]: any}; returnValuesOnConditionCheckFailure: boolean; };
TransactWriteItems fields
- The fields are defined as follows:
-
-
operation
-
The DynamoDB operation to perform. To perform the
TransactWriteItems
DynamoDB operation, this must be set toTransactWriteItems
. This value is required. -
transactItems
-
The request items to include. The value is an array of request items. At least one request item must be provided. This
transactItems
value is required.For
PutItem
, the fields are defined as follows:-
table
-
The destination DynamoDB table. The value is a string of the table name. This
table
value is required. -
operation
-
The DynamoDB operation to perform. To perform the
PutItem
DynamoDB operation, this must be set toPutItem
. This value is required. -
key
-
The DynamoDB key representing the primary key of the item to put. DynamoDB items may have a single hash key, or a hash key and sort key, depending on the table structure. For more information about how to specify a “typed value”, see Type system (request mapping). This value is required.
-
attributeValues
-
The rest of the attributes of the item to be put into DynamoDB. For more information about how to specify a “typed value”, see Type system (request mapping). This field is optional.
-
condition
-
A condition to determine if the request should succeed or not, based on the state of the object already in DynamoDB. If no condition is specified, the
PutItem
request overwrites any existing entry for that item. You can specify whether to retrieve the existing item back when condition check fails. For more information about transactional conditions, see Transaction condition expressions. This value is optional.
For
UpdateItem
, the fields are defined as follows:-
table
-
The DynamoDB table to update. The value is a string of the table name. This
table
value is required. -
operation
-
The DynamoDB operation to perform. To perform the
UpdateItem
DynamoDB operation, this must be set toUpdateItem
. This value is required. -
key
-
The DynamoDB key representing the primary key of the item to update. DynamoDB items may have a single hash key, or a hash key and sort key, depending on the table structure. For more information about how to specify a “typed value”, see Type system (request mapping). This value is required.
-
update
-
The
update
section lets you specify an update expression that describes how to update the item in DynamoDB. For more information about how to write update expressions, see the DynamoDB UpdateExpressions documentation. This section is required. -
condition
-
A condition to determine if the request should succeed or not, based on the state of the object already in DynamoDB. If no condition is specified, the
UpdateItem
request updates the existing entry regardless of its current state. You can specify whether to retrieve the existing item back when condition check fails. For more information about transactional conditions, see Transaction condition expressions. This value is optional.
For
DeleteItem
, the fields are defined as follows:-
table
-
The DynamoDB table in which to delete the item. The value is a string of the table name. This
table
value is required. -
operation
-
The DynamoDB operation to perform. To perform the
DeleteItem
DynamoDB operation, this must be set toDeleteItem
. This value is required. -
key
-
The DynamoDB key representing the primary key of the item to delete. DynamoDB items may have a single hash key, or a hash key and sort key, depending on the table structure. For more information about how to specify a “typed value”, see Type system (request mapping). This value is required.
-
condition
-
A condition to determine if the request should succeed or not, based on the state of the object already in DynamoDB. If no condition is specified, the
DeleteItem
request deletes an item regardless of its current state. You can specify whether to retrieve the existing item back when condition check fails. For more information about transactional conditions, see Transaction condition expressions. This value is optional.
For
ConditionCheck
, the fields are defined as follows:-
table
-
The DynamoDB table in which to check the condition. The value is a string of the table name. This
table
value is required. -
operation
-
The DynamoDB operation to perform. To perform the
ConditionCheck
DynamoDB operation, this must be set toConditionCheck
. This value is required. -
key
-
The DynamoDB key representing the primary key of the item to condition check. DynamoDB items may have a single hash key, or a hash key and sort key, depending on the table structure. For more information about how to specify a “typed value”, see Type system (request mapping). This value is required.
-
condition
-
A condition to determine if the request should succeed or not, based on the state of the object already in DynamoDB. You can specify whether to retrieve the existing item back when condition check fails. For more information about transactional conditions, see Transaction condition expressions. This value is required.
-
-
Things to remember:
-
Only keys of request items are returned in the response, if successful. The order of keys will be the same as the order of request items.
-
Transactions are performed in an all-or-nothing way. If any request item causes an error, the whole transaction will not be performed and error details will be returned.
-
No two request items can target the same item. Otherwise they will cause TransactionCanceledException error.
-
If the error of a transaction is TransactionCanceledException, the
cancellationReasons
block will be populated. If a request item’s condition check fails and you did not specifyreturnValuesOnConditionCheckFailure
to befalse
, the item existing in the table will be retrieved and stored initem
at the corresponding position ofcancellationReasons
block. -
TransactWriteItems
is limited to 25 request items.
For the following example function request handler:
import { util } from '@aws-appsync/utils'; export function request(ctx) { const { authorId, postId, title, description, oldTitle, authorName } = ctx.args; return { operation: 'TransactWriteItems', transactItems: [ { table: 'posts', operation: 'PutItem', key: util.dynamodb.toMapValues({ postId }), attributeValues: util.dynamodb.toMapValues({ title, description }), condition: util.transform.toDynamoDBConditionExpression({ title: { eq: oldTitle }, }), }, { table: 'authors', operation: 'UpdateItem', key: util.dynamodb.toMapValues({ authorId }), update: { expression: 'SET authorName = :name', expressionValues: util.dynamodb.toMapValues({ ':name': authorName }), }, }, ], }; }
If the transaction succeeds, the invocation result available in ctx.result
is as
follows:
{ "keys": [ // Key of the PutItem request { "post_id": "p1", }, // Key of the UpdateItem request { "author_id": "a1" } ], "cancellationReasons": null }
If the transaction fails due to condition check failure of the PutItem
request, the invocation
result available in ctx.result
is as follows:
{ "keys": null, "cancellationReasons": [ { "item": { "post_id": "p1", "post_title": "Actual old title", "post_description": "Old description" }, "type": "ConditionCheckFailed", "message": "The condition check failed." }, { "type": "None", "message": "None" } ] }
The ctx.error
contains details about the error. The keys keys
and cancellationReasons are guaranteed to be present in
ctx.result
.
Type system (request mapping)
When using the Amazon AppSync DynamoDB function to call your DynamoDB tables, Amazon AppSync needs to know the type of each value to use in that call. This is because DynamoDB supports more type primitives than GraphQL or JSON (such as sets and binary data). Amazon AppSync needs some hints when translating between GraphQL and DynamoDB, otherwise it would have to make some assumptions on how data is structured in your table.
For more information about DynamoDB data types, see the DynamoDB Data type descriptors and Data types documentation.
A DynamoDB value is represented by a JSON object containing a single key-value pair. The key specifies the
DynamoDB type, and the value specifies the value itself. In the following example, the key S
denotes
that the value is a string, and the value identifier
is the string value itself.
{ "S" : "identifier" }
Note that the JSON object cannot have more than one key-value pair. If more than one key-value pair is specified, the request object isn’t parsed.
A DynamoDB value is used anywhere in a request object where you need to specify a value. Some places where you
need to do this include: key
and attributeValue
sections, and the
expressionValues
section of expression sections. In the following example, the DynamoDB String
value identifier
is being assigned to the id
field in a key
section
(perhaps in a GetItem
request object).
"key" : { "id" : { "S" : "identifier" } }
Supported Types
Amazon AppSync supports the following DynamoDB scalar, document, and set types:
- String type
S
-
A single string value. A DynamoDB String value is denoted by:
{ "S" : "some string" }
An example usage is:
"key" : { "id" : { "S" : "some string" } }
- String set type
SS
-
A set of string values. A DynamoDB String Set value is denoted by:
{ "SS" : [ "first value", "second value", ... ] }
An example usage is:
"attributeValues" : { "phoneNumbers" : { "SS" : [ "+1 555 123 4567", "+1 555 234 5678" ] } }
- Number type
N
-
A single numeric value. A DynamoDB Number value is denoted by:
{ "N" : 1234 }
An example usage is:
"expressionValues" : { ":expectedVersion" : { "N" : 1 } }
- Number set type
NS
-
A set of number values. A DynamoDB Number Set value is denoted by:
{ "NS" : [ 1, 2.3, 4 ... ] }
An example usage is:
"attributeValues" : { "sensorReadings" : { "NS" : [ 67.8, 12.2, 70 ] } }
- Binary type
B
-
A binary value. A DynamoDB Binary value is denoted by:
{ "B" : "SGVsbG8sIFdvcmxkIQo=" }
Note that the value is actually a string, where the string is the base64-encoded representation of the binary data. Amazon AppSync decodes this string back into its binary value before sending it to DynamoDB. Amazon AppSync uses the base64 decoding scheme as defined by RFC 2045: any character that isn’t in the base64 alphabet is ignored.
An example usage is:
"attributeValues" : { "binaryMessage" : { "B" : "SGVsbG8sIFdvcmxkIQo=" } }
- Binary set type
BS
-
A set of binary values. A DynamoDB Binary Set value is denoted by:
{ "BS" : [ "SGVsbG8sIFdvcmxkIQo=", "SG93IGFyZSB5b3U/Cg==" ... ] }
Note that the value is actually a string, where the string is the base64-encoded representation of the binary data. Amazon AppSync decodes this string back into its binary value before sending it to DynamoDB. Amazon AppSync uses the base64 decoding scheme as defined by RFC 2045: any character that is not in the base64 alphabet is ignored.
An example usage is:
"attributeValues" : { "binaryMessages" : { "BS" : [ "SGVsbG8sIFdvcmxkIQo=", "SG93IGFyZSB5b3U/Cg==" ] } }
- Boolean type
BOOL
-
A Boolean value. A DynamoDB Boolean value is denoted by:
{ "BOOL" : true }
Note that only
true
andfalse
are valid values.An example usage is:
"attributeValues" : { "orderComplete" : { "BOOL" : false } }
- List type
L
-
A list of any other supported DynamoDB value. A DynamoDB List value is denoted by:
{ "L" : [ ... ] }
Note that the value is a compound value, where the list can contain zero or more of any supported DynamoDB value (including other lists). The list can also contain a mix of different types.
An example usage is:
{ "L" : [ { "S" : "A string value" }, { "N" : 1 }, { "SS" : [ "Another string value", "Even more string values!" ] } ] }
- Map type
M
-
Representing an unordered collection of key-value pairs of other supported DynamoDB values. A DynamoDB Map value is denoted by:
{ "M" : { ... } }
Note that a map can contain zero or more key-value pairs. The key must be a string, and the value can be any supported DynamoDB value (including other maps). The map can also contain a mix of different types.
An example usage is:
{ "M" : { "someString" : { "S" : "A string value" }, "someNumber" : { "N" : 1 }, "stringSet" : { "SS" : [ "Another string value", "Even more string values!" ] } } }
- Null type
NULL
-
A null value. A DynamoDB Null value is denoted by:
{ "NULL" : null }
An example usage is:
"attributeValues" : { "phoneNumbers" : { "NULL" : null } }
For more information about each type, see the DynamoDB documentation .
Type system (response mapping)
When receiving a response from DynamoDB, Amazon AppSync automatically converts it into GraphQL and JSON primitive types. Each attribute in DynamoDB is decoded and returned in the response handler's context.
For example, if DynamoDB returns the following:
{ "id" : { "S" : "1234" }, "name" : { "S" : "Nadia" }, "age" : { "N" : 25 } }
When the result is returned from your pipeline resolver, Amazon AppSync converts it into GraphQL and JSON types as:
{ "id" : "1234", "name" : "Nadia", "age" : 25 }
This section explains how Amazon AppSync converts the following DynamoDB scalar, document, and set types:
- String type
S
-
A single string value. A DynamoDB String value is returned as a string.
For example, if DynamoDB returned the following DynamoDB String value:
{ "S" : "some string" }
Amazon AppSync converts it to a string:
"some string"
- String set type
SS
-
A set of string values. A DynamoDB String Set value is returned as a list of strings.
For example, if DynamoDB returned the following DynamoDB String Set value:
{ "SS" : [ "first value", "second value", ... ] }
Amazon AppSync converts it to a list of strings:
[ "+1 555 123 4567", "+1 555 234 5678" ]
- Number type
N
-
A single numeric value. A DynamoDB Number value is returned as a number.
For example, if DynamoDB returned the following DynamoDB Number value:
{ "N" : 1234 }
Amazon AppSync converts it to a number:
1234
- Number set type
NS
-
A set of number values. A DynamoDB Number Set value is returned as a list of numbers.
For example, if DynamoDB returned the following DynamoDB Number Set value:
{ "NS" : [ 67.8, 12.2, 70 ] }
Amazon AppSync converts it to a list of numbers:
[ 67.8, 12.2, 70 ]
- Binary type
B
-
A binary value. A DynamoDB Binary value is returned as a string containing the base64 representation of that value.
For example, if DynamoDB returned the following DynamoDB Binary value:
{ "B" : "SGVsbG8sIFdvcmxkIQo=" }
Amazon AppSync converts it to a string containing the base64 representation of the value:
"SGVsbG8sIFdvcmxkIQo="
Note that the binary data is encoded in the base64 encoding scheme as specified in RFC 4648
and RFC 2045 . - Binary set type
BS
-
A set of binary values. A DynamoDB Binary Set value is returned as a list of strings containing the base64 representation of the values.
For example, if DynamoDB returned the following DynamoDB Binary Set value:
{ "BS" : [ "SGVsbG8sIFdvcmxkIQo=", "SG93IGFyZSB5b3U/Cg==" ... ] }
Amazon AppSync converts it to a list of strings containing the base64 representation of the values:
[ "SGVsbG8sIFdvcmxkIQo=", "SG93IGFyZSB5b3U/Cg==" ... ]
Note that the binary data is encoded in the base64 encoding scheme as specified in RFC 4648
and RFC 2045 . - Boolean type
BOOL
-
A Boolean value. A DynamoDB Boolean value is returned as a Boolean.
For example, if DynamoDB returned the following DynamoDB Boolean value:
{ "BOOL" : true }
Amazon AppSync converts it to a Boolean:
true
- List type
L
-
A list of any other supported DynamoDB value. A DynamoDB List value is returned as a list of values, where each inner value is also converted.
For example, if DynamoDB returned the following DynamoDB List value:
{ "L" : [ { "S" : "A string value" }, { "N" : 1 }, { "SS" : [ "Another string value", "Even more string values!" ] } ] }
Amazon AppSync converts it to a list of converted values:
[ "A string value", 1, [ "Another string value", "Even more string values!" ] ]
- Map type
M
-
A key/value collection of any other supported DynamoDB value. A DynamoDB Map value is returned as a JSON object, where each key/value is also converted.
For example, if DynamoDB returned the following DynamoDB Map value:
{ "M" : { "someString" : { "S" : "A string value" }, "someNumber" : { "N" : 1 }, "stringSet" : { "SS" : [ "Another string value", "Even more string values!" ] } } }
Amazon AppSync converts it to a JSON object:
{ "someString" : "A string value", "someNumber" : 1, "stringSet" : [ "Another string value", "Even more string values!" ] }
- Null type
NULL
-
A null value.
For example, if DynamoDB returned the following DynamoDB Null value:
{ "NULL" : null }
Amazon AppSync converts it to a null:
null
Filters
When querying objects in DynamoDB using the Query
and Scan
operations, you can
optionally specify a filter
that evaluates the results and returns only the desired values.
The filter property of a Query
or Scan
request has the following structure:
type DynamoDBExpression = { expression: string; expressionNames?: { [key: string]: string}; expressionValues?: { [key: string]: any}; };
The fields are defined as follows:
-
expression
-
The query expression. For more information about how to write filter expressions, see the DynamoDB QueryFilter and DynamoDB ScanFilter documentation. This field must be specified.
-
expressionNames
-
The substitutions for expression attribute name placeholders, in the form of key-value pairs. The key corresponds to a name placeholder used in the
expression
. The value must be a string that corresponds to the attribute name of the item in DynamoDB. This field is optional, and should only be populated with substitutions for expression attribute name placeholders used in theexpression
. -
expressionValues
-
The substitutions for expression attribute value placeholders, in the form of key-value pairs. The key corresponds to a value placeholder used in the
expression
, and the value must be a typed value. For more information about how to specify a “typed value”, see Type system (request mapping). This must be specified. This field is optional, and should only be populated with substitutions for expression attribute value placeholders used in theexpression
.
Example
The following example is a filter section for a request, where entries retrieved from DynamoDB are only
returned if the title starts with the title
argument.
Here we use the util.transform.toDynamoDBFilterExpression
to automatically create a filter
from an object:
const filter = util.transform.toDynamoDBFilterExpression({ title: { beginsWith: 'far away' }, }); const request = {}; request.filter = JSON.parse(filter);
This generates the following filter:
{ "filter": { "expression": "(begins_with(#title,:title_beginsWith))", "expressionNames": { "#title": "title" }, "expressionValues": { ":title_beginsWith": { "S": "far away" } } } }
Condition expressions
When you mutate objects in DynamoDB by using the PutItem
, UpdateItem
, and
DeleteItem
DynamoDB operations, you can optionally specify a condition expression that controls
whether the request should succeed or not, based on the state of the object already in DynamoDB before the
operation is performed.
The Amazon AppSync DynamoDB function allows a condition expression to be specified in PutItem
,
UpdateItem
, and DeleteItem
request objects, and also a strategy to follow if the
condition fails and the object was not updated.
Example 1
The following PutItem
request object doesn’t have a condition expression. As a result, it
puts an item in DynamoDB even if an item with the same key already exists, thereby overwriting the existing
item.
import { util } from '@aws-appsync/utils'; export function request(ctx) { const { foo, bar, ...values} = ctx.args return { operation: 'PutItem', key: util.dynamodb.toMapValues({foo, bar}), attributeValues: util.dynamodb.toMapValues(values), }; }
Example 2
The following PutItem
object does have a condition expression that allows the operation
succeed only if an item with the same key does not exist in DynamoDB.
import { util } from '@aws-appsync/utils'; export function request(ctx) { const { foo, bar, ...values} = ctx.args return { operation: 'PutItem', key: util.dynamodb.toMapValues({foo, bar}), attributeValues: util.dynamodb.toMapValues(values), condition: { expression: "attribute_not_exists(id)" } }; }
By default, if the condition check fails, the Amazon AppSync DynamoDB function provides an error in
ctx.error
. You can return the error for the mutation and the current value of the object in
DynamoDB in a data
field in the error
section of the GraphQL response.
However, the Amazon AppSync DynamoDB function offers some additional features to help developers handle some common edge cases:
-
If Amazon AppSync DynamoDB functions can determine that the current value in DynamoDB matches the desired result, it treats the operation as if it succeeded anyway.
-
Instead of returning an error, you can configure the function to invoke a custom Lambda function to decide how the Amazon AppSync DynamoDB function should handle the failure.
These are described in greater detail in the Handling a condition check failure section.
For more information about DynamoDB conditions expressions, see the DynamoDB ConditionExpressions documentation .
Specifying a condition
The PutItem
, UpdateItem
, and DeleteItem
request objects all allow
an optional condition
section to be specified. If omitted, no condition check is made. If
specified, the condition must be true for the operation to succeed.
A condition
section has the following structure:
type ConditionCheckExpression = { expression: string; expressionNames?: { [key: string]: string}; expressionValues?: { [key: string]: any}; equalsIgnore?: string[]; consistentRead?: boolean; conditionalCheckFailedHandler?: { strategy: 'Custom' | 'Reject'; lambdaArn?: string; }; };
The following fields specify the condition:
-
expression
-
The update expression itself. For more information about how to write condition expressions, see the DynamoDB ConditionExpressions documentation . This field must be specified.
-
expressionNames
-
The substitutions for expression attribute name placeholders, in the form of key-value pairs. The key corresponds to a name placeholder used in the expression, and the value must be a string corresponding to the attribute name of the item in DynamoDB. This field is optional, and should only be populated with substitutions for expression attribute name placeholders used in the expression.
-
expressionValues
-
The substitutions for expression attribute value placeholders, in the form of key-value pairs. The key corresponds to a value placeholder used in the expression, and the value must be a typed value. For more information about how to specify a “typed value”, see Type system (request mapping). This must be specified. This field is optional, and should only be populated with substitutions for expression attribute value placeholders used in the expression.
The remaining fields tell the Amazon AppSync DynamoDB function how to handle a condition check failure:
-
equalsIgnore
-
When a condition check fails when using the
PutItem
operation, the Amazon AppSync DynamoDB function compares the item currently in DynamoDB against the item it tried to write. If they are the same, it treats the operation as it if succeeded anyway. You can use theequalsIgnore
field to specify a list of attributes that Amazon AppSync should ignore when performing that comparison. For example, if the only difference was aversion
attribute, it treats the operation as if it succeeded. This field is optional. -
consistentRead
-
When a condition check fails, Amazon AppSync gets the current value of the item from DynamoDB using a strongly consistent read. You can use this field to tell the Amazon AppSync DynamoDB function to use an eventually consistent read instead. This field is optional, and defaults to
true
. -
conditionalCheckFailedHandler
-
This section allows you to specify how the Amazon AppSync DynamoDB function treats a condition check failure after it has compared the current value in DynamoDB against the expected result. This section is optional. If omitted, it defaults to a strategy of
Reject
.-
strategy
-
The strategy the Amazon AppSync DynamoDB function takes after it has compared the current value in DynamoDB against the expected result. This field is required and has the following possible values:
-
Reject
-
The mutation fails, and an error for the mutation and the current value of the object in DynamoDB in a
data
field in theerror
section of the GraphQL response. -
Custom
-
The Amazon AppSync DynamoDB function invokes a custom Lambda function to decide how to handle the condition check failure. When the
strategy
is set toCustom
, thelambdaArn
field must contain the ARN of the Lambda function to invoke.
-
-
lambdaArn
-
The ARN of the Lambda function to invoke that determines how the Amazon AppSync DynamoDB function should handle the condition check failure. This field must only be specified when
strategy
is set toCustom
. For more information about how to use this feature, see Handling a condition check failure.
-
Handling a condition check failure
When a condition check fails, the Amazon AppSync DynamoDB function can pass on the error for the mutation and the
current value of the object by using the util.appendError
utility. This adds the
data
field in the error
section of the GraphQL response. However, the
Amazon AppSync DynamoDB function offers some additional features to help developers handle some common edge
cases:
-
If Amazon AppSync DynamoDB functions can determine that the current value in DynamoDB matches the desired result, it treats the operation as if it succeeded anyway.
-
Instead of returning an error, you can configure the function to invoke a custom Lambda function to decide how the Amazon AppSync DynamoDB function should handle the failure.
The flowchart for this process is:
![](images/DynamoDB-condition-check-failure-handling.png)
Checking for the desired result
When the condition check fails, the Amazon AppSync DynamoDB function performs a GetItem
DynamoDB
request to get the current value of the item from DynamoDB. By default, it uses a strongly consistent read,
however this can be configured using the consistentRead
field in the condition
block and compare it against the expected result:
-
For the
PutItem
operation, the Amazon AppSync DynamoDB function compares the current value against the one it attempted to write, excluding any attributes listed inequalsIgnore
from the comparison. If the items are the same, it treats the operation as successful and returns the item that was retrieved from DynamoDB. Otherwise, it follows the configured strategy.For example, if the
PutItem
request object looked like the following:import { util } from '@aws-appsync/utils'; export function request(ctx) { const { id, name, version} = ctx.args return { operation: 'PutItem', key: util.dynamodb.toMapValues({foo, bar}), attributeValues: util.dynamodb.toMapValues({ name, version: version+1 }), condition: { expression: "version = :expectedVersion", expressionValues: util.dynamodb.toMapValues({':expectedVersion': version}), equalsIgnore: ['version'] } }; }
And the item currently in DynamoDB looked like the following:
{ "id" : { "S" : "1" }, "name" : { "S" : "Steve" }, "version" : { "N" : 8 } }
The Amazon AppSync DynamoDB function would compare the item it tried to write against the current value, see that the only difference was the
version
field, but because it’s configured to ignore theversion
field, it treats the operation as successful and returns the item that was retrieved from DynamoDB. -
For the
DeleteItem
operation, the Amazon AppSync DynamoDB function checks to verify that an item was returned from DynamoDB. If no item was returned, it treats the operation as successful. Otherwise, it follows the configured strategy. -
For the
UpdateItem
operation, the Amazon AppSync DynamoDB function does not have enough information to determine if the item currently in DynamoDB matches the expected result, and therefore follows the configured strategy.
If the current state of the object in DynamoDB is different from the expected result, the Amazon AppSync DynamoDB function follows the configured strategy, to either reject the mutation or invoke a Lambda function to determine what to do next.
Following the “reject” strategy
When following the Reject
strategy, the Amazon AppSync DynamoDB function returns an error for the
mutation, and the current value of the object in DynamoDB is also returned in a data
field in
the error
section of the GraphQL response. The item returned from DynamoDB is put through the
function response handler to translate it into a format the client expects, and it is filtered by the
selection set.
For example, given the following mutation request:
mutation { updatePerson(id: 1, name: "Steve", expectedVersion: 1) { Name theVersion } }
If the item returned from DynamoDB looks like the following:
{ "id" : { "S" : "1" }, "name" : { "S" : "Steve" }, "version" : { "N" : 8 } }
And the function response handler looks like the following:
import { util } from '@aws-appsync/utils'; export function response(ctx) { const { version, ...values } = ctx.result; const result = { ...values, theVersion: version }; if (ctx.error) { if (error) { return util.appendError(error.message, error.type, result, null); } } return result }
The GraphQL response looks like the following:
{ "data": null, "errors": [ { "message": "The conditional request failed (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ConditionalCheckFailedException; Request ID: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ)" "errorType": "DynamoDB:ConditionalCheckFailedException", "data": { "Name": "Steve", "theVersion": 8 }, ... } ] }
Also, if any fields in the returned object are filled by other resolvers and the mutation had
succeeded, they won’t be resolved when the object is returned in the error
section.
Following the “custom” strategy
When following the Custom
strategy, the Amazon AppSync DynamoDB function invokes a Lambda function
to decide what to do next. The Lambda function chooses one of the following options:
-
reject
the mutation. This tells the Amazon AppSync DynamoDB function to behave as if the configured strategy wasReject
, returning an error for the mutation and the current value of the object in DynamoDB as described in the previous section. -
discard
the mutation. This tells the Amazon AppSync DynamoDB function to silently ignore the condition check failure and returns the value in DynamoDB. -
retry
the mutation. This tells the Amazon AppSync DynamoDB function to retry the mutation with a new request object.
The Lambda invocation request
The Amazon AppSync DynamoDB function invokes the Lambda function specified in the lambdaArn
. It uses
the same service-role-arn
configured on the data source. The payload of the invocation has
the following structure:
{ "arguments": { ... }, "requestMapping": {... }, "currentValue": { ... }, "resolver": { ... }, "identity": { ... } }
The fields are defined as follows:
-
arguments
-
The arguments from the GraphQL mutation. This is the same as the arguments available to the request object in
context.arguments
. -
requestMapping
-
The request object for this operation.
-
currentValue
-
The current value of the object in DynamoDB.
-
resolver
-
Information about the Amazon AppSync resolver or function.
-
identity
-
Information about the caller. This is the same as the identity information available to the request object in
context.identity
.
A full example of the payload:
{ "arguments": { "id": "1", "name": "Steve", "expectedVersion": 1 }, "requestMapping": { "version" : "2017-02-28", "operation" : "PutItem", "key" : { "id" : { "S" : "1" } }, "attributeValues" : { "name" : { "S" : "Steve" }, "version" : { "N" : 2 } }, "condition" : { "expression" : "version = :expectedVersion", "expressionValues" : { ":expectedVersion" : { "N" : 1 } }, "equalsIgnore": [ "version" ] } }, "currentValue": { "id" : { "S" : "1" }, "name" : { "S" : "Steve" }, "version" : { "N" : 8 } }, "resolver": { "tableName": "People", "awsRegion": "us-west-2", "parentType": "Mutation", "field": "updatePerson", "outputType": "Person" }, "identity": { "accountId": "123456789012", "sourceIp": "x.x.x.x", "user": "AIDAAAAAAAAAAAAAAAAAA", "userArn": "arn:aws:iam::123456789012:user/appsync" } }
The Lambda Invocation Response
The Lambda function can inspect the invocation payload and apply any business logic to decide how the Amazon AppSync DynamoDB function should handle the failure. There are three options for handling the condition check failure:
-
reject
the mutation. The response payload for this option must have this structure:{ "action": "reject" }
This tells the Amazon AppSync DynamoDB function to behave as if the configured strategy was
Reject
, returning an error for the mutation and the current value of the object in DynamoDB, as described in the section above. -
discard
the mutation. The response payload for this option must have this structure:{ "action": "discard" }
This tells the Amazon AppSync DynamoDB function to silently ignore the condition check failure and returns the value in DynamoDB.
-
retry
the mutation. The response payload for this option must have this structure:{ "action": "retry", "retryMapping": { ... } }
This tells the Amazon AppSync DynamoDB function to retry the mutation with a new request object. The structure of the
retryMapping
section depends on the DynamoDB operation, and is a subset of the full request object for that operation.For
PutItem
, theretryMapping
section has the following structure. For a description of theattributeValues
field, see PutItem.{ "attributeValues": { ... }, "condition": { "equalsIgnore" = [ ... ], "consistentRead" = true } }
For
UpdateItem
, theretryMapping
section has the following structure. For a description of theupdate
section, see UpdateItem.{ "update" : { "expression" : "someExpression" "expressionNames" : { "#foo" : "foo" }, "expressionValues" : { ":bar" : ... typed value } }, "condition": { "consistentRead" = true } }
For
DeleteItem
, theretryMapping
section has the following structure.{ "condition": { "consistentRead" = true } }
There is no way to specify a different operation or key to work on. The Amazon AppSync DynamoDB function only allows retries of the same operation on the same object. Also, the
condition
section doesn’t allow aconditionalCheckFailedHandler
to be specified. If the retry fails, the Amazon AppSync DynamoDB function follows theReject
strategy.
Here is an example Lambda function to deal with a failed PutItem
request. The business
logic looks at who made the call. If it was made by jeffTheAdmin
, it retries the request,
updating the version
and expectedVersion
from the item currently in DynamoDB.
Otherwise, it rejects the mutation.
exports.handler = (event, context, callback) => { console.log("Event: "+ JSON.stringify(event)); // Business logic goes here. var response; if ( event.identity.user == "jeffTheAdmin" ) { response = { "action" : "retry", "retryMapping" : { "attributeValues" : event.requestMapping.attributeValues, "condition" : { "expression" : event.requestMapping.condition.expression, "expressionValues" : event.requestMapping.condition.expressionValues } } } response.retryMapping.attributeValues.version = { "N" : event.currentValue.version.N + 1 } response.retryMapping.condition.expressionValues[':expectedVersion'] = event.currentValue.version } else { response = { "action" : "reject" } } console.log("Response: "+ JSON.stringify(response)) callback(null, response) };
Transaction condition expressions
Transaction condition expressions are available in requests of all four types of operations in
TransactWriteItems
, namely, PutItem
, DeleteItem
,
UpdateItem
, and ConditionCheck
.
For PutItem
, DeleteItem
, and UpdateItem
, the transaction condition
expression is optional. For ConditionCheck
, the transaction condition expression is
required.
Example 1
The following transactional DeleteItem
function request handler does not have a condition
expression. As a result, it deletes the item in DynamoDB.
import { util } from '@aws-appsync/utils'; export function request(ctx) { const { postId } = ctx.args; return { operation: 'TransactWriteItems', transactItems: [ { table: 'posts', operation: 'DeleteItem', key: util.dynamodb.toMapValues({ postId }), } ], }; }
Example 2
The following transactional DeleteItem
function request handler does have a transaction
condition expression that allows the operation succeed only if the author of that post equals a certain
name.
import { util } from '@aws-appsync/utils'; export function request(ctx) { const { postId, authorName} = ctx.args; return { operation: 'TransactWriteItems', transactItems: [ { table: 'posts', operation: 'DeleteItem', key: util.dynamodb.toMapValues({ postId }), condition: util.transform.toDynamoDBConditionExpression({ authorName: { eq: authorName }, }), } ], }; }
If the condition check fails, it will cause TransactionCanceledException
and the error
detail will be returned in ctx.result.cancellationReasons
. Note that by default, the old item
in DynamoDB that made condition check fail will be returned in
ctx.result.cancellationReasons
.
Specifying a condition
The PutItem
, UpdateItem
, and DeleteItem
request objects all allow
an optional condition
section to be specified. If omitted, no condition check is made. If
specified, the condition must be true for the operation to succeed. The ConditionCheck
must
have a condition
section to be specified. The condition must be true for the whole transaction
to succeed.
A condition
section has the following structure:
type TransactConditionCheckExpression = { expression: string; expressionNames?: { [key: string]: string }; expressionValues?: { [key: string]: string }; returnValuesOnConditionCheckFailure: boolean; };
The following fields specify the condition:
-
expression
-
The update expression itself. For more information about how to write condition expressions, see the DynamoDB ConditionExpressions documentation . This field must be specified.
-
expressionNames
-
The substitutions for expression attribute name placeholders, in the form of key-value pairs. The key corresponds to a name placeholder used in the expression, and the value must be a string corresponding to the attribute name of the item in DynamoDB. This field is optional, and should only be populated with substitutions for expression attribute name placeholders used in the expression.
-
expressionValues
-
The substitutions for expression attribute value placeholders, in the form of key-value pairs. The key corresponds to a value placeholder used in the expression, and the value must be a typed value. For more information about how to specify a “typed value”, see Type system (request mapping). This must be specified. This field is optional, and should only be populated with substitutions for expression attribute value placeholders used in the expression.
-
returnValuesOnConditionCheckFailure
-
Specify whether to retrieve the item in DynamoDB back when a condition check fails. The retrieved item will be in
ctx.result.cancellationReasons[<index>].item
, where<index>
is the index of the request item that failed the condition check. This value defaults to true.
Projections
When reading objects in DynamoDB using the GetItem
, Scan
, Query
,
BatchGetItem
, and TransactGetItems
operations, you can optionally specify a
projection that identifies the attributes that you want. The projection property has the following structure,
which is similar to filters:
type DynamoDBExpression = { expression: string; expressionNames?: { [key: string]: string} };
The fields are defined as follows:
-
expression
-
The projection expression, which is a string. To retrieve a single attribute, specify its name. For multiple attributes, the names must be comma-separated values. For more information on writing projection expressions, see the DynamoDB projection expressions documentation. This field is required.
-
expressionNames
-
The substitutions for expression attribute name placeholders in the form of key-value pairs. The key corresponds to a name placeholder used in the
expression
. The value must be a string that corresponds to the attribute name of the item in DynamoDB. This field is optional and should only be populated with substitutions for expression attribute name placeholders used in theexpression
. For more information aboutexpressionNames
, see the DynamoDB documentation.
Example 1
The following example is a projection section for a JavaScript function in which only the attributes
author
and id
are returned from DynamoDB:
projection : { expression : "#author, id", expressionNames : { "#author" : "author" } }
Tip
You can access your GraphQL request selection set using selectionSetList. This field allows you to frame your projection expression dynamically according to your requirements.
Note
While using projection expressions with the Query
and Scan
operations, the
value for select
must be SPECIFIC_ATTRIBUTES
. For more information, see the
DynamoDB
documentation.