Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Menggabungkan resolver GraphQL di AWS AppSync
Resolver dan bidang dalam skema GraphQL memiliki hubungan 1:1 dengan tingkat fleksibilitas yang besar. Karena sumber data dikonfigurasi pada resolver secara independen dari skema, Anda memiliki kemampuan untuk menyelesaikan atau memanipulasi tipe GraphQL Anda melalui sumber data yang berbeda, memungkinkan Anda untuk mencampur dan mencocokkan skema untuk memenuhi kebutuhan Anda.
Skenario berikut menunjukkan cara mencampur dan mencocokkan sumber data dalam skema Anda. Sebelum memulai, Anda harus terbiasa dengan mengonfigurasi sumber data dan resolver untuk, Amazon AWS Lambda DynamoDB, dan Amazon Service. OpenSearch
Contoh skema
Skema berikut memiliki jenis Post
dengan tiga Query
dan Mutation
operasi masing-masing:
type Post { id: ID! author: String! title: String content: String url: String ups: Int downs: Int version: Int! } type Query { allPost: [Post] getPost(id: ID!): Post searchPosts: [Post] } type Mutation { addPost( id: ID!, author: String!, title: String, content: String, url: String ): Post updatePost( id: ID!, author: String!, title: String, content: String, url: String, ups: Int!, downs: Int!, expectedVersion: Int! ): Post deletePost(id: ID!): Post }
Dalam contoh ini, Anda akan memiliki total enam resolver dengan masing-masing membutuhkan sumber data. Salah satu cara untuk mengatasi masalah ini adalah dengan menghubungkannya ke satu tabel Amazon DynamoDB, yang Posts
disebut, di mana AllPost
bidang menjalankan pemindaian dan searchPosts
bidang menjalankan kueri (JavaScriptlihat referensi fungsi resolver untuk DynamoDB). Namun, Anda tidak terbatas pada Amazon DynamoDB; sumber data yang berbeda seperti Lambda OpenSearch atau Layanan ada untuk memenuhi persyaratan bisnis Anda.
Mengubah data melalui resolver
Anda mungkin perlu mengembalikan hasil dari database pihak ketiga yang tidak didukung secara langsung oleh sumber AWS AppSync data. Anda mungkin juga harus melakukan modifikasi kompleks pada data sebelum dikembalikan ke API klien. Hal ini dapat disebabkan oleh pemformatan tipe data yang tidak tepat, seperti perbedaan stempel waktu pada klien, atau penanganan masalah kompatibilitas mundur. Dalam hal ini, menghubungkan AWS Lambda fungsi sebagai sumber data ke Anda AWS AppSync API adalah solusi yang tepat. Untuk tujuan ilustrasi, dalam contoh berikut, AWS Lambda fungsi memanipulasi data yang diambil dari penyimpanan data pihak ketiga:
export const handler = (event, context, callback) => { // fetch data const result = fetcher() // apply complex business logic const data = transform(result) // return to AppSync return data };
Ini adalah fungsi Lambda yang benar-benar valid dan dapat dilampirkan ke AllPost
bidang dalam skema GraphQL sehingga setiap kueri yang mengembalikan semua hasil mendapat angka acak untuk naik/turun.
DynamoDB dan Layanan OpenSearch
Untuk beberapa aplikasi, Anda mungkin melakukan mutasi atau kueri pencarian sederhana terhadap DynamoDB dan memiliki proses latar belakang mentransfer dokumen ke Layanan. OpenSearch Anda cukup melampirkan searchPosts
resolver ke sumber data OpenSearch Layanan dan mengembalikan hasil pencarian (dari data yang berasal dari DynamoDB) menggunakan kueri GraphQL. Ini bisa sangat kuat saat menambahkan operasi pencarian lanjutan ke aplikasi Anda seperti kata kunci, kecocokan kata kabur, atau bahkan pencarian geospasial. Mentransfer data dari DynamoDB dapat dilakukan melalui proses, atau sebagai alternatif, Anda dapat melakukan streaming dari DynamoDB ETL menggunakan Lambda.
Untuk memulai dengan sumber data khusus ini, lihat tutorial DynamoDB dan Lambda kami.
Misalnya, menggunakan skema dari tutorial kami sebelumnya, mutasi berikut menambahkan item ke DynamoDB:
mutation addPost { addPost( id: 123 author: "Nadia" title: "Our first post!" content: "This is our first post." url: "https://aws.amazon.com/appsync/" ) { id author title content url ups downs version } }
Ini menulis data ke DynamoDB, yang kemudian mengalirkan data melalui Lambda ke OpenSearch Amazon Service, yang kemudian Anda gunakan untuk mencari posting berdasarkan bidang yang berbeda. Misalnya, karena data ada di OpenSearch Layanan Amazon, Anda dapat mencari bidang penulis atau konten dengan teks bentuk bebas, bahkan dengan spasi, sebagai berikut:
query searchName{ searchAuthor(name:" Nadia "){ id title content } } ---------- or ---------- query searchContent{ searchContent(text:"test"){ id title content } }
Karena data ditulis langsung ke DynamoDB, Anda masih dapat melakukan operasi pencarian daftar atau item yang efisien terhadap tabel dengan dan kueri. allPost{...}
getPost{...}
Tumpukan ini menggunakan kode contoh berikut untuk aliran DynamoDB:
catatan
Kode Python ini adalah contoh dan tidak dimaksudkan untuk digunakan dalam kode produksi.
import boto3 import requests from requests_aws4auth import AWS4Auth region = '' # e.g. us-east-1 service = 'es' credentials = boto3.Session().get_credentials() awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token) host = '' # the OpenSearch Service domain, e.g. https://search-mydomain.us-west-1.es.amazonaws.com index = 'lambda-index' datatype = '_doc' url = host + '/' + index + '/' + datatype + '/' headers = { "Content-Type": "application/json" } def handler(event, context): count = 0 for record in event['Records']: # Get the primary key for use as the OpenSearch ID id = record['dynamodb']['Keys']['id']['S'] if record['eventName'] == 'REMOVE': r = requests.delete(url + id, auth=awsauth) else: document = record['dynamodb']['NewImage'] r = requests.put(url + id, auth=awsauth, json=document, headers=headers) count += 1 return str(count) + ' records processed.'
Anda kemudian dapat menggunakan aliran DynamoDB untuk melampirkan ini ke tabel DynamoDB dengan kunci id
utama, dan setiap perubahan pada sumber DynamoDB akan mengalir ke domain Layanan Anda. OpenSearch Untuk informasi selengkapnya tentang mengonfigurasi ini, lihat dokumentasi DynamoDB Streams.