Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Ekspresi kondisi
Saat Anda mengubah objek di DynamoDB dengan menggunakan operasiPutItem
,UpdateItem
, dan DeleteItem
DynamoDB, Anda dapat secara opsional menentukan ekspresi kondisi yang mengontrol apakah permintaan harus berhasil atau tidak, berdasarkan status objek yang sudah ada di DynamoDB sebelum operasi dilakukan.
AWS AppSync DynamoDB resolver memungkinkan ekspresi kondisi untuk ditentukan PutItem
dalamUpdateItem
,, DeleteItem
dan meminta dokumen pemetaan, dan juga strategi untuk mengikuti jika kondisi gagal dan objek tidak diperbarui.
Contoh 1
Dokumen PutItem
pemetaan berikut tidak memiliki ekspresi kondisi. Akibatnya, ia menempatkan item di DynamoDB bahkan jika item dengan kunci yang sama sudah ada, sehingga menimpa item yang ada.
{ "version" : "2017-02-28", "operation" : "PutItem", "key" : { "id" : { "S" : "1" } } }
Contoh 2
Dokumen PutItem
pemetaan berikut memang memiliki ekspresi kondisi yang memungkinkan operasi berhasil hanya jika item dengan kunci yang sama tidak ada di DynamoDB.
{ "version" : "2017-02-28", "operation" : "PutItem", "key" : { "id" : { "S" : "1" } }, "condition" : { "expression" : "attribute_not_exists(id)" } }
Secara default, jika pemeriksaan kondisi gagal, penyelesai AWS AppSync DynamoDB mengembalikan kesalahan untuk mutasi dan nilai objek saat ini di DynamoDB di bidang di bagian respons GraphQL. data
error
Namun, AWS AppSync DynamoDB resolver menawarkan beberapa fitur tambahan untuk membantu pengembang menangani beberapa kasus tepi umum:
-
Jika AWS AppSync DynamoDB resolver dapat menentukan bahwa nilai saat ini di DynamoDB cocok dengan hasil yang diinginkan, ia memperlakukan operasi seolah-olah berhasil pula.
-
Alih-alih mengembalikan kesalahan, Anda dapat mengonfigurasi resolver untuk menjalankan fungsi Lambda khusus untuk memutuskan bagaimana penyelesai DynamoDB harus menangani kegagalan AWS AppSync tersebut.
Ini dijelaskan secara lebih rinci di bagian Penanganan Kegagalan Pemeriksaan Kondisi.
Menentukan suatu kondisi
Dokumen pemetaan PutItem
UpdateItem
,, dan DeleteItem
permintaan semuanya memungkinkan condition
bagian opsional untuk ditentukan. Jika dihilangkan, tidak ada pemeriksaan kondisi yang dilakukan. Jika ditentukan, kondisi harus benar agar operasi berhasil.
condition
Bagian memiliki struktur sebagai berikut:
"condition" : { "expression" : "someExpression" "expressionNames" : { "#foo" : "foo" }, "expressionValues" : { ":bar" : ... typed value }, "equalsIgnore" : [ "version" ], "consistentRead" : true, "conditionalCheckFailedHandler" : { "strategy" : "Custom", "lambdaArn" : "arn:..." } }
Bidang berikut menentukan kondisi:
-
expression
-
Ekspresi pembaruan itu sendiri. Untuk informasi selengkapnya tentang cara menulis ekspresi kondisi, lihat dokumentasi DynamoDB ConditionExpressions . Bidang ini harus ditentukan.
-
expressionNames
-
Substitusi untuk placeholder nama atribut ekspresi, dalam bentuk pasangan kunci-nilai. Kunci sesuai dengan placeholder nama yang digunakan dalam ekspresi, dan nilainya harus berupa string yang sesuai dengan nama atribut item di DynamoDB. Bidang ini bersifat opsional, dan seharusnya hanya diisi dengan substitusi untuk placeholder nama atribut ekspresi yang digunakan dalam ekspresi.
-
expressionValues
-
Substitusi untuk placeholder nilai atribut ekspresi, dalam bentuk pasangan kunci-nilai. Kunci sesuai dengan placeholder nilai yang digunakan dalam ekspresi, dan nilainya harus berupa nilai yang diketik. Untuk informasi selengkapnya tentang cara menentukan “nilai yang diketik”, lihat Jenis Sistem (Permintaan Pemetaan). Ini harus ditentukan. Bidang ini bersifat opsional, dan seharusnya hanya diisi dengan substitusi untuk placeholder nilai atribut ekspresi yang digunakan dalam ekspresi.
Bidang yang tersisa memberi tahu AWS AppSync DynamoDB resolver cara menangani kegagalan pemeriksaan kondisi:
-
equalsIgnore
-
Ketika pemeriksaan kondisi gagal saat menggunakan
PutItem
operasi, penyelesai AWS AppSync DynamoDB membandingkan item yang saat ini ada di DynamoDB dengan item yang coba ditulisnya. Jika mereka sama, itu memperlakukan operasi seolah-olah berhasil. Anda dapat menggunakanequalsIgnore
bidang untuk menentukan daftar atribut yang AWS AppSync harus diabaikan saat melakukan perbandingan tersebut. Misalnya, jika satu-satunya perbedaan adalahversion
atribut, ia memperlakukan operasi seolah-olah berhasil. Bidang ini bersifat opsional. -
consistentRead
-
Ketika pemeriksaan kondisi gagal, AWS AppSync dapatkan nilai item saat ini dari DynamoDB menggunakan pembacaan yang sangat konsisten. Anda dapat menggunakan bidang ini untuk memberi tahu penyelesai AWS AppSync DynamoDB agar menggunakan pembacaan yang konsisten pada akhirnya. Bidang ini opsional, dan defaultnya.
true
-
conditionalCheckFailedHandler
-
Bagian ini memungkinkan Anda untuk menentukan bagaimana penyelesai AWS AppSync DynamoDB memperlakukan kegagalan pemeriksaan kondisi setelah membandingkan nilai saat ini di DynamoDB dengan hasil yang diharapkan. Bagian ini opsional. Jika dihilangkan, itu default ke strategi.
Reject
-
strategy
-
Strategi yang diambil oleh AWS AppSync DynamoDB resolver setelah membandingkan nilai saat ini di DynamoDB dengan hasil yang diharapkan. Bidang ini diperlukan dan memiliki nilai yang mungkin berikut:
-
Reject
-
Mutasi gagal, dan kesalahan untuk mutasi dan nilai objek saat ini di DynamoDB di
data
bidang di bagianerror
respons GraphQL. -
Custom
-
Penyelesai DynamoDB memanggil fungsi Lambda khusus untuk memutuskan cara menangani kegagalan pemeriksaan kondisi. AWS AppSync Ketika
strategy
diatur keCustom
,lambdaArn
bidang harus berisi fungsi Lambda untuk memanggil. ARN
-
-
lambdaArn
-
Fungsi Lambda untuk memanggil yang menentukan bagaimana AWS AppSync DynamoDB resolver harus menangani kegagalan pemeriksaan kondisi. ARN Bidang ini hanya harus ditentukan ketika
strategy
diatur keCustom
. Untuk informasi selengkapnya tentang cara menggunakan fitur ini, lihat Menangani Kegagalan Pemeriksaan Kondisi.
-
Menangani kegagalan pemeriksaan kondisi
Secara default, ketika pemeriksaan kondisi gagal, penyelesai AWS AppSync DynamoDB mengembalikan kesalahan untuk mutasi dan nilai objek saat ini di DynamoDB di bidang di bagian respons GraphQL. data
error
Namun, AWS AppSync DynamoDB resolver menawarkan beberapa fitur tambahan untuk membantu pengembang menangani beberapa kasus tepi umum:
-
Jika AWS AppSync DynamoDB resolver dapat menentukan bahwa nilai saat ini di DynamoDB cocok dengan hasil yang diinginkan, ia memperlakukan operasi seolah-olah berhasil pula.
-
Alih-alih mengembalikan kesalahan, Anda dapat mengonfigurasi resolver untuk menjalankan fungsi Lambda khusus untuk memutuskan bagaimana penyelesai DynamoDB harus menangani kegagalan AWS AppSync tersebut.
Diagram alur untuk proses ini adalah:
Memeriksa hasil yang diinginkan
Ketika pemeriksaan kondisi gagal, penyelesai AWS AppSync DynamoDB melakukan permintaan DynamoDB GetItem
untuk mendapatkan nilai item saat ini dari DynamoDB. Secara default, ini menggunakan pembacaan yang sangat konsisten, namun ini dapat dikonfigurasi menggunakan consistentRead
bidang di condition
blok dan membandingkannya dengan hasil yang diharapkan:
-
Untuk
PutItem
operasi, AWS AppSync DynamoDB resolver membandingkan nilai saat ini terhadap nilai yang mencoba untuk menulis, tidak termasuk atribut yang tercantum dalam dari perbandingan.equalsIgnore
Jika itemnya sama, ia memperlakukan operasi sebagai berhasil dan mengembalikan item yang diambil dari DynamoDB. Jika tidak, ia mengikuti strategi yang dikonfigurasi.Misalnya, jika dokumen pemetaan
PutItem
permintaan terlihat seperti berikut:{ "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" ] } }
Dan item yang saat ini ada di DynamoDB terlihat seperti berikut:
{ "id" : { "S" : "1" }, "name" : { "S" : "Steve" }, "version" : { "N" : 8 } }
Penyelesai DynamoDB akan membandingkan item yang coba ditulisnya dengan nilai saat ini, melihat bahwa satu-satunya perbedaan adalah
version
bidang, tetapi karena dikonfigurasi untuk mengabaikanversion
bidang, ia memperlakukan operasi sebagai berhasil dan mengembalikan item yang diambil dari DynamoDB. AWS AppSync -
Untuk
DeleteItem
operasi, AWS AppSync DynamoDB resolver memeriksa untuk memverifikasi bahwa item dikembalikan dari DynamoDB. Jika tidak ada barang yang dikembalikan, itu memperlakukan operasi sebagai berhasil. Jika tidak, ia mengikuti strategi yang dikonfigurasi. -
Untuk
UpdateItem
operasi, penyelesai AWS AppSync DynamoDB tidak memiliki informasi yang cukup untuk menentukan apakah item yang saat ini ada di DynamoDB cocok dengan hasil yang diharapkan, dan oleh karena itu mengikuti strategi yang dikonfigurasi.
Jika status objek saat ini di DynamoDB berbeda dari hasil yang diharapkan, penyelesai AWS AppSync DynamoDB mengikuti strategi yang dikonfigurasi, untuk menolak mutasi atau memanggil fungsi Lambda untuk menentukan apa yang harus dilakukan selanjutnya.
Mengikuti strategi “tolak”
Saat mengikuti Reject
strategi, penyelesai AWS AppSync DynamoDB mengembalikan kesalahan untuk mutasi, dan nilai objek saat ini di DynamoDB juga dikembalikan dalam bidang di bagian respons GraphQL. data
error
Item yang dikembalikan dari DynamoDB dimasukkan melalui template pemetaan respons untuk menerjemahkannya ke dalam format yang diharapkan klien, dan difilter oleh set pilihan.
Misalnya, diberikan permintaan mutasi berikut:
mutation { updatePerson(id: 1, name: "Steve", expectedVersion: 1) { Name theVersion } }
Jika item yang dikembalikan dari DynamoDB terlihat seperti berikut:
{ "id" : { "S" : "1" }, "name" : { "S" : "Steve" }, "version" : { "N" : 8 } }
Dan template pemetaan respons terlihat seperti berikut:
{ "id" : $util.toJson($context.result.id), "Name" : $util.toJson($context.result.name), "theVersion" : $util.toJson($context.result.version) }
Respons GraphQL terlihat seperti berikut:
{ "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 }, ... } ] }
Juga, jika ada bidang dalam objek yang dikembalikan diisi oleh resolver lain dan mutasi telah berhasil, mereka tidak akan diselesaikan ketika objek dikembalikan di bagian. error
Mengikuti strategi “kustom”
Saat mengikuti Custom
strategi, penyelesai AWS AppSync DynamoDB memanggil fungsi Lambda untuk memutuskan apa yang harus dilakukan selanjutnya. Fungsi Lambda memilih salah satu opsi berikut:
-
reject
mutasi. Ini memberitahu AWS AppSync DynamoDB resolver untuk berperilaku seolah-olah strategi yang dikonfigurasiReject
adalah, mengembalikan kesalahan untuk mutasi dan nilai objek saat ini di DynamoDB seperti yang dijelaskan di bagian sebelumnya. -
discard
mutasi. Ini memberitahu AWS AppSync DynamoDB resolver untuk diam-diam mengabaikan kegagalan pemeriksaan kondisi dan mengembalikan nilai dalam DynamoDB. -
retry
mutasi. Ini memberitahu AWS AppSync DynamoDB resolver untuk mencoba lagi mutasi dengan dokumen pemetaan permintaan baru.
Permintaan doa Lambda
Penyelesai AWS AppSync DynamoDB memanggil fungsi Lambda yang ditentukan dalam. lambdaArn
Ini menggunakan service-role-arn
konfigurasi yang sama pada sumber data. Muatan doa memiliki struktur sebagai berikut:
{ "arguments": { ... }, "requestMapping": {... }, "currentValue": { ... }, "resolver": { ... }, "identity": { ... } }
Bidang didefinisikan sebagai berikut:
-
arguments
-
Argumen dari mutasi GraphQL. Ini sama dengan argumen yang tersedia untuk dokumen pemetaan permintaan di
$context.arguments
. -
requestMapping
-
Dokumen pemetaan permintaan untuk operasi ini.
-
currentValue
-
Nilai objek saat ini di DynamoDB.
-
resolver
-
Informasi tentang AWS AppSync resolver.
-
identity
-
Informasi tentang penelepon. Ini sama dengan informasi identitas yang tersedia untuk dokumen pemetaan permintaan di
$context.identity
.
Contoh lengkap dari muatan:
{ "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" } }
Tanggapan Doa Lambda
Fungsi Lambda dapat memeriksa payload pemanggilan dan menerapkan logika bisnis apa pun untuk memutuskan bagaimana penyelesai AWS AppSync DynamoDB harus menangani kegagalan. Ada tiga opsi untuk menangani kegagalan pemeriksaan kondisi:
-
reject
mutasi. Payload respons untuk opsi ini harus memiliki struktur ini:{ "action": "reject" }
Ini memberitahu AWS AppSync DynamoDB resolver untuk berperilaku seolah-olah strategi yang dikonfigurasi
Reject
adalah, mengembalikan kesalahan untuk mutasi dan nilai objek saat ini di DynamoDB, seperti yang dijelaskan pada bagian di atas. -
discard
mutasi. Payload respons untuk opsi ini harus memiliki struktur ini:{ "action": "discard" }
Ini memberitahu AWS AppSync DynamoDB resolver untuk diam-diam mengabaikan kegagalan pemeriksaan kondisi dan mengembalikan nilai dalam DynamoDB.
-
retry
mutasi. Payload respons untuk opsi ini harus memiliki struktur ini:{ "action": "retry", "retryMapping": { ... } }
Ini memberitahu AWS AppSync DynamoDB resolver untuk mencoba lagi mutasi dengan dokumen pemetaan permintaan baru. Struktur
retryMapping
bagian tergantung pada operasi DynamoDB, dan merupakan bagian dari dokumen pemetaan permintaan lengkap untuk operasi itu.Untuk
PutItem
,retryMapping
bagian tersebut memiliki struktur sebagai berikut. Untuk deskripsiattributeValues
lapangan, lihat PutItem.{ "attributeValues": { ... }, "condition": { "equalsIgnore" = [ ... ], "consistentRead" = true } }
Untuk
UpdateItem
,retryMapping
bagian tersebut memiliki struktur sebagai berikut. Untuk deskripsiupdate
bagian ini, lihat UpdateItem.{ "update" : { "expression" : "someExpression" "expressionNames" : { "#foo" : "foo" }, "expressionValues" : { ":bar" : ... typed value } }, "condition": { "consistentRead" = true } }
Untuk
DeleteItem
,retryMapping
bagian tersebut memiliki struktur sebagai berikut.{ "condition": { "consistentRead" = true } }
Tidak ada cara untuk menentukan operasi atau kunci yang berbeda untuk dikerjakan. AWS AppSync DynamoDB resolver hanya memungkinkan percobaan ulang dari operasi yang sama pada objek yang sama. Juga,
condition
bagian ini tidak mengizinkan aconditionalCheckFailedHandler
untuk ditentukan. Jika percobaan ulang gagal, penyelesai AWS AppSync DynamoDB mengikuti strategi.Reject
Berikut adalah contoh fungsi Lambda untuk menangani permintaan yang gagalPutItem
. Logika bisnis melihat siapa yang membuat panggilan. Jika dibuat olehjeffTheAdmin
, ia mencoba ulang permintaan, memperbarui version
dan expectedVersion
dari item yang saat ini ada di DynamoDB. Jika tidak, ia menolak mutasi.
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) };