Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
AWS AppSync referensi template pemetaan resolver untuk Lambda
catatan
Kami sekarang terutama mendukung runtime APPSYNC_JS dan dokumentasinya. Harap pertimbangkan untuk menggunakan runtime APPSYNC_JS dan panduannya di sini. https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html
Anda dapat menggunakan AWS AppSync fungsi dan resolver untuk memanggil fungsi Lambda yang terletak di akun Anda. Anda dapat membentuk payload permintaan Anda dan respons dari fungsi Lambda Anda sebelum mengembalikannya ke klien Anda. Anda juga dapat menggunakan template pemetaan untuk memberikan petunjuk AWS AppSync tentang sifat operasi yang akan dipanggil. Bagian ini menjelaskan template pemetaan yang berbeda untuk operasi Lambda yang didukung.
Meminta template pemetaan
Template pemetaan permintaan Lambda menangani bidang yang terkait dengan fungsi Lambda Anda:
{ "version": string, "operation": Invoke|BatchInvoke, "payload": any type, "invocationType": RequestResponse|Event }
Ini adalah representasi skema JSON dari template pemetaan permintaan Lambda saat diselesaikan:
{ "definitions": {}, "$schema": "https://json-schema.org/draft-06/schema#", "$id": "https://aws.amazon.com/appsync/request-mapping-template.json", "type": "object", "properties": { "version": { "$id": "/properties/version", "type": "string", "enum": [ "2018-05-29" ], "title": "The Mapping template version.", "default": "2018-05-29" }, "operation": { "$id": "/properties/operation", "type": "string", "enum": [ "Invoke", "BatchInvoke" ], "title": "The Mapping template operation.", "description": "What operation to execute.", "default": "Invoke" }, "payload": {}, "invocationType": { "$id": "/properties/invocationType", "type": "string", "enum": [ "RequestResponse", "Event" ], "title": "The Mapping template invocation type.", "description": "What invocation type to execute.", "default": "RequestResponse" } }, "required": [ "version", "operation" ], "additionalProperties": false }
Berikut contoh yang menggunakan invoke operasi dengan data payloadnya menjadi getPost bidang dari skema GraphQL bersama dengan argumennya dari konteks:
{ "version": "2018-05-29", "operation": "Invoke", "payload": { "field": "getPost", "arguments": $util.toJson($context.arguments) } }
Seluruh dokumen pemetaan diteruskan sebagai input ke fungsi Lambda Anda sehingga contoh sebelumnya sekarang terlihat seperti ini:
{ "version": "2018-05-29", "operation": "Invoke", "payload": { "field": "getPost", "arguments": { "id": "postId1" } } }
Versi
Umum untuk semua template pemetaan permintaan, men version definisikan versi yang digunakan template. Diper version lukan dan merupakan nilai statis:
"version": "2018-05-29"
Operasi
Sumber data Lambda memungkinkan Anda menentukan dua operasi di operation lapangan: Invoke danBatchInvoke. InvokeOperasi memungkinkan untuk AWS AppSync memanggil fungsi Lambda Anda untuk setiap resolver bidang GraphQL. BatchInvokemenginstruksikan permintaan batch AWS AppSync untuk bidang GraphQL saat ini. Bidang operation wajib diisi.
UntukInvoke, template pemetaan permintaan yang diselesaikan cocok dengan muatan input dari fungsi Lambda. Mari kita memodifikasi contoh di atas:
{ "version": "2018-05-29", "operation": "Invoke", "payload": { "arguments": $util.toJson($context.arguments) } }
Ini diselesaikan dan diteruskan ke fungsi Lambda, yang bisa terlihat seperti ini:
{ "version": "2018-05-29", "operation": "Invoke", "payload": { "arguments": { "id": "postId1" } } }
UntukBatchInvoke, template pemetaan diterapkan ke setiap penyelesai bidang dalam batch. Untuk keringkasan, gabungkan AWS AppSync semua payload nilai template pemetaan yang diselesaikan ke dalam daftar di bawah satu objek yang cocok dengan template pemetaan. Template contoh berikut menunjukkan penggabungan:
{ "version": "2018-05-29", "operation": "BatchInvoke", "payload": $util.toJson($context) }
Template ini diselesaikan ke dalam dokumen pemetaan berikut:
{ "version": "2018-05-29", "operation": "BatchInvoke", "payload": [ {...}, // context for batch item 1 {...}, // context for batch item 2 {...} // context for batch item 3 ] }
Setiap elemen payload daftar sesuai dengan satu item batch. Fungsi Lambda juga diharapkan mengembalikan respons berbentuk daftar yang cocok dengan urutan item yang dikirim dalam permintaan:
[ { "data": {...}, "errorMessage": null, "errorType": null }, // result for batch item 1 { "data": {...}, "errorMessage": null, "errorType": null }, // result for batch item 2 { "data": {...}, "errorMessage": null, "errorType": null } // result for batch item 3 ]
Payload
Bid payload ang adalah wadah yang digunakan untuk meneruskan JSON yang terbentuk dengan baik ke fungsi Lambda. Jika operation bidang disetel keBatchInvoke, AWS AppSync bungkus payload nilai yang ada ke dalam daftar. Bid payload ang ini opsional.
Jenis pemanggilan
Sumber data Lambda memungkinkan Anda untuk menentukan dua jenis pemanggilan: RequestResponse dan. Event Jenis pemanggilan identik dengan tipe pemanggilan yang didefinisikan dalam API Lambda. Jenis pem RequestResponse anggilan memungkinkan memang AWS AppSync gil fungsi Lambda Anda secara sinkron untuk menunggu respons. Pemang Event gilan memungkinkan Anda untuk memanggil fungsi Lambda Anda secara asinkron. Untuk informasi selengkapnya tentang cara Lambda menangani permintaan jenis pem Event anggilan, lihat Pemanggilan asinkron. Bid invocationType ang ini opsional. Jika bidang ini tidak disertakan dalam permintaan, AWS AppSync akan default ke jenis pem RequestResponse anggilan.
Untuk invocationType bidang apa pun, permintaan yang diselesaikan cocok dengan muatan input dari fungsi Lambda. Mari kita memodifikasi contoh di atas:
{ "version": "2018-05-29", "operation": "Invoke", "invocationType": "Event" "payload": { "arguments": $util.toJson($context.arguments) } }
Ini diselesaikan dan diteruskan ke fungsi Lambda, yang bisa terlihat seperti ini:
{ "version": "2018-05-29", "operation": "Invoke", "invocationType": "Event", "payload": { "arguments": { "id": "postId1" } } }
Ketika BatchInvoke operasi digunakan bersama dengan bidang tipe pemang Event gilan, menggabungkan resolver bidang AWS AppSync dengan cara yang sama yang disebutkan di atas, dan permintaan diteruskan ke fungsi Lambda Anda sebagai peristiwa asinkron dengan menjadi daftar nilai. payload Kami menyarankan Anda menonaktifkan caching resolver untuk resolver tipe Event pemanggilan karena ini tidak akan dikirim ke Lambda jika ada hit cache.
Templat pemetaan respons
Seperti sumber data lainnya, fungsi Lambda Anda mengirimkan respons AWS AppSync yang harus dikonversi ke tipe GraphQL.
Hasil dari fungsi Lambda diatur pada context objek yang tersedia melalui properti Velocity Template Language (VTL)$context.result.
Jika bentuk respons fungsi Lambda Anda persis sama dengan bentuk tipe GraphQL, Anda dapat meneruskan respons menggunakan template pemetaan respons berikut:
$util.toJson($context.result)
Tidak ada bidang atau batasan bentuk wajib yang berlaku untuk template pemetaan respons. Namun, karena GraphQL diketik dengan kuat, template pemetaan yang diselesaikan harus sesuai dengan jenis GraphQL yang diharapkan.
Fungsi lambda respons berkelompok
Jika operation bidang disetel keBatchInvoke, AWS AppSync mengharapkan daftar item kembali dari fungsi Lambda. AWS AppSync Untuk memetakan setiap hasil kembali ke item permintaan asli, daftar respons harus sesuai dalam ukuran dan urutan. Valid untuk memiliki null item dalam daftar respons; $ctx.result disetel ke null yang sesuai.
Resolver Lambda Langsung
Jika Anda ingin menghindari penggunaan template pemetaan sepenuhnya, AWS AppSync dapat memberikan payload default ke fungsi Lambda Anda dan respons fungsi Lambda default ke tipe GraphQL. Anda dapat memilih untuk menyediakan template permintaan, templat respons, atau tidak keduanya, dan menangan AWS AppSync inya sesuai dengan itu.
Templat pemetaan permintaan Lambda langsung
Ketika template pemetaan permintaan tidak disediakan, AWS AppSync akan mengirim Context objek langsung ke fungsi Lambda Anda sebagai Invoke operasi. Untuk informasi lebih lanjut tentang struktur objek Context, lihat AWS AppSync referensi konteks template pemetaan resolver.
Templat pemetaan respons Lambda langsung
Ketika template pemetaan respons tidak disediakan, lakukan AWS AppSync salah satu dari dua hal setelah menerima respons fungsi Lambda Anda. Jika Anda tidak menyediakan template pemetaan permintaan atau jika Anda menyediakan template pemetaan permintaan dengan versi tersebut2018-05-29, respons akan setara dengan template pemetaan respons berikut:
#if($ctx.error) $util.error($ctx.error.message, $ctx.error.type, $ctx.result) #end $util.toJson($ctx.result)
Jika Anda menyediakan template dengan versi2017-02-28, logika respons berfungsi setara dengan template pemetaan respons berikut:
$util.toJson($ctx.result)
Secara dangkal, bypass template pemetaan beroperasi mirip dengan menggunakan templat pemetaan tertentu seperti yang ditunjukkan pada contoh sebelumnya. Namun, di balik layar, evaluasi template pemetaan dielakkan sepenuhnya. Karena langkah evaluasi template dilewati, aplikasi mungkin mengalami lebih sedikit overhead dan latensi selama respons dalam beberapa skenario dibandingkan dengan fungsi Lambda dengan template pemetaan respons yang perlu dievaluasi.
Penanganan kesalahan khusus dalam respons Direct Lambda Resolver
Anda dapat menyesuaikan respons kesalahan dari fungsi Lambda yang dipanggil Direct Lambda Resolvers dengan memunculkan pengecualian khusus. Contoh berikut menunjukkan cara membuat pengecualian khusus menggunakan JavaScript:
class CustomException extends Error { constructor(message) { super(message); this.name = "CustomException"; } } throw new CustomException("Custom message");
Ketika pengecualian dimunculkanmessage, errorType name dan errorMessage adalah dan, masing-masing, dari kesalahan khusus yang dilemparkan.
Jika errorType yaUnauthorizedException, AWS AppSync mengembalikan pesan default ("You are not authorized to make this
call.") alih-alih pesan khusus.
Cuplikan berikut adalah contoh respons GraphQL yang menunjukkan kustom: errorType
{ "data": { "query": null }, "errors": [ { "path": [ "query" ], "data": null, "errorType": "CustomException", "errorInfo": null, "locations": [ { "line": 5, "column": 10, "sourceName": null } ], "message": "Custom Message" } ] }
Resolver Lambda Langsung: Batching diaktifkan
Anda dapat mengaktifkan batching untuk Direct Lambda Resolver Anda dengan mengonfigurasi maxBatchSize pada resolver Anda. Ketika maxBatchSize disetel ke nilai yang lebih besar daripada 0 untuk resolver Lambda Langsung, AWS AppSync mengirimkan permintaan dalam batch ke fungsi Lambda Anda dalam ukuran hingga. maxBatchSize
Menyet maxBatchSize el ke 0 pada resolver Lambda Langsung mematikan batching.
Untuk informasi selengkapnya tentang cara kerja batching dengan resolver Lambda, lihat. Kasus penggunaan lanjutan: Batching
Meminta template pemetaan
Ketika batching diaktifkan dan template pemetaan permintaan tidak disediakan, AWS AppSync mengirimkan daftar Context objek sebagai BatchInvoke operasi langsung ke fungsi Lambda Anda.
Templat pemetaan respons
Ketika batching diaktifkan dan template pemetaan respons tidak disediakan, logika respons setara dengan template pemetaan respons berikut:
#if( $context.result && $context.result.errorMessage ) $utils.error($context.result.errorMessage, $context.result.errorType, $context.result.data) #else $utils.toJson($context.result.data) #end
Fungsi Lambda harus mengembalikan daftar hasil dalam urutan yang sama dengan daftar Context objek yang dikirim. Anda dapat mengembalikan kesalahan individual dengan memberikan errorMessage dan errorType untuk hasil tertentu. Setiap hasil dalam daftar memiliki format berikut:
{ "data" : { ... }, // your data "errorMessage" : { ... }, // optional, if included an error entry is added to the "errors" object in the AppSync response "errorType" : { ... } // optional, the error type }
catatan
Bidang lain dalam objek hasil saat ini diabaikan.
Menangani kesalahan dari Lambda
Anda dapat mengembalikan kesalahan untuk semua hasil dengan melemparkan pengecualian atau kesalahan dalam fungsi Lambda Anda. Jika permintaan muatan atau ukuran respons untuk permintaan batch Anda terlalu besar, Lambda mengembalikan kesalahan. Dalam hal ini, Anda harus mempertimbangkan untuk mengurangi maxBatchSize atau mengurangi ukuran muatan respons.
Untuk informasi tentang penanganan kesalahan individu, lihatMengembalikan kesalahan individu.
Contoh fungsi Lambda
Dengan menggunakan skema di bawah ini, Anda dapat membuat Direct Lambda Resolver untuk Post.relatedPosts field resolver dan mengaktifkan batching dengan menyetel di atas: maxBatchSize 0
schema { query: Query mutation: Mutation } type Query { getPost(id:ID!): Post allPosts: [Post] } type Mutation { addPost(id: ID!, author: String!, title: String, content: String, url: String): Post! } type Post { id: ID! author: String! title: String content: String url: String ups: Int downs: Int relatedPosts: [Post] }
Dalam kueri berikut, fungsi Lambda akan dipanggil dengan kumpulan permintaan untuk diselesaikan: relatedPosts
query getAllPosts { allPosts { id relatedPosts { id } } }
Implementasi sederhana dari fungsi Lambda disediakan di bawah ini:
const posts = { 1: { id: '1', title: 'First book', author: 'Author1', url: 'https://amazon.com/', content: 'SAMPLE TEXT AUTHOR 1 SAMPLE TEXT AUTHOR 1 SAMPLE TEXT AUTHOR 1 SAMPLE TEXT AUTHOR 1 SAMPLE TEXT AUTHOR 1 SAMPLE TEXT AUTHOR 1', ups: '100', downs: '10', }, 2: { id: '2', title: 'Second book', author: 'Author2', url: 'https://amazon.com', content: 'SAMPLE TEXT AUTHOR 2 SAMPLE TEXT AUTHOR 2 SAMPLE TEXT', ups: '100', downs: '10', }, 3: { id: '3', title: 'Third book', author: 'Author3', url: null, content: null, ups: null, downs: null }, 4: { id: '4', title: 'Fourth book', author: 'Author4', url: 'https://www.amazon.com/', content: 'SAMPLE TEXT AUTHOR 4 SAMPLE TEXT AUTHOR 4 SAMPLE TEXT AUTHOR 4 SAMPLE TEXT AUTHOR 4 SAMPLE TEXT AUTHOR 4 SAMPLE TEXT AUTHOR 4 SAMPLE TEXT AUTHOR 4 SAMPLE TEXT AUTHOR 4', ups: '1000', downs: '0', }, 5: { id: '5', title: 'Fifth book', author: 'Author5', url: 'https://www.amazon.com/', content: 'SAMPLE TEXT AUTHOR 5 SAMPLE TEXT AUTHOR 5 SAMPLE TEXT AUTHOR 5 SAMPLE TEXT AUTHOR 5 SAMPLE TEXT', ups: '50', downs: '0', }, } const relatedPosts = { 1: [posts['4']], 2: [posts['3'], posts['5']], 3: [posts['2'], posts['1']], 4: [posts['2'], posts['1']], 5: [], } exports.handler = async (event) => { console.log('event ->', event) // retrieve the ID of each post const ids = event.map((context) => context.source.id) // fetch the related posts for each post id const related = ids.map((id) => relatedPosts[id]) // return the related posts; or an error if none were found return related.map((r) => { if (r.length > 0) { return { data: r } } else { return { data: null, errorMessage: 'Not found', errorType: 'ERROR' } } }) }