

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Merancang GraphQL APIs dengan AWS AppSync
<a name="designing-a-graphql-api"></a>

AWS AppSync memungkinkan Anda membuat APIs GraphQL menggunakan pengalaman konsol. Anda melihat sekilas ini di bagian [Launching a sample](https://docs.aws.amazon.com/appsync/latest/devguide/quickstart.html) schema. Namun, panduan itu tidak menunjukkan seluruh katalog opsi dan konfigurasi yang dapat Anda manfaatkan. AWS AppSync

Saat Anda memilih untuk membuat GraphQL API di konsol, ada beberapa opsi untuk dijelajahi. Jika Anda mengikuti panduan [Peluncuran skema sampel](https://docs.aws.amazon.com/appsync/latest/devguide/quickstart.html) kami, kami menunjukkan cara membuat API dari model yang telah ditentukan sebelumnya. Di bagian berikut, kami akan memandu Anda melalui sisa opsi dan konfigurasi untuk membuat GraphQL APIs di. AWS AppSync

Di bagian ini, Anda akan meninjau konsep-konsep berikut:

1. [Blank APIs or imports](blank-import-api.md#aws-appsync-blank-import-api): Panduan ini akan berjalan melalui seluruh proses pembuatan untuk membuat GraphQL API. Anda akan belajar cara membuat GraphQL dari template kosong tanpa model, mengonfigurasi sumber data untuk skema Anda, dan menambahkan resolver pertama Anda ke bidang.

1. [Real-time data](aws-appsync-real-time-data.md#aws-appsync-real-time-data-anchor): Panduan ini akan menunjukkan kepada Anda opsi potensial untuk membuat API menggunakan AWS AppSync WebSocket mesin.

1. [Merged APIs](merged-api.md#aws-appsync-merged-api): Panduan ini akan menunjukkan cara membuat GraphQL baru dengan mengaitkan dan menggabungkan data dari beberapa APIs GraphQL yang ada. APIs

1. [Membangun APIs GraphQL dengan introspeksi RDS](rds-introspection.md): Panduan ini akan menunjukkan cara mengintegrasikan tabel Amazon RDS Anda menggunakan API Data.

# Penataan GraphQL API (kosong atau diimpor) APIs
<a name="blank-import-api"></a>

Sebelum Anda membuat GraphQL API Anda dari template kosong, akan membantu untuk meninjau konsep seputar GraphQL. Ada tiga komponen dasar dari GraphQL API:

1. **Skema** adalah file yang berisi bentuk dan definisi data Anda. Ketika permintaan dibuat oleh klien ke layanan GraphQL Anda, data yang dikembalikan akan mengikuti spesifikasi skema. Untuk informasi selengkapnya, lihat [GraphQL skema](schema-components.md#aws-appsync-schema-components).

1. **Sumber data** dilampirkan ke skema Anda. Ketika permintaan dibuat, di sinilah data diambil dan dimodifikasi. Untuk informasi selengkapnya, lihat [Sumber data](data-source-components.md#aws-appsync-data-source-components).

1. **Resolver** berada di antara skema dan sumber data. Ketika permintaan dibuat, resolver melakukan operasi pada data dari sumber, kemudian mengembalikan hasilnya sebagai respons. Untuk informasi selengkapnya, lihat [Penyelesai](resolver-components.md#aws-appsync-resolver-components).

![\[GraphQL API architecture showing schema, resolvers, and data sources connected via AppSync.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/appsync-architecture-graphql-api.png)


AWS AppSync mengelola Anda APIs dengan memungkinkan Anda untuk membuat, mengedit, dan menyimpan kode untuk skema dan resolver Anda. Sumber data Anda akan berasal dari repositori eksternal seperti database, tabel DynamoDB, dan fungsi Lambda. Jika Anda menggunakan AWS layanan untuk menyimpan data atau berencana melakukannya, AWS AppSync berikan pengalaman yang hampir mulus saat mengaitkan data dari akun Anda AWS ke GraphQL Anda. APIs

Di bagian selanjutnya, Anda akan belajar cara membuat masing-masing komponen ini menggunakan AWS AppSync layanan.

**Topics**
+ [Merancang skema GraphQL Anda](designing-your-schema.md)
+ [Melampirkan sumber data](attaching-a-data-source.md)
+ [Mengkonfigurasi resolver AWS AppSync](resolver-config-overview.md)
+ [Menggunakan APIs CDK](using-your-api.md)

# Merancang skema GraphQL Anda
<a name="designing-your-schema"></a>

Skema GraphQL adalah dasar dari setiap implementasi server GraphQL. Setiap GraphQL API didefinisikan oleh skema tunggal **yang** berisi jenis dan bidang yang menjelaskan bagaimana data dari permintaan akan diisi. Data yang mengalir melalui API Anda dan operasi yang dilakukan harus divalidasi terhadap skema.

Secara umum, sistem [tipe GraphQL](https://graphql.org/learn/schema/#type-system) menggambarkan kemampuan server GraphQL dan digunakan untuk menentukan apakah kueri valid. Sistem tipe server sering disebut sebagai skema server dan dapat terdiri dari berbagai jenis objek, jenis skalar, tipe input, dan banyak lagi. GraphQL bersifat deklaratif dan diketik dengan kuat, artinya tipe akan didefinisikan dengan baik saat runtime dan hanya akan mengembalikan apa yang ditentukan.

AWS AppSync memungkinkan Anda untuk menentukan dan mengkonfigurasi skema GraphQL. Bagian berikut menjelaskan cara membuat skema GraphQL dari awal menggunakan layanan ini. AWS AppSync

## Penataan Skema GraphQL
<a name="schema-structure"></a>

**Tip**  
Kami merekomendasikan untuk meninjau bagian [Skema](https://docs.aws.amazon.com//appsync/latest/devguide/schema-components.html) sebelum melanjutkan.

GraphQL adalah alat yang ampuh untuk mengimplementasikan layanan API. Menurut [situs web GraphQL, GraphQL](https://graphql.org/) adalah sebagai berikut:

*GraphQL adalah bahasa kueri APIs untuk dan runtime untuk memenuhi kueri tersebut dengan data Anda yang ada. GraphQL memberikan deskripsi data yang lengkap dan mudah dipahami di API Anda, memberi klien kekuatan untuk meminta apa yang mereka butuhkan dan tidak lebih, membuatnya lebih mudah untuk APIs berkembang dari waktu ke waktu, dan memungkinkan alat pengembang yang kuat.* “

Bagian ini mencakup bagian pertama dari implementasi GraphQL Anda, skema. Menggunakan kutipan di atas, skema memainkan peran “memberikan deskripsi data yang lengkap dan dapat dimengerti di API Anda”. Dengan kata lain, skema GraphQL adalah representasi tekstual dari data, operasi, dan hubungan layanan Anda di antara mereka. Skema ini dianggap sebagai titik masuk utama untuk implementasi layanan GraphQL Anda. Tidak mengherankan, ini sering menjadi salah satu hal pertama yang Anda buat dalam proyek Anda. Kami merekomendasikan untuk meninjau bagian [Skema](https://docs.aws.amazon.com//appsync/latest/devguide/schema-components.html) sebelum melanjutkan.

*Untuk mengutip bagian [Skema, skema](https://docs.aws.amazon.com//appsync/latest/devguide/schema-components.html) GraphQL ditulis dalam Schema Definition Language (SDL).* SDL terdiri dari jenis dan bidang dengan struktur yang mapan:
+ **Jenis**: Jenis adalah bagaimana GraphQL mendefinisikan bentuk dan perilaku data. GraphQL mendukung banyak jenis yang akan dijelaskan nanti di bagian ini. Setiap jenis yang didefinisikan dalam skema Anda akan berisi cakupannya sendiri. Di dalam ruang lingkup akan ada satu atau lebih bidang yang dapat berisi nilai atau logika yang akan digunakan dalam layanan GraphQL Anda. Jenis mengisi banyak peran yang berbeda, yang paling umum adalah objek atau skalar (tipe nilai primitif).
+ **Bidang**: Bidang ada dalam lingkup tipe dan menyimpan nilai yang diminta dari layanan GraphQL. Ini sangat mirip dengan variabel dalam bahasa pemrograman lain. Bentuk data yang Anda tentukan di bidang Anda akan menentukan bagaimana data terstruktur dalam suatu request/response operasi. Hal ini memungkinkan pengembang untuk memprediksi apa yang akan dikembalikan tanpa mengetahui bagaimana backend layanan diimplementasikan.

Skema paling sederhana akan berisi tiga kategori data yang berbeda:

1. **Akar skema**: Akar menentukan titik masuk skema Anda. Ini menunjuk ke bidang yang akan melakukan beberapa operasi pada data seperti menambahkan, menghapus, atau memodifikasi sesuatu.

1. **Jenis**: Ini adalah tipe dasar yang digunakan untuk mewakili bentuk data. Anda hampir dapat menganggap ini sebagai objek atau representasi abstrak dari sesuatu dengan karakteristik yang ditentukan. Misalnya, Anda bisa membuat `Person` objek yang mewakili seseorang dalam database. Karakteristik setiap orang akan didefinisikan di dalam bidang `Person` as. Mereka bisa berupa apa saja seperti nama orang tersebut, usia, pekerjaan, alamat, dll.

1. **Jenis objek khusus**: Ini adalah tipe yang menentukan perilaku operasi dalam skema Anda. Setiap jenis objek khusus didefinisikan sekali per skema. Mereka pertama kali ditempatkan di akar skema, kemudian didefinisikan dalam badan skema. Setiap bidang dalam jenis objek khusus mendefinisikan operasi tunggal yang akan diimplementasikan oleh resolver Anda.

Untuk menempatkan ini ke dalam perspektif, bayangkan Anda membuat layanan yang menyimpan penulis dan buku-buku yang telah mereka tulis. Setiap penulis memiliki nama dan serangkaian buku yang telah mereka tulis. Setiap buku memiliki nama dan daftar penulis terkait. Kami juga ingin kemampuan untuk menambah atau mengambil buku dan penulis. Representasi UFL sederhana dari hubungan ini mungkin terlihat seperti ini:

![\[UML diagram showing Author and Book classes with attributes and methods, linked by association.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/GraphQL-UML-1.png)


Dalam GraphQL, `Author` entitas `Book` dan mewakili dua jenis objek yang berbeda dalam skema Anda:

```
type Author {
}

type Book {
}
```

`Author`berisi `authorName` dan`Books`, sementara `Book` berisi `bookName` dan`Authors`. Ini dapat direpresentasikan sebagai bidang dalam lingkup tipe Anda:

```
type Author {
  authorName: String
  Books: [Book]
}

type Book {
  bookName: String
  Authors: [Author]
}
```

Seperti yang Anda lihat, representasi tipe sangat dekat dengan diagram. Namun, metodenya adalah di mana ia menjadi sedikit lebih rumit. Ini akan ditempatkan di salah satu dari beberapa jenis objek khusus sebagai bidang. Kategorisasi objek khusus mereka tergantung pada perilaku mereka. GraphQL berisi tiga jenis objek khusus mendasar: kueri, mutasi, dan langganan. Untuk informasi selengkapnya, lihat [Objek khusus](https://docs.aws.amazon.com//appsync/latest/devguide/graphql-types.html#special-object-components).

Karena `getAuthor` dan `getBook` keduanya meminta data, mereka akan ditempatkan dalam jenis objek `Query` khusus:

```
type Author {
  authorName: String
  Books: [Book]
}

type Book {
  bookName: String
  Authors: [Author]
}

type Query {
  getAuthor(authorName: String): Author
  getBook(bookName: String): Book
}
```

Operasi ditautkan ke kueri, yang itu sendiri terkait dengan skema. Menambahkan root skema akan menentukan jenis objek khusus (`Query`dalam hal ini) sebagai salah satu titik masuk Anda. Ini dapat dilakukan dengan menggunakan `schema` kata kunci:

```
schema {
  query: Query
}

type Author {
  authorName: String
  Books: [Book]
}

type Book {
  bookName: String
  Authors: [Author]
}

type Query {
  getAuthor(authorName: String): Author
  getBook(bookName: String): Book
}
```

Melihat dua metode terakhir, `addAuthor` dan `addBook` menambahkan data ke database Anda, sehingga mereka akan didefinisikan dalam jenis objek `Mutation` khusus. Namun, dari halaman [Types](https://docs.aws.amazon.com/appsync/latest/devguide/graphql-types.html#input-components), kita juga tahu bahwa input langsung mereferensikan Objek tidak diperbolehkan karena mereka benar-benar tipe output. Dalam hal ini, kita tidak dapat menggunakan `Author` atau`Book`, jadi kita perlu membuat tipe input dengan bidang yang sama. Dalam contoh ini, kami menambahkan `AuthorInput` dan`BookInput`, keduanya menerima bidang yang sama dari jenisnya masing-masing. Kemudian, kami membuat mutasi kami menggunakan input sebagai parameter kami:

```
schema {
  query: Query
  mutation: Mutation
}

type Author {
  authorName: String
  Books: [Book]
}

input AuthorInput {
  authorName: String
  Books: [BookInput]
}

type Book {
  bookName: String
  Authors: [Author]
}

input BookInput {
  bookName: String
  Authors: [AuthorInput]
}

type Query {
  getAuthor(authorName: String): Author
  getBook(bookName: String): Book
}

type Mutation {
  addAuthor(input: [BookInput]): Author
  addBook(input: [AuthorInput]): Book
}
```

Mari kita tinjau apa yang baru saja kita lakukan:

1. Kami membuat skema dengan `Author` tipe `Book` dan untuk mewakili entitas kami.

1. Kami menambahkan bidang yang berisi karakteristik entitas kami.

1. Kami menambahkan query untuk mengambil informasi ini dari database.

1. Kami menambahkan mutasi untuk memanipulasi data dalam database.

1. Kami menambahkan tipe input untuk mengganti parameter objek kami dalam mutasi untuk mematuhi aturan GraphQL.

1. Kami menambahkan kueri dan mutasi ke skema root kami sehingga implementasi GraphQL memahami lokasi tipe root.

Seperti yang Anda lihat, proses pembuatan skema membutuhkan banyak konsep dari pemodelan data (terutama pemodelan basis data) secara umum. Anda dapat menganggap skema sesuai dengan bentuk data dari sumbernya. Ini juga berfungsi sebagai model yang akan diterapkan oleh resolver. Di bagian berikut, Anda akan belajar cara membuat skema menggunakan berbagai alat dan AWS layanan yang didukung.

**catatan**  
Contoh di bagian berikut tidak dimaksudkan untuk berjalan dalam aplikasi nyata. Mereka hanya ada untuk menampilkan perintah sehingga Anda dapat membangun aplikasi Anda sendiri.

## Membuat skema
<a name="creating-schema"></a>

Skema Anda akan berada dalam file bernama`schema.graphql`. AWS AppSync memungkinkan pengguna untuk membuat skema baru untuk APIs GraphQL mereka menggunakan berbagai metode. Dalam contoh ini, kita akan membuat API kosong bersama dengan skema kosong.

------
#### [ Console ]

1. Masuk ke Konsol Manajemen AWS dan buka [AppSynckonsol](https://console.aws.amazon.com/appsync/).

   1. Di **Dasbor**, pilih **Buat API**.

   1. **Di bawah **opsi API**, pilih ** APIsGraphQL****, Desain dari awal,** lalu Berikutnya.**

      1. Untuk **nama API**, ubah nama yang telah diisi sebelumnya menjadi kebutuhan aplikasi Anda.

      1. Untuk **detail kontak**, Anda dapat memasukkan titik kontak untuk mengidentifikasi manajer API. Ini adalah bidang opsional.

      1. Di bawah **konfigurasi API Pribadi**, Anda dapat mengaktifkan fitur API pribadi. API pribadi hanya dapat diakses dari titik akhir VPC (VPCE) yang dikonfigurasi. Untuk informasi selengkapnya, lihat [Pribadi APIs](https://docs.aws.amazon.com/appsync/latest/devguide/using-private-apis.html).

         Kami tidak menyarankan mengaktifkan fitur ini untuk contoh ini. Pilih **Berikutnya** setelah meninjau input Anda.

   1. Di bawah **Buat tipe GraphQL**, Anda dapat memilih untuk membuat tabel DynamoDB untuk digunakan sebagai sumber data atau melewatkan ini dan melakukannya nanti.

      Untuk contoh ini, pilih **Buat sumber daya GraphQL nanti**. Kami akan membuat sumber daya di bagian terpisah.

   1. Tinjau input Anda, lalu pilih **Buat API**.

1. Anda akan berada di dasbor API spesifik Anda. Anda bisa tahu karena nama API akan berada di bagian atas dasbor. Jika ini tidak terjadi, Anda dapat memilih **APIs**di **Sidebar**, lalu pilih API Anda di **APIs dasbor**.

   1. **Di **Sidebar** di bawah nama API Anda, pilih Skema.**

1. Di **editor Skema**, Anda dapat mengonfigurasi `schema.graphql` file Anda. Mungkin kosong atau diisi dengan tipe yang dihasilkan dari model. Di sebelah kanan, Anda memiliki bagian **Resolvers untuk melampirkan resolver** ke bidang skema Anda. Kami tidak akan melihat resolver di bagian ini.

------
#### [ CLI ]

**catatan**  
Saat menggunakan CLI, pastikan Anda memiliki izin yang benar untuk mengakses dan membuat sumber daya dalam layanan. Anda mungkin ingin menetapkan kebijakan [hak istimewa paling sedikit](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege) untuk pengguna non-admin yang perlu mengakses layanan. Untuk informasi selengkapnya tentang AWS AppSync kebijakan, lihat [Identitas dan manajemen akses untuk AWS AppSync](https://docs.aws.amazon.com//appsync/latest/devguide/security-iam.html).  
Selain itu, kami sarankan membaca versi konsol terlebih dahulu jika Anda belum melakukannya.

1. [Jika Anda belum melakukannya, [instal](https://docs.aws.amazon.com//cli/latest/userguide/cli-chap-getting-started.html)AWS CLI, lalu tambahkan konfigurasi Anda.](https://docs.aws.amazon.com//cli/latest/userguide/cli-configure-quickstart.html)

1. Buat objek GraphQL API dengan menjalankan perintah. [https://docs.aws.amazon.com/cli/latest/reference/appsync/create-graphql-api.html](https://docs.aws.amazon.com/cli/latest/reference/appsync/create-graphql-api.html)

   Anda harus mengetikkan dua parameter untuk perintah khusus ini:

   1. API Anda. `name`

   1. Itu`authentication-type`, atau jenis kredensil yang digunakan untuk mengakses API (IAM, OIDC, dll.).
**catatan**  
Parameter lain seperti `Region` harus dikonfigurasi tetapi biasanya akan default ke nilai konfigurasi CLI Anda.

   Contoh perintah mungkin terlihat seperti ini:

   ```
   aws appsync create-graphql-api --name testAPI123 --authentication-type API_KEY
   ```

   Output akan dikembalikan dalam CLI. Inilah contohnya:

   ```
   {
       "graphqlApi": {
           "xrayEnabled": false,
           "name": "testAPI123",
           "authenticationType": "API_KEY",
           "tags": {},
           "apiId": "abcdefghijklmnopqrstuvwxyz",
           "uris": {
               "GRAPHQL": "https://zyxwvutsrqponmlkjihgfedcba.appsync-api.us-west-2.amazonaws.com/graphql",
               "REALTIME": "wss://zyxwvutsrqponmlkjihgfedcba.appsync-realtime-api.us-west-2.amazonaws.com/graphql"
           },
           "arn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz"
       }
   }
   ```

1. 
**catatan**  
Ini adalah perintah opsional yang mengambil skema yang ada dan mengunggahnya ke AWS AppSync layanan menggunakan gumpalan basis-64. Kami tidak akan menggunakan perintah ini demi contoh ini.

   Jalankan perintah [https://docs.aws.amazon.com/cli/latest/reference/appsync/start-schema-creation.html](https://docs.aws.amazon.com/cli/latest/reference/appsync/start-schema-creation.html).

   Anda harus mengetikkan dua parameter untuk perintah khusus ini:

   1. Anda `api-id` dari langkah sebelumnya.

   1. Skema `definition` adalah gumpalan biner yang dikodekan basis-64.

   Contoh perintah mungkin terlihat seperti ini:

   ```
    aws appsync start-schema-creation --api-id abcdefghijklmnopqrstuvwxyz --definition "aa1111aa-123b-2bb2-c321-12hgg76cc33v"
   ```

   Output akan dikembalikan:

   ```
   {
       "status": "PROCESSING"
   }
   ```

   Perintah ini tidak akan mengembalikan output akhir setelah diproses. Anda harus menggunakan perintah terpisah, [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/get-schema-creation-status.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/get-schema-creation-status.html), untuk melihat hasilnya. Perhatikan bahwa kedua perintah ini asinkron, sehingga Anda dapat memeriksa status output bahkan saat skema masih dibuat.

------
#### [ CDK ]

**Tip**  
[Sebelum Anda menggunakan CDK, kami sarankan untuk meninjau [dokumentasi resmi](https://docs.aws.amazon.com/cdk/v2/guide/home.html) CDK bersama dengan referensi CDK AWS AppSync.](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync-readme.html)  
Langkah-langkah yang tercantum di bawah ini hanya akan menampilkan contoh umum dari cuplikan yang digunakan untuk menambahkan sumber daya tertentu. Ini **tidak** dimaksudkan untuk menjadi solusi yang berfungsi dalam kode produksi Anda. Kami juga menganggap Anda sudah memiliki aplikasi yang berfungsi.

1. Titik awal untuk CDK sedikit berbeda. Idealnya, `schema.graphql` file Anda seharusnya sudah dibuat. Anda hanya perlu membuat file baru dengan ekstensi `.graphql` file. Ini bisa menjadi file kosong.

1. Secara umum, Anda mungkin harus menambahkan direktif impor ke layanan yang Anda gunakan. Misalnya, mungkin mengikuti formulir:

   ```
   import * as x from 'x'; # import wildcard as the 'x' keyword from 'x-service'
   import {a, b, ...} from 'c'; # import {specific constructs} from 'c-service'
   ```

   Untuk menambahkan GraphQL API, file stack Anda perlu mengimpor layanan: AWS AppSync 

   ```
   import * as appsync from 'aws-cdk-lib/aws-appsync';
   ```
**catatan**  
Ini berarti kami mengimpor seluruh layanan di bawah `appsync` kata kunci. Untuk menggunakan ini di aplikasi Anda, AWS AppSync konstruksi Anda akan menggunakan format`appsync.construct_name`. Misalnya, jika kita ingin membuat GraphQL API, kita akan mengatakan. `new appsync.GraphqlApi(args_go_here)` Langkah berikut menggambarkan ini.

1. GraphQL API yang paling dasar akan menyertakan `name` untuk API dan jalur. `schema`

   ```
   const add_api = new appsync.GraphqlApi(this, 'API_ID', {
     name: 'name_of_API_in_console',
     schema: appsync.SchemaFile.fromAsset(path.join(__dirname, 'schema_name.graphql')),
   });
   ```
**catatan**  
Mari kita tinjau apa yang dilakukan cuplikan ini. Di dalam lingkup`api`, kami membuat GraphQL API baru dengan menelepon. `appsync.GraphqlApi(scope: Construct, id: string, props: GraphqlApiProps)` Ruang lingkupnya adalah`this`, yang mengacu pada objek saat ini. Id adalah*API\$1ID*, yang akan menjadi nama CloudFormation sumber daya GraphQL API Anda saat dibuat. `GraphqlApiProps`Berisi `name` dari GraphQL API Anda dan file. `schema` `schema`Akan menghasilkan skema (`SchemaFile.fromAsset`) dengan mencari path absolut (`__dirname`) untuk `.graphql` file (*schema\$1name.graphql*). Dalam skenario nyata, file skema Anda mungkin akan berada di dalam aplikasi CDK.  
Untuk menggunakan perubahan yang dibuat pada GraphQL API, Anda harus menerapkan ulang aplikasi.

------

## Menambahkan tipe ke skema
<a name="adding-schema-types"></a>

Sekarang Anda telah menambahkan skema Anda, Anda dapat mulai menambahkan jenis input dan output Anda. Perhatikan bahwa tipe di sini tidak boleh digunakan dalam kode nyata; mereka hanya contoh untuk membantu Anda memahami prosesnya.

Pertama, kita akan membuat tipe objek. Dalam kode nyata, Anda tidak harus memulai dengan jenis ini. Anda dapat membuat jenis apa pun yang Anda inginkan kapan saja selama Anda mengikuti aturan dan sintaks GraphQL.

**catatan**  
Beberapa bagian berikutnya akan menggunakan **editor skema**, jadi biarkan ini tetap terbuka.

------
#### [ Console ]
+ Anda dapat membuat tipe objek menggunakan `type` kata kunci bersama dengan nama tipe:

  ```
  type Type_Name_Goes_Here {}
  ```

  Di dalam cakupan tipe, Anda dapat menambahkan bidang yang mewakili karakteristik objek:

  ```
  type Type_Name_Goes_Here {
    # Add fields here
  }
  ```

  Inilah contohnya:

  ```
  type Obj_Type_1 {
    id: ID!
    title: String
    date: AWSDateTime
  }
  ```
**catatan**  
Pada langkah ini, kami menambahkan tipe objek generik dengan `id` bidang wajib disimpan sebagai`ID`, `title` bidang yang disimpan sebagai`String`, dan `date` bidang yang disimpan sebagai`AWSDateTime`. Untuk melihat daftar jenis dan bidang dan apa yang mereka lakukan, lihat [Skema](https://docs.aws.amazon.com//appsync/latest/devguide/schema-components.html). Untuk melihat daftar skalar dan apa yang mereka lakukan, lihat [referensi Type](https://docs.aws.amazon.com/appsync/latest/devguide/type-reference.html).

------
#### [ CLI ]

**catatan**  
Kami merekomendasikan membaca versi konsol terlebih dahulu jika Anda belum melakukannya.
+ Anda dapat membuat tipe objek dengan menjalankan [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/create-type.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/create-type.html)perintah.

  Anda harus memasukkan beberapa parameter untuk perintah khusus ini:

  1. API Anda. `api-id`

  1. Itu`definition`, atau konten tipe Anda. Dalam contoh konsol, ini adalah:

     ```
     type Obj_Type_1 {
       id: ID!
       title: String
       date: AWSDateTime
     }
     ```

  1. `format`Masukan Anda. Dalam contoh ini, kita menggunakan`SDL`.

  Contoh perintah mungkin terlihat seperti ini:

  ```
  aws appsync create-type --api-id abcdefghijklmnopqrstuvwxyz --definition "type Obj_Type_1{id: ID! title: String date: AWSDateTime}" --format SDL
  ```

  Output akan dikembalikan dalam CLI. Inilah contohnya:

  ```
  {
      "type": {
          "definition": "type Obj_Type_1{id: ID! title: String date: AWSDateTime}",
          "name": "Obj_Type_1",
          "arn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/types/Obj_Type_1",
          "format": "SDL"
      }
  }
  ```
**catatan**  
Pada langkah ini, kami menambahkan tipe objek generik dengan `id` bidang wajib disimpan sebagai`ID`, `title` bidang yang disimpan sebagai`String`, dan `date` bidang yang disimpan sebagai`AWSDateTime`. Untuk melihat daftar jenis dan bidang dan apa yang mereka lakukan, lihat [Skema](https://docs.aws.amazon.com//appsync/latest/devguide/schema-components.html). Untuk melihat daftar skalar dan apa yang mereka lakukan, lihat [Jenis referensi](https://docs.aws.amazon.com/appsync/latest/devguide/type-reference.html).  
Pada catatan lebih lanjut, Anda mungkin telah menyadari bahwa memasukkan definisi secara langsung berfungsi untuk tipe yang lebih kecil tetapi tidak layak untuk menambahkan jenis yang lebih besar atau lebih banyak. Anda dapat memilih untuk menambahkan semuanya dalam `.graphql` file dan kemudian [meneruskannya sebagai input](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-parameters-file.html).

------
#### [ CDK ]

**Tip**  
[Sebelum Anda menggunakan CDK, kami sarankan untuk meninjau [dokumentasi resmi](https://docs.aws.amazon.com/cdk/v2/guide/home.html) CDK bersama dengan referensi CDK AWS AppSync.](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync-readme.html)  
Langkah-langkah yang tercantum di bawah ini hanya akan menampilkan contoh umum dari cuplikan yang digunakan untuk menambahkan sumber daya tertentu. Ini **tidak** dimaksudkan untuk menjadi solusi yang berfungsi dalam kode produksi Anda. Kami juga menganggap Anda sudah memiliki aplikasi yang berfungsi.

Untuk menambahkan tipe, Anda perlu menambahkannya ke `.graphql` file Anda. Misalnya, contoh konsol adalah:

```
type Obj_Type_1 {
  id: ID!
  title: String
  date: AWSDateTime
}
```

Anda dapat menambahkan tipe Anda langsung ke skema seperti file lainnya.

**catatan**  
Untuk menggunakan perubahan yang dibuat pada GraphQL API, Anda harus menerapkan ulang aplikasi.

------

[Jenis objek](https://graphql.org/learn/schema/#object-types-and-fields) memiliki bidang yang merupakan [tipe skalar](https://graphql.org/learn/schema/#scalar-types) seperti string dan bilangan bulat. AWS AppSync juga memungkinkan Anda untuk menggunakan jenis skalar yang disempurnakan seperti `AWSDateTime` selain skalar GraphQL dasar. Juga, bidang apa pun yang berakhir dengan tanda seru diperlukan. 

Jenis `ID` skalar khususnya adalah pengidentifikasi unik yang dapat berupa atau`String`. `Int` Anda dapat mengontrol ini dalam kode resolver Anda untuk penugasan otomatis.

Ada kesamaan antara tipe objek khusus seperti `Query` dan tipe objek “biasa” seperti contoh di atas karena keduanya menggunakan `type` kata kunci dan dianggap objek. Namun, untuk tipe objek khusus (`Query`,`Mutation`, dan`Subscription`), perilakunya sangat berbeda karena diekspos sebagai titik masuk untuk API Anda. Mereka juga lebih tentang membentuk operasi daripada data. Untuk informasi selengkapnya, lihat [Jenis kueri dan mutasi](https://graphql.org/learn/schema/#the-query-and-mutation-types).

Pada topik jenis objek khusus, langkah selanjutnya bisa menambahkan satu atau lebih dari mereka untuk melakukan operasi pada data berbentuk. Dalam skenario nyata, setiap skema GraphQL setidaknya harus memiliki tipe kueri root untuk meminta data. Anda dapat menganggap kueri sebagai salah satu titik masuk (atau titik akhir) untuk server GraphQL Anda. Mari tambahkan kueri sebagai contoh.

------
#### [ Console ]
+ Untuk membuat kueri, Anda cukup menambahkannya ke file skema seperti jenis lainnya. Kueri akan membutuhkan `Query` tipe dan entri di root seperti ini:

  ```
  schema {
    query: Name_of_Query
  }
  
  type Name_of_Query {
    # Add field operation here
  }
  ```

  Perhatikan bahwa *Name\$1of\$1Query* dalam lingkungan produksi hanya akan dipanggil `Query` dalam banyak kasus. Kami merekomendasikan untuk menyimpannya pada nilai ini. Di dalam jenis kueri, Anda dapat menambahkan bidang. Setiap bidang akan melakukan operasi dalam permintaan. Akibatnya, sebagian besar, jika tidak semua, bidang ini akan dilampirkan ke resolver. Namun, kami tidak peduli dengan itu di bagian ini. Mengenai format operasi lapangan, mungkin terlihat seperti ini:

  ```
  Name_of_Query(params): Return_Type # version with params
  Name_of_Query: Return_Type # version without params
  ```

  Inilah contohnya:

  ```
  schema {
    query: Query
  }
  
  type Query {
    getObj: [Obj_Type_1]
  }
  
  type Obj_Type_1 {
    id: ID!
    title: String
    date: AWSDateTime
  }
  ```
**catatan**  
Pada langkah ini, kami menambahkan `Query` tipe dan mendefinisikannya di `schema` root kami. `Query`Tipe kami mendefinisikan `getObj` bidang yang mengembalikan daftar `Obj_Type_1` objek. Perhatikan bahwa itu `Obj_Type_1` adalah objek dari langkah sebelumnya. Dalam kode produksi, operasi lapangan Anda biasanya akan bekerja dengan data yang dibentuk oleh objek seperti`Obj_Type_1`. Selain itu, bidang seperti biasanya `getObj` akan memiliki resolver untuk melakukan logika bisnis. Itu akan dibahas di bagian yang berbeda.  
Sebagai catatan tambahan, AWS AppSync secara otomatis menambahkan root skema selama ekspor, jadi secara teknis Anda tidak perlu menambahkannya langsung ke skema. Layanan kami akan secara otomatis memproses skema duplikat. Kami menambahkannya di sini sebagai praktik terbaik.

------
#### [ CLI ]

**catatan**  
Kami merekomendasikan membaca versi konsol terlebih dahulu jika Anda belum melakukannya.

1. Buat `schema` root dengan `query` definisi dengan menjalankan [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/create-type.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/create-type.html)perintah.

   Anda harus memasukkan beberapa parameter untuk perintah khusus ini:

   1. API Anda. `api-id`

   1. Itu`definition`, atau konten tipe Anda. Dalam contoh konsol, ini adalah:

      ```
      schema {
        query: Query
      }
      ```

   1. `format`Masukan Anda. Dalam contoh ini, kita menggunakan`SDL`.

   Contoh perintah mungkin terlihat seperti ini:

   ```
   aws appsync create-type --api-id abcdefghijklmnopqrstuvwxyz --definition "schema {query: Query}" --format SDL
   ```

   Output akan dikembalikan dalam CLI. Inilah contohnya:

   ```
   {
       "type": {
           "definition": "schema {query: Query}",
           "name": "schema",
           "arn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/types/schema",
           "format": "SDL"
       }
   }
   ```
**catatan**  
Perhatikan bahwa jika Anda tidak memasukkan sesuatu dengan benar dalam `create-type` perintah, Anda dapat memperbarui root skema Anda (atau jenis apa pun dalam skema) dengan menjalankan perintah. [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/update-type.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/update-type.html) Dalam contoh ini, kita akan sementara mengubah root skema untuk berisi `subscription` definisi.  
Anda harus memasukkan beberapa parameter untuk perintah khusus ini:  
API Anda. `api-id`
Tipe Anda. `type-name` Dalam contoh konsol, ini adalah`schema`.
Itu`definition`, atau konten tipe Anda. Dalam contoh konsol, ini adalah:  

      ```
      schema {
        query: Query
      }
      ```
Skema setelah menambahkan `subscription` akan terlihat seperti ini:  

      ```
      schema {
        query: Query
        subscription: Subscription
      }
      ```
`format`Masukan Anda. Dalam contoh ini, kita menggunakan`SDL`.
Contoh perintah mungkin terlihat seperti ini:  

   ```
   aws appsync update-type --api-id abcdefghijklmnopqrstuvwxyz --type-name schema --definition "schema {query: Query subscription: Subscription}" --format SDL
   ```
Output akan dikembalikan dalam CLI. Inilah contohnya:  

   ```
   {
       "type": {
           "definition": "schema {query: Query subscription: Subscription}",
           "arn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/types/schema",
           "format": "SDL"
       }
   }
   ```
Menambahkan file yang telah diformat akan tetap berfungsi dalam contoh ini.

1. Buat `Query` tipe dengan menjalankan [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/create-type.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/create-type.html)perintah.

   Anda harus memasukkan beberapa parameter untuk perintah khusus ini:

   1. API Anda. `api-id`

   1. Itu`definition`, atau konten tipe Anda. Dalam contoh konsol, ini adalah:

      ```
      type Query {
        getObj: [Obj_Type_1]
      }
      ```

   1. `format`Masukan Anda. Dalam contoh ini, kita menggunakan`SDL`.

   Contoh perintah mungkin terlihat seperti ini:

   ```
   aws appsync create-type --api-id abcdefghijklmnopqrstuvwxyz --definition "type Query {getObj: [Obj_Type_1]}" --format SDL
   ```

   Output akan dikembalikan dalam CLI. Inilah contohnya:

   ```
   {
       "type": {
           "definition": "Query {getObj: [Obj_Type_1]}",
           "name": "Query",
           "arn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/types/Query",
           "format": "SDL"
       }
   }
   ```
**catatan**  
Pada langkah ini, kami menambahkan `Query` tipe dan mendefinisikannya di `schema` root Anda. `Query`Tipe kami mendefinisikan `getObj` bidang yang mengembalikan daftar `Obj_Type_1` objek.  
Dalam kode `schema` root`query: Query`, `query:` bagian menunjukkan bahwa kueri didefinisikan dalam skema Anda, sedangkan `Query` bagian tersebut menunjukkan nama objek khusus yang sebenarnya. 

------
#### [ CDK ]

**Tip**  
[Sebelum Anda menggunakan CDK, kami sarankan untuk meninjau [dokumentasi resmi](https://docs.aws.amazon.com/cdk/v2/guide/home.html) CDK bersama dengan referensi CDK AWS AppSync.](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync-readme.html)  
Langkah-langkah yang tercantum di bawah ini hanya akan menampilkan contoh umum dari cuplikan yang digunakan untuk menambahkan sumber daya tertentu. Ini **tidak** dimaksudkan untuk menjadi solusi yang berfungsi dalam kode produksi Anda. Kami juga menganggap Anda sudah memiliki aplikasi yang berfungsi.

Anda harus menambahkan kueri dan root skema ke `.graphql` file. Contoh kami terlihat seperti contoh di bawah ini, tetapi Anda ingin menggantinya dengan kode skema Anda yang sebenarnya:

```
schema {
  query: Query
}

type Query {
  getObj: [Obj_Type_1]
}

type Obj_Type_1 {
  id: ID!
  title: String
  date: AWSDateTime
}
```

Anda dapat menambahkan tipe Anda langsung ke skema seperti file lainnya.

**catatan**  
Memperbarui root skema adalah opsional. Kami menambahkannya ke contoh ini sebagai praktik terbaik.  
Untuk menggunakan perubahan yang dibuat pada GraphQL API, Anda harus menerapkan ulang aplikasi.

------

Anda sekarang telah melihat contoh membuat objek dan objek khusus (query). Anda juga telah melihat bagaimana ini dapat saling berhubungan untuk menggambarkan data dan operasi. Anda dapat memiliki skema hanya dengan deskripsi data dan satu atau lebih kueri. Namun, kami ingin menambahkan operasi lain untuk menambahkan data ke sumber data. Kami akan menambahkan jenis objek khusus lain `Mutation` yang disebut yang memodifikasi data.

------
#### [ Console ]
+ Mutasi akan disebut`Mutation`. Seperti`Query`, operasi lapangan di dalam `Mutation` akan menggambarkan operasi dan akan dilampirkan ke resolver. Juga, perhatikan bahwa kita perlu mendefinisikannya di `schema` root karena ini adalah jenis objek khusus. Berikut adalah contoh mutasi:

  ```
  schema {
    mutation: Name_of_Mutation
  }
  
  type Name_of_Mutation {
    # Add field operation here
  }
  ```

  Mutasi tipikal akan terdaftar di root seperti kueri. Mutasi didefinisikan menggunakan `type` kata kunci bersama dengan nama. *Name\$1of\$1Mutation*biasanya akan dipanggil`Mutation`, jadi kami sarankan untuk tetap seperti itu. Setiap bidang juga akan melakukan operasi. Mengenai format operasi lapangan, mungkin terlihat seperti ini:

  ```
  Name_of_Mutation(params): Return_Type # version with params
  Name_of_Mutation: Return_Type # version without params
  ```

  Inilah contohnya:

  ```
  schema {
    query: Query
    mutation: Mutation
  }
  
  type Obj_Type_1 {
    id: ID!
    title: String
    date: AWSDateTime
  }
  
  type Query {
    getObj: [Obj_Type_1]
  }
  
  type Mutation {
    addObj(id: ID!, title: String, date: AWSDateTime): Obj_Type_1
  }
  ```
**catatan**  
Pada langkah ini, kami menambahkan `Mutation` tipe dengan `addObj` bidang. Mari kita rangkum apa yang dilakukan bidang ini:  

  ```
  addObj(id: ID!, title: String, date: AWSDateTime): Obj_Type_1
  ```
`addObj`menggunakan `Obj_Type_1` objek untuk melakukan operasi. Ini jelas karena bidang, tetapi sintaks membuktikan ini dalam tipe `: Obj_Type_1` pengembalian. Di dalam`addObj`, itu menerima`id`,`title`, dan `date` bidang dari `Obj_Type_1` objek sebagai parameter. Seperti yang Anda lihat, ini sangat mirip dengan deklarasi metode. Namun, kami belum menjelaskan perilaku metode kami. Seperti yang dinyatakan sebelumnya, skema hanya ada untuk menentukan apa data dan operasi nantinya dan bukan bagaimana mereka beroperasi. Menerapkan logika bisnis yang sebenarnya akan datang kemudian ketika kita membuat resolver pertama kita.  
Setelah Anda selesai dengan skema Anda, ada opsi untuk mengekspornya sebagai `schema.graphql` file. Di **editor Skema**, Anda dapat memilih **skema Ekspor** untuk mengunduh file dalam format yang didukung.  
Sebagai catatan tambahan, AWS AppSync secara otomatis menambahkan root skema selama ekspor, jadi secara teknis Anda tidak perlu menambahkannya langsung ke skema. Layanan kami akan secara otomatis memproses skema duplikat. Kami menambahkannya di sini sebagai praktik terbaik.

------
#### [ CLI ]

**catatan**  
Kami merekomendasikan membaca versi konsol terlebih dahulu jika Anda belum melakukannya.

1. Perbarui skema root Anda dengan menjalankan [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/update-type.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/update-type.html)perintah.

   Anda harus memasukkan beberapa parameter untuk perintah khusus ini:

   1. API Anda. `api-id`

   1. Tipe Anda. `type-name` Dalam contoh konsol, ini adalah`schema`.

   1. Itu`definition`, atau konten tipe Anda. Dalam contoh konsol, ini adalah:

      ```
      schema {
        query: Query
        mutation: Mutation
      }
      ```

   1. `format`Masukan Anda. Dalam contoh ini, kita menggunakan`SDL`.

   Contoh perintah mungkin terlihat seperti ini:

   ```
   aws appsync update-type --api-id abcdefghijklmnopqrstuvwxyz --type-name schema --definition "schema {query: Query mutation: Mutation}" --format SDL
   ```

   Output akan dikembalikan dalam CLI. Inilah contohnya:

   ```
   {
       "type": {
           "definition": "schema {query: Query mutation: Mutation}",
           "arn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/types/schema",
           "format": "SDL"
       }
   }
   ```

1. Buat `Mutation` tipe dengan menjalankan [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/create-type.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/create-type.html)perintah.

   Anda harus memasukkan beberapa parameter untuk perintah khusus ini:

   1. API Anda. `api-id`

   1. Itu`definition`, atau konten tipe Anda. Dalam contoh konsol, ini adalah

      ```
      type Mutation {
        addObj(id: ID!, title: String, date: AWSDateTime): Obj_Type_1
      }
      ```

   1. `format`Masukan Anda. Dalam contoh ini, kita menggunakan`SDL`.

   Contoh perintah mungkin terlihat seperti ini:

   ```
   aws appsync create-type --api-id abcdefghijklmnopqrstuvwxyz --definition "type Mutation {addObj(id: ID! title: String date: AWSDateTime): Obj_Type_1}" --format SDL
   ```

   Output akan dikembalikan dalam CLI. Inilah contohnya:

   ```
   {
       "type": {
           "definition": "type Mutation {addObj(id: ID! title: String date: AWSDateTime): Obj_Type_1}",
           "name": "Mutation",
           "arn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/types/Mutation",
           "format": "SDL"
       }
   }
   ```

------
#### [ CDK ]

**Tip**  
[Sebelum Anda menggunakan CDK, kami sarankan untuk meninjau [dokumentasi resmi](https://docs.aws.amazon.com/cdk/v2/guide/home.html) CDK bersama dengan referensi CDK AWS AppSync.](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync-readme.html)  
Langkah-langkah yang tercantum di bawah ini hanya akan menampilkan contoh umum dari cuplikan yang digunakan untuk menambahkan sumber daya tertentu. Ini **tidak** dimaksudkan untuk menjadi solusi yang berfungsi dalam kode produksi Anda. Kami juga menganggap Anda sudah memiliki aplikasi yang berfungsi.

Anda harus menambahkan kueri dan root skema ke `.graphql` file. Contoh kami terlihat seperti contoh di bawah ini, tetapi Anda ingin menggantinya dengan kode skema Anda yang sebenarnya:

```
schema {
  query: Query
  mutation: Mutation
}

type Obj_Type_1 {
  id: ID!
  title: String
  date: AWSDateTime
}

type Query {
  getObj: [Obj_Type_1]
}

type Mutation {
  addObj(id: ID!, title: String, date: AWSDateTime): Obj_Type_1
}
```

**catatan**  
Memperbarui root skema adalah opsional. Kami menambahkannya ke contoh ini sebagai praktik terbaik.  
Untuk menggunakan perubahan yang dibuat pada GraphQL API, Anda harus menerapkan ulang aplikasi.

------

## Pertimbangan opsional - Menggunakan enum sebagai status
<a name="optional-consideration-enums"></a>

Pada titik ini, Anda tahu cara membuat skema dasar. Namun, ada banyak hal yang dapat Anda tambahkan untuk meningkatkan fungsionalitas skema. Satu hal umum yang ditemukan dalam aplikasi adalah penggunaan enum sebagai status. Anda dapat menggunakan enum untuk memaksa nilai tertentu dari sekumpulan nilai yang akan dipilih saat dipanggil. Ini bagus untuk hal-hal yang Anda tahu tidak akan berubah secara drastis dalam jangka waktu yang lama. Secara hipotetis, kita dapat menambahkan enum yang mengembalikan kode status atau String dalam respons. 

Sebagai contoh, mari kita asumsikan kita membuat aplikasi media sosial yang menyimpan data posting pengguna di backend. Skema kami berisi `Post` jenis yang mewakili data posting individu:

```
type Post {
  id: ID!
  title: String
  date: AWSDateTime
  poststatus: PostStatus
}
```

`Post`Will kami berisi postingan `title` unik`id`, posting, dan enum `PostStatus` yang disebut yang mewakili status posting saat diproses oleh aplikasi. `date` Untuk operasi kami, kami akan memiliki kueri yang mengembalikan semua data posting:

```
type Query {
  getPosts: [Post]
}
```

Kami juga akan memiliki mutasi yang menambahkan posting ke sumber data:

```
type Mutation {
  addPost(id: ID!, title: String, date: AWSDateTime, poststatus: PostStatus): Post
}
```

Melihat skema kami, `PostStatus` enum bisa memiliki beberapa status. Kita mungkin ingin tiga status dasar dipanggil `success` (post berhasil diproses), `pending` (post sedang diproses), dan `error` (post tidak dapat diproses). Untuk menambahkan enum, kita bisa melakukan ini:

```
enum PostStatus {
  success
  pending
  error
}
```

Skema lengkap mungkin terlihat seperti ini:

```
schema {
  query: Query
  mutation: Mutation
}

type Post {
  id: ID!
  title: String
  date: AWSDateTime
  poststatus: PostStatus
}

type Mutation {
  addPost(id: ID!, title: String, date: AWSDateTime, poststatus: PostStatus): Post
}

type Query {
  getPosts: [Post]
}

enum PostStatus {  
  success
  pending
  error
}
```

Jika pengguna menambahkan a `Post` dalam aplikasi, `addPost` operasi akan dipanggil untuk memproses data tersebut. Sebagai resolver dilampirkan untuk `addPost` memproses data, itu akan terus memperbarui `poststatus` dengan status operasi. Saat ditanyakan, `Post` akan berisi status akhir data. Perlu diingat, kami hanya menjelaskan bagaimana kami ingin data bekerja dalam skema. Kami mengasumsikan banyak tentang implementasi resolver kami, yang akan menerapkan logika bisnis aktual untuk menangani data guna memenuhi permintaan.

## Pertimbangan opsional - Langganan
<a name="optional-consideration-subscriptions"></a>

Langganan di AWS AppSync dipanggil sebagai respons terhadap mutasi. Anda mengonfigurasi ini dengan `Subscription` tipe dan `@aws_subscribe()` arahan dalam skema untuk menunjukkan mutasi mana yang memanggil satu atau beberapa langganan. Untuk informasi selengkapnya tentang mengonfigurasi langganan, lihat Data [waktu nyata](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-real-time-data.html).

## Pertimbangan opsional - Hubungan dan pagination
<a name="optional-consideration-relations-and-pagination"></a>

Misalkan Anda memiliki satu juta `Posts` disimpan dalam tabel DynamoDB, dan Anda ingin mengembalikan beberapa data itu. Namun, contoh query yang diberikan di atas hanya mengembalikan semua posting. Anda tidak ingin mengambil semua ini setiap kali Anda membuat permintaan. Sebaliknya, Anda ingin membuat [paginasi](https://graphql.org/learn/pagination/) melalui mereka. Buat perubahan berikut pada skema Anda:
+ Di `getPosts` lapangan, tambahkan dua argumen masukan: `nextToken` (iterator) dan `limit` (batas iterasi).
+ Tambahkan `PostIterator` tipe baru yang berisi `Posts` (mengambil daftar `Post` objek) dan `nextToken` (iterator) bidang.
+ Ubah `getPosts` sehingga kembali `PostIterator` dan bukan daftar `Post` objek.

```
schema {
  query: Query
  mutation: Mutation
}

type Post {
  id: ID!
  title: String
  date: AWSDateTime
  poststatus: PostStatus
}

type Mutation {
  addPost(id: ID!, title: String, date: AWSDateTime, poststatus: PostStatus): Post
}

type Query {
  getPosts(limit: Int, nextToken: String): PostIterator
}

enum PostStatus {
  success
  pending
  error
}

type PostIterator {
  posts: [Post]
  nextToken: String
}
```

`PostIterator`Jenis ini memungkinkan Anda untuk mengembalikan sebagian dari daftar `Post` objek dan `nextToken` untuk mendapatkan bagian berikutnya. Di dalamnya`PostIterator`, ada daftar `Post` item (`[Post]`) yang dikembalikan dengan token pagination (`nextToken`). Pada tahun AWS AppSync, ini akan terhubung ke Amazon DynamoDB melalui resolver dan secara otomatis dihasilkan sebagai token terenkripsi. Ini mengubah nilai `limit` argumen ke `maxResults` parameter dan `nextToken` argumen ke `exclusiveStartKey` parameter. Untuk contoh dan contoh templat bawaan di AWS AppSync konsol, lihat [Referensi resolusi () JavaScript](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html).

# Melampirkan sumber data di AWS AppSync
<a name="attaching-a-data-source"></a>

Sumber data adalah sumber daya di AWS akun Anda yang dapat berinteraksi dengan APIs GraphQL. AWS AppSync mendukung banyak sumber data seperti AWS Lambda, Amazon DynamoDB, database relasional (Amazon Aurora Tanpa Server), Layanan Amazon, dan titik akhir HTTP. OpenSearch AWS AppSync API dapat dikonfigurasi untuk berinteraksi dengan beberapa sumber data, memungkinkan Anda untuk mengumpulkan data di satu lokasi. AWS AppSync dapat menggunakan AWS sumber daya yang ada dari akun Anda atau menyediakan tabel DynamoDB atas nama Anda dari definisi skema.

Bagian berikut akan menunjukkan cara melampirkan sumber data ke GraphQL API Anda.

## Jenis sumber data
<a name="data-source-types"></a>

Sekarang setelah Anda membuat skema di AWS AppSync konsol, Anda dapat melampirkan sumber data ke dalamnya. Saat Anda pertama kali membuat API, ada opsi untuk menyediakan tabel Amazon DynamoDB selama pembuatan skema yang telah ditentukan. Namun, kami tidak akan membahas opsi itu di bagian ini. Anda dapat melihat contoh ini di bagian [Meluncurkan skema](https://docs.aws.amazon.com//appsync/latest/devguide/schema-launch-start.html).

Sebagai gantinya, kita akan melihat semua sumber data yang AWS AppSync mendukung. Ada banyak faktor yang masuk ke dalam memilih solusi yang tepat untuk aplikasi Anda. Bagian di bawah ini akan memberikan beberapa konteks tambahan untuk setiap sumber data. Untuk informasi umum tentang sumber data, lihat [Sumber data](https://docs.aws.amazon.com/appsync/latest/devguide/data-source-components.html).

### Amazon DynamoDB
<a name="data-source-type-ddb"></a>

Amazon DynamoDB adalah salah satu 'solusi penyimpanan utama AWS untuk aplikasi yang dapat diskalakan. **Komponen inti dari DynamoDB adalah tabel, yang hanya merupakan kumpulan data.** Anda biasanya akan membuat tabel berdasarkan entitas seperti `Book` atau`Author`. Informasi entri tabel disimpan sebagai **item**, yang merupakan kelompok bidang yang unik untuk setiap entri. Item lengkap mewakili a row/record dalam database. Misalnya, item untuk `Book` entri mungkin termasuk `title` dan `author` bersama dengan nilainya. Bidang individu seperti `title` dan `author` disebut **atribut**, yang mirip dengan nilai kolom dalam database relasional. 

Seperti yang bisa Anda tebak, tabel akan digunakan untuk menyimpan data dari aplikasi Anda. AWS AppSync memungkinkan Anda untuk menghubungkan tabel DynamoDB Anda ke GraphQL API Anda untuk memanipulasi data. Ambil [kasus penggunaan](https://aws.amazon.com/blogs/mobile/new-real-time-multi-group-app-with-aws-amplify-graphql-build-a-twitter-community-clone/) ini dari *web Front-end dan blog seluler*. Aplikasi ini memungkinkan pengguna mendaftar untuk aplikasi media sosial. Pengguna dapat bergabung dengan grup dan mengunggah posting yang disiarkan ke pengguna lain yang berlangganan grup. Aplikasi mereka menyimpan informasi pengguna, posting, dan grup pengguna di DynamoDB. GraphQL API (dikelola AWS AppSync oleh) berinteraksi dengan tabel DynamoDB. Ketika pengguna membuat perubahan dalam sistem yang akan tercermin di front-end, GraphQL API mengambil perubahan ini dan menyiarkannya ke pengguna lain secara real time.

### AWS Lambda
<a name="data-source-type-lam"></a>

Lambda adalah layanan berbasis peristiwa yang secara otomatis membangun sumber daya yang diperlukan untuk menjalankan kode sebagai respons terhadap suatu peristiwa. Lambda menggunakan **fungsi**, yang merupakan pernyataan grup yang berisi kode, dependensi, dan konfigurasi untuk mengeksekusi sumber daya. Fungsi dijalankan secara otomatis ketika mereka mendeteksi **pemicu**, sekelompok aktivitas yang memanggil fungsi Anda. Pemicu bisa berupa apa saja seperti aplikasi yang melakukan panggilan API, AWS layanan di akun Anda yang memutar sumber daya, dll. Ketika dipicu, fungsi akan memproses **peristiwa**, yang merupakan dokumen JSON yang berisi data untuk dimodifikasi.

Lambda bagus untuk menjalankan kode tanpa harus menyediakan sumber daya untuk menjalankannya. Ambil [kasus penggunaan](https://aws.amazon.com/blogs/mobile/building-a-graphql-api-with-java-and-aws-lambda/) ini dari *web Front-end dan blog seluler*. Kasus penggunaan ini sedikit mirip dengan yang dipamerkan di bagian DynamoDB. Dalam aplikasi ini, GraphQL API bertanggung jawab untuk mendefinisikan operasi untuk hal-hal seperti menambahkan posting (mutasi) dan mengambil data itu (kueri). Untuk mengimplementasikan fungsionalitas operasi mereka (misalnya,`getPost ( id: String ! ) : Post`,`getPostsByAuthor ( author: String ! ) : [ Post ]`), mereka menggunakan fungsi Lambda untuk memproses permintaan masuk. Di bawah *Opsi 2: AWS AppSync dengan Lambda resolver*, mereka menggunakan AWS AppSync layanan untuk mempertahankan skema mereka dan menautkan sumber data Lambda ke salah satu operasi. Ketika operasi dipanggil, Lambda berinteraksi dengan proxy Amazon RDS untuk melakukan logika bisnis pada database.

### Amazon RDS
<a name="data-source-type-RDS"></a>

Amazon RDS memungkinkan Anda membangun dan mengonfigurasi database relasional dengan cepat. Di Amazon RDS, Anda akan membuat **instance database** generik yang akan berfungsi sebagai lingkungan database terisolasi di cloud. Dalam hal ini, Anda akan menggunakan **mesin DB**, yang merupakan perangkat lunak RDBMS yang sebenarnya (PostgreSQL, MySQL, dll.). Layanan ini membongkar sebagian besar pekerjaan backend dengan menyediakan skalabilitas menggunakan AWS'infrastruktur, layanan keamanan seperti patching dan enkripsi, dan menurunkan biaya administrasi untuk penerapan.

Ambil [kasus penggunaan](https://aws.amazon.com/blogs/mobile/building-a-graphql-api-with-java-and-aws-lambda/) yang sama dari bagian Lambda. Di bawah *Opsi 3: AWS AppSync dengan Amazon RDS resolver*, opsi lain yang disajikan adalah menautkan GraphQL API ke Amazon RDS secara langsung. AWS AppSync Menggunakan [API data](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/data-api.html), mereka mengaitkan database dengan GraphQL API. Resolver dilampirkan ke bidang (biasanya kueri, mutasi, atau langganan) dan mengimplementasikan pernyataan SQL yang diperlukan untuk mengakses database. Ketika permintaan memanggil bidang dibuat oleh klien, resolver mengeksekusi pernyataan dan mengembalikan respon.

### Amazon EventBridge
<a name="data-source-type-eventbridge"></a>

Di EventBridge, Anda akan membuat **bus acara**, yang merupakan saluran pipa yang menerima acara dari layanan atau aplikasi yang Anda lampirkan (**sumber acara**) dan memprosesnya berdasarkan seperangkat aturan. **Peristiwa** adalah beberapa perubahan status dalam lingkungan eksekusi, sedangkan **aturan** adalah seperangkat filter untuk acara. Aturan mengikuti **pola peristiwa**, atau metadata perubahan status peristiwa (id, Wilayah, nomor akun, ARN, dll.). Ketika suatu peristiwa cocok dengan pola acara, EventBridge akan mengirim acara melintasi pipeline ke layanan tujuan (**target**) dan memicu tindakan yang ditentukan dalam aturan.

EventBridge baik untuk merutekan operasi yang mengubah status ke beberapa layanan lain. Ambil [kasus penggunaan](https://aws.amazon.com/blogs/mobile/appsync-eventbridge/) ini dari *web Front-end dan blog seluler*. Contoh ini menggambarkan solusi e-commerce yang memiliki beberapa tim yang mempertahankan layanan yang berbeda. Salah satu layanan ini menyediakan pembaruan pesanan kepada pelanggan pada setiap langkah pengiriman (pesanan ditempatkan, sedang berlangsung, dikirim, dikirim, dll.) Di front-end. Namun, tim front-end yang mengelola layanan ini tidak memiliki akses langsung ke data sistem pemesanan seperti yang dikelola oleh tim backend terpisah. Sistem pemesanan tim backend juga digambarkan sebagai kotak hitam, sehingga sulit untuk mengumpulkan informasi tentang cara mereka menyusun data mereka. Namun, tim backend memang menyiapkan sistem yang menerbitkan data pesanan melalui bus acara yang dikelola oleh. EventBridge Untuk mengakses data yang berasal dari bus acara dan mengarahkannya ke front-end, tim front-end membuat target baru yang menunjuk ke GraphQL API mereka. AWS AppSync Mereka juga membuat aturan untuk hanya mengirim data yang relevan dengan pembaruan pesanan. Saat pembaruan dibuat, data dari bus acara dikirim ke GraphQL API. Skema dalam API memproses data, lalu meneruskannya ke front-end.

### Tidak ada sumber data
<a name="data-source-type-none"></a>

Jika Anda tidak berencana menggunakan sumber data, Anda dapat mengaturnya`none`. Sumber `none` data, meskipun masih secara eksplisit dikategorikan sebagai sumber data, bukanlah media penyimpanan. Biasanya, resolver akan memanggil satu atau lebih sumber data di beberapa titik untuk memproses permintaan. Namun, ada situasi di mana Anda mungkin tidak perlu memanipulasi sumber data. Menyetel sumber data ke `none` akan menjalankan permintaan, lewati langkah pemanggilan data, lalu jalankan respons.

Ambil [kasus penggunaan](https://aws.amazon.com/blogs/mobile/appsync-eventbridge/) yang sama dari EventBridge bagian. Dalam skema, mutasi memproses pembaruan status, lalu mengirimkannya ke pelanggan. Mengingat cara kerja resolver, biasanya ada setidaknya satu pemanggilan sumber data. Namun, data dalam skenario ini sudah dikirim secara otomatis oleh bus acara. Ini berarti mutasi tidak perlu melakukan pemanggilan sumber data; status pesanan dapat ditangani secara lokal. Mutasi diatur ke`none`, yang bertindak sebagai nilai pass-through tanpa pemanggilan sumber data. Skema tersebut kemudian diisi dengan data, yang dikirim ke pelanggan.

### OpenSearch
<a name="data-source-type-opensearch"></a>

Amazon OpenSearch Service adalah seperangkat alat untuk menerapkan pencarian teks lengkap, visualisasi data, dan logging. Anda dapat menggunakan layanan ini untuk menanyakan data terstruktur yang telah Anda unggah.

Dalam layanan ini, Anda akan membuat contoh. OpenSearch Ini disebut **node**. Dalam sebuah node, Anda akan menambahkan setidaknya satu **indeks**. Indeks secara konseptual sedikit mirip tabel dalam database relasional. (Namun, OpenSearch tidak sesuai dengan ACID, jadi tidak boleh digunakan seperti itu). Anda akan mengisi indeks Anda dengan data yang Anda unggah ke OpenSearch layanan. Ketika data Anda diunggah, itu akan diindeks dalam satu atau lebih pecahan yang ada di indeks. **Shard** seperti partisi indeks Anda yang berisi beberapa data Anda dan dapat ditanyakan secara terpisah dari pecahan lainnya. **Setelah diunggah, data Anda akan terstruktur sebagai file JSON yang disebut dokumen.** Anda kemudian dapat menanyakan node untuk data dalam dokumen.

### Titik akhir HTTP
<a name="data-source-type-http"></a>

Anda dapat menggunakan titik akhir HTTP sebagai sumber data. AWS AppSync dapat mengirim permintaan ke titik akhir dengan informasi yang relevan seperti params dan payload. Respons HTTP akan diekspos ke resolver, yang akan mengembalikan respons akhir setelah selesai operasinya.

## Menambahkan sumber data
<a name="adding-a-data-source"></a>

Jika Anda membuat sumber data, Anda dapat menautkannya ke AWS AppSync layanan dan, lebih khusus lagi, API.

------
#### [ Console ]

1. Masuk ke Konsol Manajemen AWS dan buka [AppSynckonsol](https://console.aws.amazon.com/appsync/).

   1. Pilih API Anda di **Dasbor**.

   1. Di **Sidebar**, pilih **Sumber Data**.

1. Pilih **Buat sumber data**.

   1. Beri nama sumber data Anda. Anda juga dapat memberikan deskripsi, tetapi itu opsional.

   1. Pilih **tipe sumber data** Anda.

   1. Untuk DynamoDB, Anda harus memilih Region Anda, lalu tabel di Region. Anda dapat mendikte aturan interaksi dengan tabel Anda dengan memilih untuk membuat peran tabel generik baru atau mengimpor peran yang ada untuk tabel. Anda dapat mengaktifkan [pembuatan versi](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html), yang secara otomatis dapat membuat versi data untuk setiap permintaan saat beberapa klien mencoba memperbarui data secara bersamaan. Versioning digunakan untuk menyimpan dan memelihara beberapa varian data untuk tujuan deteksi dan resolusi konflik. Anda juga dapat mengaktifkan pembuatan skema otomatis, yang mengambil sumber data Anda dan menghasilkan beberapa CRUD,`List`, dan `Query` operasi yang diperlukan untuk mengaksesnya dalam skema Anda. 

      Untuk OpenSearch, Anda harus memilih Region Anda, lalu domain (cluster) di Region. Anda dapat mendikte aturan interaksi dengan domain Anda dengan memilih untuk membuat peran tabel generik baru atau mengimpor peran yang ada untuk tabel. 

      Untuk Lambda, Anda harus memilih Wilayah Anda, lalu ARN dari fungsi Lambda di Wilayah. Anda dapat mendikte aturan interaksi dengan fungsi Lambda Anda dengan memilih untuk membuat peran tabel generik baru atau mengimpor peran yang ada untuk tabel. 

      Untuk HTTP, Anda harus memasukkan titik akhir HTTP Anda.

      Untuk EventBridge, Anda harus memilih Wilayah Anda, lalu bus acara di Wilayah. Anda dapat mendikte aturan interaksi dengan bus acara Anda dengan memilih untuk membuat peran tabel generik baru atau mengimpor peran yang ada untuk tabel. 

      Untuk RDS, Anda harus memilih Wilayah Anda, lalu toko rahasia (nama pengguna dan kata sandi), nama database, dan skema.

      Untuk tidak ada, Anda akan menambahkan sumber data tanpa sumber data aktual. Ini untuk menangani resolver secara lokal daripada melalui sumber data aktual.
**catatan**  
Jika Anda mengimpor peran yang ada, mereka memerlukan kebijakan kepercayaan. Untuk informasi selengkapnya, lihat [kebijakan kepercayaan IAM](#iam-trust-policy.title).

1. Pilih **Buat**.
**catatan**  
**Atau, jika Anda membuat sumber data DynamoDB, Anda dapat pergi ke halaman Skema di konsol, **pilih Buat** Sumber Daya di bagian atas halaman, lalu isi model yang telah ditentukan untuk dikonversi menjadi tabel.** Dalam opsi ini, Anda akan mengisi atau mengimpor tipe dasar, mengkonfigurasi data tabel dasar termasuk kunci partisi, dan meninjau perubahan skema.

------
#### [ CLI ]
+ Buat sumber data Anda dengan menjalankan [https://docs.aws.amazon.com/cli/latest/reference/appsync/create-data-source.html](https://docs.aws.amazon.com/cli/latest/reference/appsync/create-data-source.html)perintah.

  Anda harus memasukkan beberapa parameter untuk perintah khusus ini:

  1. API Anda. `api-id`

  1. Meja Anda. `name`

  1. `type`Sumber data. Bergantung pada jenis sumber data yang Anda pilih, Anda mungkin perlu memasukkan `service-role-arn` dan `-config` tag.

  Contoh perintah mungkin terlihat seperti ini:

  ```
   aws appsync create-data-source --api-id abcdefghijklmnopqrstuvwxyz --name data_source_name --type data_source_type --service-role-arn arn:aws:iam::107289374856:role/role_name --[data_source_type]-config {params}
  ```

------
#### [ CDK ]

**Tip**  
[Sebelum Anda menggunakan CDK, kami sarankan untuk meninjau [dokumentasi resmi](https://docs.aws.amazon.com/cdk/v2/guide/home.html) CDK bersama dengan referensi CDK AWS AppSync.](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync-readme.html)  
Langkah-langkah yang tercantum di bawah ini hanya akan menampilkan contoh umum dari cuplikan yang digunakan untuk menambahkan sumber daya tertentu. Ini **tidak** dimaksudkan untuk menjadi solusi yang berfungsi dalam kode produksi Anda. Kami juga menganggap Anda sudah memiliki aplikasi yang berfungsi.

Untuk menambahkan sumber data khusus Anda, Anda harus menambahkan konstruksi ke file tumpukan Anda. Daftar tipe sumber data dapat ditemukan di sini:
+  [ DynamoDbDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.DynamoDbDataSource.html) 
+  [ EventBridgeDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.EventBridgeDataSource.html) 
+  [ HttpDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.HttpDataSource.html) 
+  [ LambdaDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.LambdaDataSource.html) 
+  [ NoneDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.NoneDataSource.html) 
+  [ OpenSearchDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.OpenSearchDataSource.html) 
+  [ RdsDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.RdsDataSource.html) 

1. Secara umum, Anda mungkin harus menambahkan direktif impor ke layanan yang Anda gunakan. Misalnya, mungkin mengikuti formulir:

   ```
   import * as x from 'x'; # import wildcard as the 'x' keyword from 'x-service'
   import {a, b, ...} from 'c'; # import {specific constructs} from 'c-service'
   ```

   Misalnya, inilah cara Anda dapat mengimpor layanan DynamoDB AWS AppSync dan DynamoDB:

   ```
   import * as appsync from 'aws-cdk-lib/aws-appsync';
   import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
   ```

1. Beberapa layanan seperti RDS memerlukan beberapa pengaturan tambahan dalam file tumpukan sebelum membuat sumber data (misalnya, pembuatan VPC, peran, dan kredenal akses). Lihat contoh di halaman CDK yang relevan untuk informasi lebih lanjut.

1. Untuk sebagian besar sumber data, terutama AWS layanan, Anda akan membuat instance baru dari sumber data di file tumpukan Anda. Biasanya, ini akan terlihat seperti berikut:

   ```
   const add_data_source_func = new service_scope.resource_name(scope: Construct, id: string, props: data_source_props);
   ```

   Misalnya, berikut adalah contoh tabel Amazon DynamoDB:

   ```
   const add_ddb_table = new dynamodb.Table(this, 'Table_ID', {
     partitionKey: {
       name: 'id',
       type: dynamodb.AttributeType.STRING,
     },
     sortKey: {
       name: 'id',
       type: dynamodb.AttributeType.STRING,
     },
     tableClass: dynamodb.TableClass.STANDARD,
   });
   ```
**catatan**  
Sebagian besar sumber data akan memiliki setidaknya satu prop yang diperlukan (akan dilambangkan **tanpa** simbol). `?` Konsultasikan dokumentasi CDK untuk melihat alat peraga mana yang diperlukan.

1. Selanjutnya, Anda perlu menautkan sumber data ke GraphQL API. Metode yang disarankan adalah menambahkannya saat Anda membuat fungsi untuk penyelesai pipa Anda. Misalnya, cuplikan di bawah ini adalah fungsi yang memindai semua elemen dalam tabel DynamoDB:

   ```
   const add_func = new appsync.AppsyncFunction(this, 'func_ID', {
     name: 'func_name_in_console',
     add_api,
     dataSource: add_api.addDynamoDbDataSource('data_source_name_in_console', add_ddb_table),
     code: appsync.Code.fromInline(`
         export function request(ctx) {
           return { operation: 'Scan' };
         }
   
         export function response(ctx) {
           return ctx.result.items;
         }
     `),
     runtime: appsync.FunctionRuntime.JS_1_0_0,
   });
   ```

   Di `dataSource` props, Anda dapat memanggil GraphQL API `add_api` () dan menggunakan salah satu metode bawaannya `addDynamoDbDataSource` () untuk membuat asosiasi antara tabel dan GraphQL API. Argumen adalah nama tautan ini yang akan ada di AWS AppSync konsol (`data_source_name_in_console`dalam contoh ini) dan metode tabel (`add_ddb_table`). Lebih lanjut tentang topik ini akan terungkap di bagian selanjutnya ketika Anda mulai membuat resolver.

   Ada metode alternatif untuk menghubungkan sumber data. Anda secara teknis dapat menambahkan `api` ke daftar alat peraga dalam fungsi tabel. Misalnya, inilah cuplikan dari langkah 3 tetapi dengan alat `api` peraga yang berisi GraphQL API:

   ```
   const add_api = new appsync.GraphqlApi(this, 'API_ID', {
     ...
   });
   
   const add_ddb_table = new dynamodb.Table(this, 'Table_ID', {
   
    ...
   
     api: add_api
   });
   ```

   Atau, Anda dapat memanggil `GraphqlApi` konstruksi secara terpisah:

   ```
   const add_api = new appsync.GraphqlApi(this, 'API_ID', {
     ...
   });
   
   const add_ddb_table = new dynamodb.Table(this, 'Table_ID', {
     ...
   });
   
   const link_data_source = add_api.addDynamoDbDataSource('data_source_name_in_console', add_ddb_table);
   ```

   Kami merekomendasikan hanya membuat asosiasi di alat peraga fungsi. Jika tidak, Anda harus menautkan fungsi resolver Anda ke sumber data secara manual di AWS AppSync konsol (jika Anda ingin tetap menggunakan nilai konsol`data_source_name_in_console`) atau membuat asosiasi terpisah dalam fungsi dengan nama lain seperti. `data_source_name_in_console_2` Ini karena keterbatasan dalam cara alat peraga memproses informasi.
**catatan**  
Anda harus menerapkan ulang aplikasi untuk melihat perubahan Anda.

------

### Kebijakan kepercayaan IAM
<a name="iam-trust-policy"></a>

Jika Anda menggunakan peran IAM yang ada untuk sumber data Anda, Anda harus memberikan peran tersebut izin yang sesuai untuk melakukan operasi pada AWS sumber daya Anda, seperti `PutItem` pada tabel Amazon DynamoDB. Anda juga perlu mengubah kebijakan kepercayaan pada peran tersebut agar dapat menggunakannya AWS AppSync untuk akses sumber daya seperti yang ditunjukkan dalam contoh kebijakan berikut:

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
        "Effect": "Allow",
        "Principal": {
            "Service": "appsync.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
        }
    ]
}
```

------

Anda juga dapat menambahkan ketentuan ke kebijakan kepercayaan Anda untuk membatasi akses ke sumber data sesuai keinginan. Saat ini, `SourceArn` dan `SourceAccount` kunci dapat digunakan dalam kondisi ini. Misalnya, kebijakan berikut membatasi akses ke sumber data Anda ke akun`123456789012`:

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "appsync.amazonaws.com"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "123456789012"
        }
      }
    }
  ]
}
```

------

Atau, Anda dapat membatasi akses ke sumber data ke API tertentu, seperti`abcdefghijklmnopq`, menggunakan kebijakan berikut:

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "appsync.amazonaws.com"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "ArnEquals": {
          "aws:SourceArn": "arn:aws:appsync:us-west-2:123456789012:apis/abcdefghijklmnopq"
        }
      }
    }
  ]
}
```

------

Anda dapat membatasi akses ke semua AWS AppSync APIs dari wilayah tertentu, seperti`us-east-1`, menggunakan kebijakan berikut:

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "appsync.amazonaws.com"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "ArnEquals": {
          "aws:SourceArn": "arn:aws:appsync:us-east-1:123456789012:apis/*"
        }
      }
    }
  ]
}
```

------

Pada bagian berikutnya ([Configuring Resolvers](https://docs.aws.amazon.com//appsync/latest/devguide/resolver-config-overview.html)), kami akan menambahkan logika bisnis resolver kami dan melampirkannya ke bidang dalam skema kami untuk memproses data di sumber data kami.

Untuk informasi selengkapnya mengenai konfigurasi kebijakan peran, lihat [Memodifikasi peran](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_manage_modify.html) dalam *Panduan Pengguna IAM*.

Untuk informasi selengkapnya mengenai akses resolver lintas akun AWS AppSync, lihat [Membangun AWS Lambda resolver lintas AWS Lambda](https://aws.amazon.com/blogs/mobile/appsync-lambda-cross-account/) akun untuk. AWS AppSync

# Mengkonfigurasi resolver di AWS AppSync
<a name="resolver-config-overview"></a>

Di bagian sebelumnya, Anda mempelajari cara membuat skema GraphQL dan sumber data, lalu menghubungkannya bersama dalam layanan. AWS AppSync Dalam skema Anda, Anda mungkin telah menetapkan satu atau beberapa bidang (operasi) dalam kueri dan mutasi Anda. Sementara skema menggambarkan jenis data yang akan diminta operasi dari sumber data, skema tersebut tidak pernah menerapkan bagaimana operasi tersebut akan berperilaku di sekitar data. 

Perilaku operasi selalu diimplementasikan dalam resolver, yang akan dikaitkan dengan bidang yang melakukan operasi. Untuk informasi selengkapnya tentang cara kerja resolver secara umum, lihat halaman [Resolver](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-components.html).

Di AWS AppSync, resolver Anda terkait dengan runtime, yang merupakan lingkungan di mana resolver Anda mengeksekusi. Runtime mendikte bahasa tempat resolver Anda akan ditulis. Saat ini ada dua runtime yang didukung: APPSYNC\$1JS (JavaScript) dan Apache Velocity Template Language (VTL). 

Saat menerapkan resolver, ada struktur umum yang mereka ikuti:
+ **Sebelum langkah**: Ketika permintaan dibuat oleh klien, resolver untuk bidang skema yang digunakan (biasanya kueri, mutasi, langganan Anda) diteruskan data permintaan. Penyelesai akan mulai memproses data permintaan dengan penangan langkah sebelum, yang memungkinkan beberapa operasi pra-pemrosesan dilakukan sebelum data bergerak melalui resolver.
+ **Fungsi**: Setelah langkah sebelum berjalan, permintaan diteruskan ke daftar fungsi. Fungsi pertama dalam daftar akan dijalankan terhadap sumber data. Fungsi adalah subset dari kode resolver Anda yang berisi permintaan dan penangan responsnya sendiri. Handler permintaan akan mengambil data permintaan dan melakukan operasi terhadap sumber data. Response handler akan memproses respon sumber data sebelum meneruskannya kembali ke daftar. Jika ada lebih dari satu fungsi, data permintaan akan dikirim ke fungsi berikutnya dalam daftar yang akan dieksekusi. Fungsi dalam daftar akan dijalankan secara serial dalam urutan yang ditentukan oleh pengembang. Setelah semua fungsi dieksekusi, hasil akhir diteruskan ke langkah setelahnya.
+ **Langkah setelah: Langkah** setelah adalah fungsi handler yang memungkinkan Anda melakukan beberapa operasi akhir pada respons fungsi akhir sebelum meneruskannya ke respons GraphQL.

Aliran ini adalah contoh dari resolver pipa. Resolver pipeline didukung di kedua runtime. Namun, ini adalah penjelasan yang disederhanakan tentang apa yang dapat dilakukan oleh penyelesai pipa. Juga, kami hanya menjelaskan satu konfigurasi resolver yang mungkin. [Untuk informasi selengkapnya tentang konfigurasi resolver yang didukung, lihat ikhtisar resolver untuk APPSYNC\$1JS atau [ikhtisar template pemetaan JavaScript Resolver](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html) untuk VTL.](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-overview.html)

Seperti yang Anda lihat, resolver bersifat modular. Agar komponen resolver berfungsi dengan baik, mereka harus dapat mengintip ke dalam keadaan eksekusi dari komponen lain. Dari bagian [Resolvers](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-components.html), Anda tahu bahwa setiap komponen dalam resolver dapat diteruskan informasi penting tentang status eksekusi sebagai satu set argumen (`args`,`context`, dll.). Dalam AWS AppSync, ini ditangani secara ketat oleh. `context` Ini adalah wadah untuk informasi tentang bidang yang sedang diselesaikan. Ini dapat mencakup semuanya mulai dari argumen yang diteruskan, hasil, data otorisasi, data header, dll. Untuk informasi lebih lanjut tentang konteksnya, lihat [referensi objek konteks Resolver untuk APPSYNC\$1JS atau referensi](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference-js.html) konteks template pemetaan [Resolver](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference.html) untuk VTL.

Konteksnya bukan satu-satunya alat yang dapat Anda gunakan untuk mengimplementasikan resolver Anda. AWS AppSync mendukung berbagai utilitas untuk menghasilkan nilai, penanganan kesalahan, penguraian, konversi, dll. [Anda dapat melihat daftar utilitas [di sini](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference-js.html) untuk APPSYNC\$1JS atau di sini untuk VTL.](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference.html)

Di bagian berikut, Anda akan mempelajari cara mengonfigurasi resolver di GraphQL API Anda.

**Topics**
+ [Membuat query dasar () JavaScript](configuring-resolvers-js.md)
+ [Membuat kueri dasar (VTL)](configuring-resolvers.md)

# Membuat query dasar () JavaScript
<a name="configuring-resolvers-js"></a>

GraphQL resolver menghubungkan bidang dalam skema tipe ke sumber data. Resolver adalah mekanisme dimana permintaan dipenuhi.

Resolver AWS AppSync digunakan JavaScript untuk mengonversi ekspresi GraphQL menjadi format yang dapat digunakan sumber data. Atau, template pemetaan dapat ditulis dalam [Apache Velocity Template Language (VTL) untuk](https://velocity.apache.org/engine/2.0/vtl-reference.html) mengubah ekspresi GraphQL menjadi format yang dapat digunakan sumber data.

Bagian ini menjelaskan cara mengkonfigurasi resolver menggunakan. JavaScript Bagian tutorial [Resolver (JavaScript) menyediakan tutorial](https://docs.aws.amazon.com/appsync/latest/devguide/tutorials-js.html) mendalam tentang cara menerapkan resolver menggunakan. JavaScript Bagian [Referensi Resolver (JavaScript)](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html) memberikan penjelasan tentang operasi utilitas yang dapat digunakan dengan JavaScript resolver.

Sebaiknya ikuti panduan ini sebelum mencoba menggunakan salah satu tutorial yang disebutkan di atas.

Di bagian ini, kita akan membahas cara membuat dan mengkonfigurasi resolver untuk kueri dan mutasi.

**catatan**  
Panduan ini mengasumsikan Anda telah membuat skema Anda dan memiliki setidaknya satu kueri atau mutasi. Jika Anda mencari langganan (data waktu nyata), lihat panduan [ini](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-real-time-data.html).

Di bagian ini, kami akan memberikan beberapa langkah umum untuk mengonfigurasi resolver bersama dengan contoh yang menggunakan skema di bawah ini:

```
// schema.graphql file

input CreatePostInput {
  title: String
  date: AWSDateTime
}

type Post {
  id: ID!
  title: String
  date: AWSDateTime
}

type Mutation {
  createPost(input: CreatePostInput!): Post
}

type Query {
  getPost: [Post]
}
```

## Membuat resolver kueri dasar
<a name="create-basic-query-resolver-js"></a>

Bagian ini akan menunjukkan cara membuat resolver kueri dasar.

------
#### [ Console ]

1. Masuk ke Konsol Manajemen AWS dan buka [AppSynckonsol](https://console.aws.amazon.com/appsync/).

   1. Di **APIs dasbor**, pilih GraphQL API Anda.

   1. Di **Sidebar**, pilih **Skema**.

1. Masukkan detail skema dan sumber data Anda. Lihat bagian [Merancang skema Anda](https://docs.aws.amazon.com/appsync/latest/devguide/designing-your-schema.html) dan [Melampirkan sumber data](https://docs.aws.amazon.com/appsync/latest/devguide/attaching-a-data-source.html) untuk informasi selengkapnya.

1. Di sebelah editor **Skema**, Ada jendela bernama **Resolvers**. Kotak ini berisi daftar jenis dan bidang seperti yang didefinisikan di jendela **Skema** Anda. Anda dapat melampirkan resolver ke bidang. Anda kemungkinan besar akan melampirkan resolver ke operasi lapangan Anda. Pada bagian ini, kita akan melihat konfigurasi query sederhana. Di bawah Jenis **kueri**, pilih **Lampirkan** di sebelah bidang kueri Anda.

1. Pada halaman **Attach resolver**, di bawah **jenis Resolver, Anda dapat memilih antara pipeline atau resolver** unit. Untuk informasi selengkapnya tentang jenis ini, lihat [Resolver](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-components.html). Panduan ini akan memanfaatkan`pipeline resolvers`.
**Tip**  
Saat membuat resolver pipeline, sumber data Anda akan dilampirkan ke fungsi pipeline. Fungsi dibuat setelah Anda membuat resolver pipeline itu sendiri, itulah sebabnya tidak ada opsi untuk mengaturnya di halaman ini. Jika Anda menggunakan resolver unit, sumber data terikat langsung ke resolver, jadi Anda akan mengaturnya di halaman ini.

   Untuk **runtime Resolver, pilih `APPSYNC_JS` untuk mengaktifkan runtime**. JavaScript 

1. Anda dapat mengaktifkan [caching](https://docs.aws.amazon.com/appsync/latest/devguide/enabling-caching.html) untuk API ini. Sebaiknya matikan fitur ini untuk saat ini. Pilih **Buat**.

1. Pada halaman **Edit resolver**, ada editor kode bernama kode **Resolver** yang memungkinkan Anda mengimplementasikan logika untuk penangan dan respons resolver (sebelum dan sesudah langkah). Untuk informasi selengkapnya, lihat ikhtisar [JavaScriptresolver](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html). 
**catatan**  
Dalam contoh kita, kita hanya akan membiarkan permintaan kosong dan respons ditetapkan untuk mengembalikan hasil sumber data terakhir dari [konteks](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference-js.html):  

   ```
   import {util} from '@aws-appsync/utils';
   
   export function request(ctx) {
       return {};
   }
   
   export function response(ctx) {
       return ctx.prev.result;
   }
   ```

   Di bawah bagian ini, ada tabel yang disebut **Functions**. Fungsi memungkinkan Anda untuk menerapkan kode yang dapat digunakan kembali di beberapa resolver. Alih-alih terus-menerus menulis ulang atau menyalin kode, Anda dapat menyimpan kode sumber sebagai fungsi untuk ditambahkan ke resolver kapan pun Anda membutuhkannya. 

   Fungsi membentuk sebagian besar daftar operasi pipa. Saat menggunakan beberapa fungsi dalam resolver, Anda mengatur urutan fungsi, dan mereka akan dijalankan dalam urutan itu secara berurutan. Mereka dieksekusi setelah fungsi permintaan berjalan dan sebelum fungsi respon dimulai.

   Untuk menambahkan fungsi baru, di bawah **Fungsi**, pilih **Tambah fungsi**, lalu **Buat fungsi baru**. Atau, Anda mungkin melihat tombol **Create function** untuk memilih sebagai gantinya.

   1. Pilih sumber data. Ini akan menjadi sumber data tempat resolver bertindak.
**catatan**  
Dalam contoh kita, kita melampirkan resolver untuk`getPost`, yang mengambil objek oleh. `Post` `id` Mari kita asumsikan kita sudah menyiapkan tabel DynamoDB untuk skema ini. Kunci partisi diatur ke `id` dan kosong.

   1. Masukkan a`Function name`.

   1. Di bawah **kode Fungsi**, Anda harus mengimplementasikan perilaku fungsi. Ini mungkin membingungkan, tetapi setiap fungsi akan memiliki permintaan lokal dan penangan respons sendiri. Permintaan berjalan, kemudian pemanggilan sumber data dibuat untuk menangani permintaan, kemudian respons sumber data diproses oleh penangan respons. Hasilnya disimpan dalam objek [konteks](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference-js.html). Setelah itu, fungsi berikutnya dalam daftar akan berjalan atau akan diteruskan ke penangan respons langkah setelah jika itu yang terakhir. 
**catatan**  
Dalam contoh kita, kita melampirkan resolver ke`getPost`, yang mendapat daftar `Post` objek dari sumber data. Fungsi permintaan kami akan meminta data dari tabel kami, tabel akan meneruskan responsnya ke konteks (ctx), maka respons akan mengembalikan hasilnya dalam konteks. AWS AppSync Kekuatan terletak pada keterkaitannya dengan layanan lain. AWS Karena kami menggunakan DynamoDB, kami memiliki [serangkaian operasi untuk menyederhanakan hal-hal](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html) seperti ini. Kami memiliki beberapa contoh boilerplate untuk tipe sumber data lainnya juga.  
Kode kita akan terlihat seperti ini:  

      ```
      import { util } from '@aws-appsync/utils';
      
      /**
       * Performs a scan on the dynamodb data source
       */
      export function request(ctx) {
        return { operation: 'Scan' };
      }
      
      /**
       * return a list of scanned post items
       */
      export function response(ctx) {
        return ctx.result.items;
      }
      ```
Pada langkah ini, kami menambahkan dua fungsi:  
`request`: Handler permintaan melakukan operasi pengambilan terhadap sumber data. Argumen berisi objek konteks (`ctx`), atau beberapa data yang tersedia untuk semua resolver melakukan operasi tertentu. Misalnya, mungkin berisi data otorisasi, nama bidang yang diselesaikan, dll. Pernyataan pengembalian melakukan [https://docs.aws.amazon.com//appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-scan](https://docs.aws.amazon.com//appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-scan)operasi (lihat [di sini](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Scan.html) untuk contoh). Karena kami bekerja dengan DynamoDB, kami diizinkan untuk menggunakan beberapa operasi dari layanan itu. Pemindaian melakukan pengambilan dasar semua item di tabel kami. Hasil operasi ini disimpan dalam objek konteks sebagai `result` wadah sebelum diteruskan ke handler respons. `request`Dijalankan sebelum respons dalam pipa.
`response`: Response handler yang mengembalikan output dari. `request` Argumennya adalah objek konteks yang diperbarui, dan pernyataan pengembaliannya adalah`ctx.prev.result`. Pada titik ini dalam panduan ini, Anda mungkin tidak terbiasa dengan nilai ini. `ctx`mengacu pada objek konteks. `prev`mengacu pada operasi sebelumnya dalam pipa, yang merupakan milik kami`request`. `result`Berisi hasil resolver saat bergerak melalui pipa. Jika Anda menempatkan semuanya bersama-sama, `ctx.prev.result` mengembalikan hasil dari operasi terakhir yang dilakukan, yang merupakan handler permintaan.

   1. Pilih **Buat** setelah selesai.

1. Kembali ke layar resolver, di bawah **Fungsi**, pilih drop-down **Tambah fungsi** dan tambahkan fungsi Anda ke daftar fungsi Anda.

1. Pilih **Simpan** untuk memperbarui resolver.

------
#### [ CLI ]

**Untuk menambahkan fungsi Anda**
+ Buat fungsi untuk resolver pipeline Anda menggunakan perintah. `[create-function](https://docs.aws.amazon.com/cli/latest/reference/appsync/create-function.html)`

  Anda harus memasukkan beberapa parameter untuk perintah khusus ini:

  1. API Anda. `api-id`

  1. `name`Fungsi di AWS AppSync konsol.

  1. Itu`data-source-name`, atau nama sumber data yang akan digunakan fungsi. Itu harus sudah dibuat dan ditautkan ke GraphQL API Anda di layanan. AWS AppSync 

  1. atau lingkungan dan bahasa dari fungsi tersebut. `runtime` Untuk JavaScript, nama harus`APPSYNC_JS`, dan runtime,`1.0.0`.

  1. Penangan`code`, atau permintaan dan respons fungsi Anda. Meskipun Anda dapat mengetiknya secara manual, jauh lebih mudah untuk menambahkannya ke file.txt (atau format serupa) dan kemudian meneruskannya sebagai argumen. 
**catatan**  
Kode kueri kami akan berada dalam file yang diteruskan sebagai argumen:  

     ```
     import { util } from '@aws-appsync/utils';
     
     /**
      * Performs a scan on the dynamodb data source
      */
     export function request(ctx) {
       return { operation: 'Scan' };
     }
     
     /**
      * return a list of scanned post items
      */
     export function response(ctx) {
       return ctx.result.items;
     }
     ```

  Contoh perintah mungkin terlihat seperti ini:

  ```
  aws appsync create-function \
  --api-id abcdefghijklmnopqrstuvwxyz \
  --name get_posts_func_1 \
  --data-source-name table-for-posts \
  --runtime name=APPSYNC_JS,runtimeVersion=1.0.0 \
  --code file://~/path/to/file/{filename}.{fileType}
  ```

  Output akan dikembalikan dalam CLI. Inilah contohnya:

  ```
  {
      "functionConfiguration": {
          "functionId": "ejglgvmcabdn7lx75ref4qeig4",
          "functionArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/functions/ejglgvmcabdn7lx75ref4qeig4",
          "name": "get_posts_func_1",
          "dataSourceName": "table-for-posts",
          "maxBatchSize": 0,
          "runtime": {
              "name": "APPSYNC_JS",
              "runtimeVersion": "1.0.0"
          },
          "code": "Code output goes here"
      }
  }
  ```
**catatan**  
Pastikan Anda merekam `functionId` suatu tempat karena ini akan digunakan untuk melampirkan fungsi ke resolver.

**Untuk membuat resolver Anda**
+ Buat fungsi pipeline `Query` dengan menjalankan `[create-resolver](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/create-resolver.html)` perintah.

  Anda harus memasukkan beberapa parameter untuk perintah khusus ini:

  1. API Anda. `api-id`

  1. Jenis objek`type-name`, atau khusus dalam skema Anda (Query, Mutation, Subscription).

  1. Operasi`field-name`, atau bidang di dalam jenis objek khusus yang ingin Anda lampirkan resolver.

  1. The`kind`, yang menentukan unit atau resolver pipa. Setel ini `PIPELINE` untuk mengaktifkan fungsi pipeline.

  1. The`pipeline-config`, atau fungsi (s) untuk melampirkan ke resolver. Pastikan Anda mengetahui `functionId` nilai-nilai fungsi Anda. Urutan daftar penting.

  1. Yang`runtime`, yang `APPSYNC_JS` (JavaScript). `runtimeVersion`Saat ini adalah`1.0.0`.

  1. Itu`code`, yang berisi penangan langkah sebelum dan sesudah.
**catatan**  
Kode kueri kami akan berada dalam file yang diteruskan sebagai argumen:  

     ```
     import { util } from '@aws-appsync/utils';
     
     /**
      * Sends a request to `put` an item in the DynamoDB data source
      */
     export function request(ctx) {
       const { id, ...values } = ctx.args;
       return {
         operation: 'PutItem',
         key: util.dynamodb.toMapValues({ id }),
         attributeValues: util.dynamodb.toMapValues(values),
       };
     }
     
     /**
      * returns the result of the `put` operation
      */
     export function response(ctx) {
       return ctx.result;
     }
     ```

  Contoh perintah mungkin terlihat seperti ini:

  ```
  aws appsync create-resolver \
  --api-id abcdefghijklmnopqrstuvwxyz \
  --type-name Query \
  --field-name getPost \
  --kind PIPELINE \
  --pipeline-config functions=ejglgvmcabdn7lx75ref4qeig4 \
  --runtime name=APPSYNC_JS,runtimeVersion=1.0.0 \
  --code file:///path/to/file/{filename}.{fileType}
  ```

  Output akan dikembalikan dalam CLI. Inilah contohnya:

  ```
  {
      "resolver": {
          "typeName": "Mutation",
          "fieldName": "getPost",
          "resolverArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/types/Mutation/resolvers/getPost",
          "kind": "PIPELINE",
          "pipelineConfig": {
              "functions": [
                  "ejglgvmcabdn7lx75ref4qeig4"
              ]
          },
          "maxBatchSize": 0,
          "runtime": {
              "name": "APPSYNC_JS",
              "runtimeVersion": "1.0.0"
          },
          "code": "Code output goes here"
      }
  }
  ```

------
#### [ CDK ]

**Tip**  
[Sebelum Anda menggunakan CDK, kami sarankan untuk meninjau [dokumentasi resmi](https://docs.aws.amazon.com/cdk/v2/guide/home.html) CDK bersama dengan referensi CDK AWS AppSync.](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync-readme.html)  
Langkah-langkah yang tercantum di bawah ini hanya akan menampilkan contoh umum dari cuplikan yang digunakan untuk menambahkan sumber daya tertentu. Ini **tidak** dimaksudkan untuk menjadi solusi yang berfungsi dalam kode produksi Anda. Kami juga menganggap Anda sudah memiliki aplikasi yang berfungsi.

Aplikasi dasar akan membutuhkan hal-hal berikut:

1. Arahan impor layanan

1. Kode skema

1. Generator sumber data

1. Kode fungsi

1. Kode penyelesai

Dari bagian [Merancang skema Anda](https://docs.aws.amazon.com/appsync/latest/devguide/designing-your-schema.html) dan [Melampirkan sumber data](https://docs.aws.amazon.com/appsync/latest/devguide/attaching-a-data-source.html), kami tahu bahwa file tumpukan akan menyertakan arahan impor formulir:

```
import * as x from 'x'; # import wildcard as the 'x' keyword from 'x-service'
import {a, b, ...} from 'c'; # import {specific constructs} from 'c-service'
```

**catatan**  
Di bagian sebelumnya, kami hanya menyatakan cara AWS AppSync mengimpor konstruksi. Dalam kode nyata, Anda harus mengimpor lebih banyak layanan hanya untuk menjalankan aplikasi. Dalam contoh kami, jika kami membuat aplikasi CDK yang sangat sederhana, kami setidaknya akan mengimpor AWS AppSync layanan bersama dengan sumber data kami, yang merupakan tabel DynamoDB. Kami juga perlu mengimpor beberapa konstruksi tambahan untuk menerapkan aplikasi:  

```
import * as cdk from 'aws-cdk-lib';
import * as appsync from 'aws-cdk-lib/aws-appsync';
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
import { Construct } from 'constructs';
```
Untuk meringkas masing-masing:  
`import * as cdk from 'aws-cdk-lib';`: Ini memungkinkan Anda untuk menentukan aplikasi CDK dan konstruksi seperti tumpukan. Ini juga berisi beberapa fungsi utilitas yang berguna untuk aplikasi kita seperti memanipulasi metadata. Jika Anda terbiasa dengan arahan impor ini, tetapi bertanya-tanya mengapa pustaka inti cdk tidak digunakan di sini, lihat halaman [Migrasi](https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html).
`import * as appsync from 'aws-cdk-lib/aws-appsync';`: Ini mengimpor [AWS AppSync layanan](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync-readme.html).
`import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';`: Ini mengimpor layanan [DynamoDB](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_dynamodb-readme.html).
`import { Construct } from 'constructs';`: Kita membutuhkan ini untuk mendefinisikan [konstruksi](https://docs.aws.amazon.com/cdk/v2/guide/constructs.html) root.

Jenis impor tergantung pada layanan yang Anda panggil. Kami merekomendasikan untuk melihat dokumentasi CDK sebagai contoh. Skema di bagian atas halaman akan menjadi file terpisah di aplikasi CDK Anda sebagai `.graphql` file. Dalam file stack, kita dapat mengaitkannya dengan GraphQL baru menggunakan formulir:

```
const add_api = new appsync.GraphqlApi(this, 'graphQL-example', {
  name: 'my-first-api',
  schema: appsync.SchemaFile.fromAsset(path.join(__dirname, 'schema.graphql')),
});
```

**catatan**  
Dalam lingkup`add_api`, kami menambahkan API GraphQL baru menggunakan kata kunci yang diikuti `new` oleh. `appsync.GraphqlApi(scope: Construct, id: string , props: GraphqlApiProps)` Cakupan kami adalah`this`, id CFN adalah`graphQL-example`, dan alat peraga kami adalah `my-first-api` (nama API di konsol) dan `schema.graphql` (jalur absolut ke file skema).

Untuk menambahkan sumber data, pertama-tama Anda harus menambahkan sumber data ke tumpukan. Kemudian, Anda perlu mengaitkannya dengan GraphQL API menggunakan metode khusus sumber. Asosiasi akan terjadi ketika Anda membuat fungsi resolver Anda. Sementara itu, mari kita gunakan contoh dengan membuat tabel DynamoDB menggunakan: `dynamodb.Table`

```
const add_ddb_table = new dynamodb.Table(this, 'posts-table', {
  partitionKey: {
    name: 'id',
    type: dynamodb.AttributeType.STRING,
  },
});
```

**catatan**  
Jika kita menggunakan ini dalam contoh kita, kita akan menambahkan tabel DynamoDB baru dengan id CFN `posts-table` dari dan kunci partisi. `id (S)`

Selanjutnya, kita perlu mengimplementasikan resolver kita di file stack. Berikut adalah contoh kueri sederhana yang memindai semua item dalam tabel DynamoDB:

```
const add_func = new appsync.AppsyncFunction(this, 'func-get-posts', {
  name: 'get_posts_func_1',
  add_api,
  dataSource: add_api.addDynamoDbDataSource('table-for-posts', add_ddb_table),
  code: appsync.Code.fromInline(`
      export function request(ctx) {
        return { operation: 'Scan' };
      }

      export function response(ctx) {
        return ctx.result.items;
      }
  `),
  runtime: appsync.FunctionRuntime.JS_1_0_0,
});

new appsync.Resolver(this, 'pipeline-resolver-get-posts', {
  add_api,
  typeName: 'Query',
  fieldName: 'getPost',
  code: appsync.Code.fromInline(`
      export function request(ctx) {
        return {};
      }

      export function response(ctx) {
        return ctx.prev.result;
      }
 `),
  runtime: appsync.FunctionRuntime.JS_1_0_0,
  pipelineConfig: [add_func],
});
```

**catatan**  
Pertama, kami membuat fungsi yang disebut`add_func`. Urutan pembuatan ini mungkin tampak agak berlawanan dengan intuisi, tetapi Anda harus membuat fungsi di resolver pipeline Anda sebelum Anda membuat resolver itu sendiri. Sebuah fungsi mengikuti formulir:  

```
AppsyncFunction(scope: Construct, id: string, props: AppsyncFunctionProps)
```
Ruang lingkup kami adalah`this`, id CFN kami`func-get-posts`, dan alat peraga kami berisi detail fungsi yang sebenarnya. Di dalam alat peraga, kami menyertakan:  
Fungsi `name` yang akan hadir di AWS AppSync konsol (`get_posts_func_1`).
GraphQL API yang kita buat sebelumnya (). `add_api`
Sumber data; ini adalah titik di mana kita menghubungkan sumber data ke nilai GraphQL API, lalu melampirkannya ke fungsi. Kami mengambil tabel yang kami buat (`add_ddb_table`) dan melampirkannya ke GraphQL API `add_api` () menggunakan salah `GraphqlApi` satu metode (). [https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.GraphqlApi.html#addwbrdynamowbrdbwbrdatawbrsourceid-table-options](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.GraphqlApi.html#addwbrdynamowbrdbwbrdatawbrsourceid-table-options) Nilai id (`table-for-posts`) adalah nama sumber data di AWS AppSync konsol. Untuk daftar metode khusus sumber, lihat halaman berikut:  
[ DynamoDbDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.DynamoDbDataSource.html) 
 [ EventBridgeDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.EventBridgeDataSource.html) 
 [ HttpDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.HttpDataSource.html) 
 [ LambdaDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.LambdaDataSource.html) 
 [ NoneDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.NoneDataSource.html) 
 [ OpenSearchDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.OpenSearchDataSource.html) 
 [ RdsDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.RdsDataSource.html) 
Kode berisi permintaan fungsi dan penangan respons, yang merupakan pemindaian dan pengembalian sederhana.
Runtime menentukan bahwa kita ingin menggunakan APPSYNC\$1JS runtime versi 1.0.0. Perhatikan bahwa saat ini satu-satunya versi yang tersedia untuk APPSYNC\$1JS.
Selanjutnya, kita perlu melampirkan fungsi ke resolver pipa. Kami membuat resolver kami menggunakan formulir:  

```
Resolver(scope: Construct, id: string, props: ResolverProps)
```
Ruang lingkup kami adalah`this`, id CFN kami`pipeline-resolver-get-posts`, dan alat peraga kami berisi detail fungsi yang sebenarnya. Di dalam alat peraga, kami menyertakan:  
GraphQL API yang kita buat sebelumnya (). `add_api`
Nama tipe objek khusus; ini adalah operasi query, jadi kita hanya menambahkan nilai`Query`.
Nama bidang (`getPost`) adalah nama bidang dalam skema di bawah `Query` tipe.
Kode berisi penangan sebelum dan sesudah Anda. Contoh kami hanya mengembalikan hasil apa pun yang ada dalam konteks setelah fungsi melakukan operasinya.
Runtime menentukan bahwa kita ingin menggunakan APPSYNC\$1JS runtime versi 1.0.0. Perhatikan bahwa saat ini satu-satunya versi yang tersedia untuk APPSYNC\$1JS.
Konfigurasi pipeline berisi referensi ke fungsi yang kita buat (`add_func`).

------

Untuk meringkas apa yang terjadi dalam contoh ini, Anda melihat AWS AppSync fungsi yang menerapkan permintaan dan penangan respons. Fungsi ini bertanggung jawab untuk berinteraksi dengan sumber data Anda. Handler permintaan mengirim `Scan` operasi ke AWS AppSync, menginstruksikannya tentang operasi apa yang harus dilakukan terhadap sumber data DynamoDB Anda. Response handler mengembalikan daftar item (`ctx.result.items`). Daftar item kemudian dipetakan ke tipe `Post` GraphQL secara otomatis. 

## Membuat resolver mutasi dasar
<a name="creating-basic-mutation-resolvers-js"></a>

Bagian ini akan menunjukkan cara membuat resolver mutasi dasar.

------
#### [ Console ]

1. Masuk ke Konsol Manajemen AWS dan buka [AppSynckonsol](https://console.aws.amazon.com/appsync/).

   1. Di **APIs dasbor**, pilih GraphQL API Anda.

   1. Di **Sidebar**, pilih **Skema**.

1. Di bawah bagian **Resolvers** dan jenis **Mutasi**, pilih **Lampirkan di sebelah bidang** Anda.
**catatan**  
Dalam contoh kita, kita melampirkan resolver untuk`createPost`, yang menambahkan `Post` objek ke tabel kita. Mari kita asumsikan kita menggunakan tabel DynamoDB yang sama dari bagian terakhir. Kunci partisi diatur ke `id` dan kosong.

1. Pada halaman **Attach resolver**, di bawah jenis **Resolver**, pilih. `pipeline resolvers` [Sebagai pengingat, Anda dapat menemukan informasi lebih lanjut tentang resolver di sini.](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-components.html) Untuk **runtime Resolver, pilih `APPSYNC_JS` untuk mengaktifkan runtime**. JavaScript 

1. Anda dapat mengaktifkan [caching](https://docs.aws.amazon.com/appsync/latest/devguide/enabling-caching.html) untuk API ini. Sebaiknya matikan fitur ini untuk saat ini. Pilih **Buat**.

1. Pilih **Tambah fungsi**, lalu pilih **Buat fungsi baru**. Atau, Anda mungkin melihat tombol **Create function** untuk memilih sebagai gantinya.

   1. Pilih sumber data Anda. Ini harus menjadi sumber yang datanya akan Anda manipulasi dengan mutasi.

   1. Masukkan a`Function name`.

   1. Di bawah **kode Fungsi**, Anda harus mengimplementasikan perilaku fungsi. Ini adalah mutasi, jadi permintaan idealnya akan melakukan beberapa operasi perubahan status pada sumber data yang dipanggil. Hasilnya akan diproses oleh fungsi respons.
**catatan**  
`createPost`menambahkan, atau “menempatkan”, yang baru `Post` dalam tabel dengan parameter kami sebagai data. Kita bisa menambahkan sesuatu seperti ini:   

      ```
      import { util } from '@aws-appsync/utils';
      
      /**
       * Sends a request to `put` an item in the DynamoDB data source
       */
      export function request(ctx) {
        return {
          operation: 'PutItem',
          key: util.dynamodb.toMapValues({id: util.autoId()}),
          attributeValues: util.dynamodb.toMapValues(ctx.args.input),
        };
      }
      
      /**
       * returns the result of the `put` operation
       */
      export function response(ctx) {
        return ctx.result;
      }
      ```
Pada langkah ini, kami juga menambahkan `request` dan `response` berfungsi:  
`request`: Handler permintaan menerima konteks sebagai argumen. Pernyataan pengembalian request handler melakukan [https://docs.aws.amazon.com//appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-putitem](https://docs.aws.amazon.com//appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-putitem)perintah, yang merupakan operasi DynamoDB bawaan ([lihat](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-2.html) di sini [atau](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithItems.html#WorkingWithItems.WritingData) di sini untuk contoh). `PutItem`Perintah menambahkan `Post` objek ke tabel DynamoDB kami dengan mengambil nilai `key` partisi (dihasilkan secara otomatis `util.autoid()` oleh) `attributes` dan dari input argumen konteks (ini adalah nilai yang akan kami berikan dalam permintaan kami). `key`Itu adalah `id` dan `attributes` adalah argumen `title` lapangan `date` dan. Keduanya diformat sebelumnya melalui [https://docs.aws.amazon.com//appsync/latest/devguide/dynamodb-helpers-in-util-dynamodb-js.html#utility-helpers-in-toMap-js](https://docs.aws.amazon.com//appsync/latest/devguide/dynamodb-helpers-in-util-dynamodb-js.html#utility-helpers-in-toMap-js)helper untuk bekerja dengan tabel DynamoDB.
`response`: Respons menerima konteks yang diperbarui dan mengembalikan hasil penangan permintaan.

   1. Pilih **Buat** setelah selesai.

1. Kembali ke layar resolver, di bawah **Fungsi**, pilih drop-down **Tambah fungsi** dan tambahkan fungsi Anda ke daftar fungsi Anda.

1. Pilih **Simpan** untuk memperbarui resolver.

------
#### [ CLI ]

**Untuk menambahkan fungsi Anda**
+ Buat fungsi untuk resolver pipeline Anda menggunakan perintah. `[create-function](https://docs.aws.amazon.com/cli/latest/reference/appsync/create-function.html)`

  Anda harus memasukkan beberapa parameter untuk perintah khusus ini:

  1. API Anda. `api-id`

  1. `name`Fungsi di AWS AppSync konsol.

  1. Itu`data-source-name`, atau nama sumber data yang akan digunakan fungsi. Itu harus sudah dibuat dan ditautkan ke GraphQL API Anda di layanan. AWS AppSync 

  1. atau lingkungan dan bahasa dari fungsi tersebut. `runtime` Untuk JavaScript, nama harus`APPSYNC_JS`, dan runtime,`1.0.0`.

  1. Penangan`code`, atau permintaan dan respons fungsi Anda. Meskipun Anda dapat mengetiknya secara manual, jauh lebih mudah untuk menambahkannya ke file.txt (atau format serupa) kemudian meneruskannya sebagai argumen. 
**catatan**  
Kode kueri kami akan berada dalam file yang diteruskan sebagai argumen:  

     ```
     import { util } from '@aws-appsync/utils';
     
     /**
      * Sends a request to `put` an item in the DynamoDB data source
      */
     export function request(ctx) {
       return {
         operation: 'PutItem',
         key: util.dynamodb.toMapValues({id: util.autoId()}),
         attributeValues: util.dynamodb.toMapValues(ctx.args.input),
       };
     }
     
     /**
      * returns the result of the `put` operation
      */
     export function response(ctx) {
       return ctx.result;
     }
     ```

  Contoh perintah mungkin terlihat seperti ini:

  ```
  aws appsync create-function \
  --api-id abcdefghijklmnopqrstuvwxyz \
  --name add_posts_func_1 \
  --data-source-name table-for-posts \
  --runtime name=APPSYNC_JS,runtimeVersion=1.0.0 \
  --code file:///path/to/file/{filename}.{fileType}
  ```

  Output akan dikembalikan dalam CLI. Inilah contohnya:

  ```
  {
      "functionConfiguration": {
          "functionId": "vulcmbfcxffiram63psb4dduoa",
          "functionArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/functions/vulcmbfcxffiram63psb4dduoa",
          "name": "add_posts_func_1",
          "dataSourceName": "table-for-posts",
          "maxBatchSize": 0,
          "runtime": {
              "name": "APPSYNC_JS",
              "runtimeVersion": "1.0.0"
          },
          "code": "Code output foes here"
      }
  }
  ```
**catatan**  
Pastikan Anda merekam `functionId` suatu tempat karena ini akan digunakan untuk melampirkan fungsi ke resolver.

**Untuk membuat resolver Anda**
+ Buat fungsi pipeline `Mutation` dengan menjalankan `[create-resolver](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/create-resolver.html)` perintah.

  Anda harus memasukkan beberapa parameter untuk perintah khusus ini:

  1. API Anda. `api-id`

  1. Jenis objek`type-name`, atau khusus dalam skema Anda (Query, Mutation, Subscription).

  1. Operasi`field-name`, atau bidang di dalam jenis objek khusus yang ingin Anda lampirkan resolver.

  1. The`kind`, yang menentukan unit atau resolver pipa. Setel ini `PIPELINE` untuk mengaktifkan fungsi pipeline.

  1. The`pipeline-config`, atau fungsi (s) untuk melampirkan ke resolver. Pastikan Anda mengetahui `functionId` nilai-nilai fungsi Anda. Urutan daftar penting.

  1. Yang`runtime`, yang `APPSYNC_JS` (JavaScript). `runtimeVersion`Saat ini adalah`1.0.0`.

  1. Itu`code`, yang berisi langkah sebelum dan sesudah.
**catatan**  
Kode kueri kami akan berada dalam file yang diteruskan sebagai argumen:  

     ```
     import { util } from '@aws-appsync/utils';
     
     /**
      * Sends a request to `put` an item in the DynamoDB data source
      */
     export function request(ctx) {
       const { id, ...values } = ctx.args;
       return {
         operation: 'PutItem',
         key: util.dynamodb.toMapValues({ id }),
         attributeValues: util.dynamodb.toMapValues(values),
       };
     }
     
     /**
      * returns the result of the `put` operation
      */
     export function response(ctx) {
       return ctx.result;
     }
     ```

  Contoh perintah mungkin terlihat seperti ini:

  ```
  aws appsync create-resolver \
  --api-id abcdefghijklmnopqrstuvwxyz \
  --type-name Mutation \
  --field-name createPost \
  --kind PIPELINE \
  --pipeline-config functions=vulcmbfcxffiram63psb4dduoa \
  --runtime name=APPSYNC_JS,runtimeVersion=1.0.0 \
  --code file:///path/to/file/{filename}.{fileType}
  ```

  Output akan dikembalikan dalam CLI. Inilah contohnya:

  ```
  {
      "resolver": {
          "typeName": "Mutation",
          "fieldName": "createPost",
          "resolverArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/types/Mutation/resolvers/createPost",
          "kind": "PIPELINE",
          "pipelineConfig": {
              "functions": [
                  "vulcmbfcxffiram63psb4dduoa"
              ]
          },
          "maxBatchSize": 0,
          "runtime": {
              "name": "APPSYNC_JS",
              "runtimeVersion": "1.0.0"
          },
          "code": "Code output goes here"
      }
  }
  ```

------
#### [ CDK ]

**Tip**  
[Sebelum Anda menggunakan CDK, kami sarankan untuk meninjau [dokumentasi resmi](https://docs.aws.amazon.com/cdk/v2/guide/home.html) CDK bersama dengan referensi CDK AWS AppSync.](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync-readme.html)  
Langkah-langkah yang tercantum di bawah ini hanya akan menampilkan contoh umum dari cuplikan yang digunakan untuk menambahkan sumber daya tertentu. Ini **tidak** dimaksudkan untuk menjadi solusi yang berfungsi dalam kode produksi Anda. Kami juga menganggap Anda sudah memiliki aplikasi yang berfungsi.
+ Untuk membuat mutasi, dengan asumsi Anda berada di proyek yang sama, Anda dapat menambahkannya ke file tumpukan seperti kueri. Berikut adalah fungsi dan resolver yang dimodifikasi untuk mutasi yang menambahkan yang baru `Post` ke tabel:

  ```
  const add_func_2 = new appsync.AppsyncFunction(this, 'func-add-post', {
    name: 'add_posts_func_1',
    add_api,
    dataSource: add_api.addDynamoDbDataSource('table-for-posts-2', add_ddb_table),
        code: appsync.Code.fromInline(`
            export function request(ctx) {
              return {
                operation: 'PutItem',
                key: util.dynamodb.toMapValues({id: util.autoId()}),
                attributeValues: util.dynamodb.toMapValues(ctx.args.input),
              };
            }
  
            export function response(ctx) {
              return ctx.result;
            }
        `), 
    runtime: appsync.FunctionRuntime.JS_1_0_0,
  });
  
  new appsync.Resolver(this, 'pipeline-resolver-create-posts', {
    add_api,
    typeName: 'Mutation',
    fieldName: 'createPost',
        code: appsync.Code.fromInline(`
            export function request(ctx) {
              return {};
            }
  
            export function response(ctx) {
              return ctx.prev.result;
            }
        `),
    runtime: appsync.FunctionRuntime.JS_1_0_0,
    pipelineConfig: [add_func_2],
  });
  ```
**catatan**  
Karena mutasi dan kueri ini terstruktur dengan cara yang sama, kami hanya akan menjelaskan perubahan yang kami buat untuk membuat mutasi.   
Dalam fungsinya, kami mengubah id CFN menjadi `func-add-post` dan nama `add_posts_func_1` untuk mencerminkan fakta bahwa kami menambahkan `Posts` ke tabel. Di sumber data, kami membuat asosiasi baru ke table (`add_ddb_table`) kami di AWS AppSync konsol `table-for-posts-2` karena `addDynamoDbDataSource` metode memerlukannya. Perlu diingat, asosiasi baru ini masih menggunakan tabel yang sama yang kita buat sebelumnya, tetapi kita sekarang memiliki dua koneksi ke sana di AWS AppSync konsol: satu untuk kueri sebagai `table-for-posts` dan satu untuk mutasi sebagai`table-for-posts-2`. Kode diubah untuk menambahkan a `Post` dengan menghasilkan `id` nilainya secara otomatis dan menerima masukan klien untuk bidang lainnya.  
Dalam resolver, kita mengubah nilai id `pipeline-resolver-create-posts` untuk mencerminkan fakta bahwa kita menambahkan `Posts` ke tabel. Untuk mencerminkan mutasi dalam skema, nama tipe diubah menjadi`Mutation`, dan nama,. `createPost` Konfigurasi pipeline disetel ke fungsi mutasi baru kami. `add_func_2`

------

Untuk meringkas apa yang terjadi dalam contoh ini, AWS AppSync secara otomatis mengonversi argumen yang ditentukan di `createPost` bidang dari skema GraphQL Anda menjadi operasi DynamoDB. Contoh menyimpan catatan di DynamoDB menggunakan kunci`id`, yang secara otomatis dibuat menggunakan helper kami. `util.autoId()` Semua bidang lain yang Anda berikan ke argumen konteks (`ctx.args.input`) dari permintaan yang dibuat di AWS AppSync konsol atau sebaliknya akan disimpan sebagai atribut tabel. Baik kunci dan atribut secara otomatis dipetakan ke format DynamoDB yang kompatibel menggunakan helper. `util.dynamodb.toMapValues(values)`

AWS AppSync juga mendukung alur kerja pengujian dan debug untuk mengedit resolver. Anda dapat menggunakan `context` objek tiruan untuk melihat nilai template yang diubah sebelum memanggilnya. Secara opsional, Anda dapat melihat permintaan lengkap ke sumber data secara interaktif saat menjalankan kueri. Untuk informasi selengkapnya, lihat [Menguji dan debug resolvers (JavaScript)](https://docs.aws.amazon.com/appsync/latest/devguide/test-debug-resolvers-js.html) serta [Monitoring](https://docs.aws.amazon.com/appsync/latest/devguide/monitoring.html#aws-appsync-monitoring) dan logging.

## Resolver tingkat lanjut
<a name="advanced-resolvers-js"></a>

Jika Anda mengikuti bagian pagination opsional dalam [Merancang skema Anda](designing-your-schema.md#aws-appsync-designing-your-schema), Anda masih perlu menambahkan resolver Anda ke permintaan Anda untuk menggunakan pagination. Contoh kami menggunakan pagination query yang dipanggil `getPosts` untuk mengembalikan hanya sebagian dari hal-hal yang diminta pada suatu waktu. Kode resolver kami di bidang itu mungkin terlihat seperti ini:

```
/**
 * Performs a scan on the dynamodb data source
 */
export function request(ctx) {
  const { limit = 20, nextToken } = ctx.args;
  return { operation: 'Scan', limit, nextToken };
}

/**
 * @returns the result of the `put` operation
 */
export function response(ctx) {
  const { items: posts = [], nextToken } = ctx.result;
  return { posts, nextToken };
}
```

Dalam permintaan, kami lulus dalam konteks permintaan. Kami `limit` adalah*20*, artinya kami mengembalikan hingga 20 `Posts` di kueri pertama. `nextToken`Kursor kami diperbaiki ke `Post` entri pertama di sumber data. Ini diteruskan ke argumen. Permintaan kemudian melakukan pemindaian dari yang pertama `Post` hingga nomor batas pemindaian. Sumber data menyimpan hasil dalam konteks, yang diteruskan ke respons. Respons mengembalikan `Posts` itu diambil, kemudian menetapkan `nextToken` diatur ke `Post` entri tepat setelah batas. Permintaan berikutnya dikirim untuk melakukan hal yang sama persis tetapi dimulai dari offset tepat setelah kueri pertama. Perlu diingat bahwa permintaan semacam ini dilakukan secara berurutan dan tidak secara paralel.

# Menguji dan men-debug resolver di () AWS AppSync JavaScript
<a name="test-debug-resolvers-js"></a>

AWS AppSync mengeksekusi resolver pada bidang GraphQL terhadap sumber data. Saat bekerja dengan resolver pipeline, fungsi berinteraksi dengan sumber data Anda. Seperti yang dijelaskan dalam [ikhtisar JavaScript resolver](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html), fungsi berkomunikasi dengan sumber data dengan menggunakan penangan permintaan dan respons yang ditulis JavaScript dan dijalankan pada runtime. `APPSYNC_JS` Ini memungkinkan Anda untuk memberikan logika dan kondisi khusus sebelum dan sesudah berkomunikasi dengan sumber data.

Untuk membantu pengembang menulis, menguji, dan men-debug resolver ini, AWS AppSync konsol juga menyediakan alat untuk membuat permintaan dan respons GraphQL dengan data tiruan ke penyelesai bidang individual. Selain itu, Anda dapat melakukan kueri, mutasi, dan langganan di AWS AppSync konsol dan melihat aliran log terperinci dari seluruh permintaan dari Amazon. CloudWatch Ini termasuk hasil dari sumber data.

## Pengujian dengan data tiruan
<a name="testing-with-mock-data-js"></a>

Ketika resolver GraphQL dipanggil, itu berisi objek yang memiliki informasi `context` yang relevan tentang permintaan. Ini termasuk argumen dari klien, informasi identitas, dan data dari bidang GraphQL induk. Ini juga menyimpan hasil dari sumber data, yang dapat digunakan dalam penangan respons. Untuk informasi selengkapnya tentang struktur ini dan utilitas pembantu yang tersedia untuk digunakan saat pemrograman, lihat referensi [objek konteks Resolver](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference-js.html).

Saat menulis atau mengedit fungsi resolver, Anda dapat meneruskan objek *konteks *tiruan* atau pengujian* ke editor konsol. Ini memungkinkan Anda untuk melihat bagaimana permintaan dan penangan respons mengevaluasi tanpa benar-benar berjalan terhadap sumber data. Misalnya, Anda dapat lulus `firstname: Shaggy` argumen pengujian dan melihat bagaimana itu mengevaluasi saat menggunakan `ctx.args.firstname` dalam kode template Anda. Anda juga dapat menguji evaluasi setiap pembantu utilitas seperti `util.autoId()` atau`util.time.nowISO8601()`.

### Menguji penyelesai
<a name="test-a-resolver-js"></a>

Contoh ini akan menggunakan AWS AppSync konsol untuk menguji resolver.

1. Masuk ke Konsol Manajemen AWS dan buka [AppSynckonsol](https://console.aws.amazon.com/appsync/).

   1. Di **APIs dasbor**, pilih GraphQL API Anda.

   1. Di **Sidebar**, pilih **Functions**.

1. Pilih fungsi yang ada.

1. Di bagian atas halaman **fungsi Perbarui**, **pilih Pilih konteks pengujian**, lalu pilih **Buat konteks baru**.

1. Pilih objek konteks sampel atau isi JSON secara manual di jendela **Konfigurasi konteks pengujian** di bawah ini.

1. Masukkan **nama konteks Teks**.

1. Pilih tombol **Simpan**.

1. **Untuk mengevaluasi resolver Anda menggunakan objek konteks tiruan ini, pilih Run Test.**

Untuk contoh yang lebih praktis, misalkan Anda memiliki aplikasi yang menyimpan tipe `Dog` GraphQL yang menggunakan pembuatan ID otomatis untuk objek dan menyimpannya di Amazon DynamoDB. Anda juga ingin menulis beberapa nilai dari argumen mutasi GraphQL dan hanya mengizinkan pengguna tertentu untuk melihat respons. Cuplikan berikut menunjukkan seperti apa skema itu:

```
type Dog {
  breed: String
  color: String
}

type Mutation {
  addDog(firstname: String, age: Int): Dog
}
```

Anda dapat menulis AWS AppSync fungsi dan menambahkannya ke `addDog` resolver Anda untuk menangani mutasi. Untuk menguji AWS AppSync fungsi Anda, Anda dapat mengisi objek konteks seperti contoh berikut. Berikut ini memiliki argumen dari klien `name` dan`age`, dan `username` diisi dalam `identity` objek:

```
{
    "arguments" : {
        "firstname": "Shaggy",
        "age": 4
    },
    "source" : {},
    "result" : {
        "breed" : "Miniature Schnauzer",
        "color" : "black_grey"
    },
    "identity": {
        "sub" : "uuid",
        "issuer" : " https://cognito-idp.{region}.amazonaws.com/{userPoolId}",
        "username" : "Nadia",
        "claims" : { },
        "sourceIp" :[  "x.x.x.x" ],
        "defaultAuthStrategy" : "ALLOW"
    }
}
```

Anda dapat menguji AWS AppSync fungsi Anda menggunakan kode berikut:

```
import { util } from '@aws-appsync/utils';

export function request(ctx) {
  return {
    operation: 'PutItem',
    key: util.dynamodb.toMapValues({ id: util.autoId() }),
    attributeValues: util.dynamodb.toMapValues(ctx.args),
  };
}

export function response(ctx) {
  if (ctx.identity.username === 'Nadia') {
    console.log("This request is allowed")
    return ctx.result;
  }
  util.unauthorized();
}
```

Handler permintaan dan respons yang dievaluasi memiliki data dari objek konteks pengujian Anda dan nilai yang dihasilkan dari. `util.autoId()` Selain itu, jika Anda mengubah `username` ke nilai selain`Nadia`, hasilnya tidak akan dikembalikan karena pemeriksaan otorisasi akan gagal. Untuk informasi selengkapnya tentang kontrol akses berbutir halus, lihat Kasus penggunaan [otorisasi](security-authorization-use-cases.md#aws-appsync-security-authorization-use-cases).

### Menguji permintaan dan penangan respons dengan's AWS AppSync APIs
<a name="testing-with-appsync-api-js"></a>

Anda dapat menggunakan perintah `EvaluateCode` API untuk menguji kode Anda dari jarak jauh dengan data tiruan. Untuk memulai dengan perintah, pastikan Anda telah menambahkan `appsync:evaluateMappingCode` izin ke kebijakan Anda. Contoh:

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "appsync:evaluateCode",
            "Resource": "arn:aws:appsync:us-east-1:111122223333:*"
        }
    ]
}
```

------

Anda dapat memanfaatkan perintah dengan menggunakan [AWS CLI](https://aws.amazon.com/cli/)atau [AWS SDKs](https://aws.amazon.com/tools/). Misalnya, ambil `Dog` skema dan permintaan AWS AppSync fungsinya dan penangan respons dari bagian sebelumnya. Menggunakan CLI di stasiun lokal Anda, simpan kode ke file bernama`code.js`, lalu simpan `context` objek ke file bernama. `context.json` Dari shell Anda, jalankan perintah berikut:

```
$ aws appsync evaluate-code \
  --code file://code.js \
  --function response \
  --context file://context.json \
  --runtime name=APPSYNC_JS,runtimeVersion=1.0.0
```

Responsnya `evaluationResult` berisi muatan yang dikembalikan oleh handler Anda. Ini juga berisi `logs` objek, yang memegang daftar log yang dihasilkan oleh handler Anda selama evaluasi. Hal ini memudahkan untuk men-debug eksekusi kode Anda dan melihat informasi tentang evaluasi Anda untuk membantu memecahkan masalah. Contoh:

```
{
    "evaluationResult": "{\"breed\":\"Miniature Schnauzer\",\"color\":\"black_grey\"}",
    "logs": [
        "INFO - code.js:13:5: \"This request is allowed\""
    ]
}
```

`evaluationResult`Dapat diurai sebagai JSON, yang memberikan: 

```
{
  "breed": "Miniature Schnauzer",
  "color": "black_grey"
}
```

Dengan menggunakan SDK, Anda dapat dengan mudah menggabungkan pengujian dari rangkaian pengujian favorit untuk memvalidasi perilaku penangan Anda. Sebaiknya buat pengujian menggunakan [Jest Testing Framework](https://jestjs.io/), tetapi rangkaian pengujian apa pun berfungsi. Cuplikan berikut menunjukkan validasi hipotetis berjalan. Perhatikan bahwa kami mengharapkan respons evaluasi menjadi JSON yang valid, jadi kami gunakan `JSON.parse` untuk mengambil JSON dari respons string:

```
const AWS = require('aws-sdk')
const fs = require('fs')
const client = new AWS.AppSync({ region: 'us-east-2' })
const runtime = {name:'APPSYNC_JS',runtimeVersion:'1.0.0')

test('request correctly calls DynamoDB', async () => {
  const code = fs.readFileSync('./code.js', 'utf8')
  const context = fs.readFileSync('./context.json', 'utf8')
  const contextJSON = JSON.parse(context)
  
  const response = await client.evaluateCode({ code, context, runtime, function: 'request' }).promise()
  const result = JSON.parse(response.evaluationResult)
  
  expect(result.key.id.S).toBeDefined()
  expect(result.attributeValues.firstname.S).toEqual(contextJSON.arguments.firstname)
})
```

 Ini menghasilkan hasil sebagai berikut:

```
Ran all test suites.
> jest

PASS ./index.test.js
✓ request correctly calls DynamoDB (543 ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 totalTime: 1.511 s, estimated 2 s
```

## Mendebug kueri langsung
<a name="debugging-a-live-query-js"></a>

Tidak ada pengganti untuk end-to-end pengujian dan logging untuk men-debug aplikasi produksi. AWS AppSync memungkinkan Anda mencatat kesalahan dan detail permintaan lengkap menggunakan Amazon CloudWatch. Selain itu, Anda dapat menggunakan AWS AppSync konsol untuk menguji kueri GraphQL, mutasi, dan langganan serta data log streaming langsung untuk setiap permintaan kembali ke editor kueri untuk di-debug secara real time. Untuk langganan, log menampilkan informasi waktu koneksi.

Untuk melakukan ini, Anda harus mengaktifkan CloudWatch log Amazon terlebih dahulu, seperti yang dijelaskan dalam [Pemantauan dan pencatatan](monitoring.md#aws-appsync-monitoring). Selanjutnya, di AWS AppSync konsol, pilih tab **Queries dan kemudian masukkan kueri** GraphQL yang valid. Di bagian kanan bawah, klik dan seret jendela **Log** untuk membuka tampilan log. Di bagian atas halaman, pilih ikon panah putar untuk menjalankan kueri GraphQL Anda. Dalam beberapa saat, log permintaan dan respons lengkap Anda untuk operasi dialirkan ke bagian ini dan Anda dapat melihatnya di konsol.

# Mengkonfigurasi dan menggunakan resolver pipeline di () AWS AppSync JavaScript
<a name="pipeline-resolvers-js"></a>

AWS AppSync mengeksekusi resolver pada bidang GraphQL. Dalam beberapa kasus, aplikasi memerlukan eksekusi beberapa operasi untuk menyelesaikan satu bidang GraphQL. Dengan resolver pipeline, pengembang sekarang dapat membuat operasi yang disebut Fungsi dan menjalankannya secara berurutan. Pipeline resolver berguna untuk aplikasi yang, misalnya, memerlukan melakukan pemeriksaan otorisasi sebelum mengambil data untuk bidang.

Untuk informasi selengkapnya tentang arsitektur resolver JavaScript pipeline, lihat ikhtisar [JavaScriptresolver](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html#anatomy-of-a-pipeline-resolver-js).

## Langkah 1: Membuat resolver pipa
<a name="create-a-pipeline-resolver-js"></a>

Di AWS AppSync konsol, buka halaman **Skema**.

Simpan skema berikut:

```
schema {
    query: Query
    mutation: Mutation
}

type Mutation {
    signUp(input: Signup): User
}

type Query {
    getUser(id: ID!): User
}

input Signup {
    username: String!
    email: String!
}

type User {
    id: ID!
    username: String
    email: AWSEmail
}
```

**Kita akan memasang resolver pipa ke bidang **SignUp** pada tipe Mutasi.** Pada tipe **Mutasi** di sisi kanan, pilih **Lampirkan** di sebelah bidang `signUp` mutasi. Atur resolver ke `pipeline resolver` dan `APPSYNC_JS` runtime, lalu buat resolver.

Pipeline resolver kami mendaftarkan pengguna dengan terlebih dahulu memvalidasi input alamat email dan kemudian menyimpan pengguna dalam sistem. **Kami akan merangkum validasi email di dalam fungsi **ValidateEmail dan penyimpanan pengguna di dalam fungsi SaveUser**.** **Fungsi **ValidateEmail** dijalankan terlebih dahulu, dan jika email valid, maka fungsi SaveUser dijalankan.**

Alur eksekusi adalah sebagai berikut:

1. Mutation.signup penangan permintaan resolver

1. fungsi ValidateEmail

1. Fungsi SaveUser

1. Penangan respons penyelesai mutasi.signup

Karena kami mungkin akan menggunakan kembali fungsi **ValidateEmail** di resolver lain di API kami, kami ingin menghindari mengakses `ctx.args` karena ini akan berubah dari satu bidang GraphQL ke bidang GraphQL lainnya. Sebagai gantinya, kita dapat menggunakan `ctx.stash` untuk menyimpan atribut email dari argumen field `signUp(input: Signup)` input.

Perbarui kode resolver Anda dengan mengganti fungsi permintaan dan respons Anda:

```
export function request(ctx) {
    ctx.stash.email = ctx.args.input.email
    return {};
}

export function response(ctx) {
    return ctx.prev.result;
}
```

Pilih **Buat** atau **Simpan** untuk memperbarui resolver.

## Langkah 2: Membuat fungsi
<a name="create-a-function-js"></a>

Dari halaman resolver pipeline, di bagian **Functions**, klik **Add function**, lalu **Create new** function. Dimungkinkan juga untuk membuat fungsi tanpa melalui halaman resolver; untuk melakukan ini, di AWS AppSync konsol, buka halaman **Fungsi**. Pilih tombol **Create Function**. Mari buat fungsi yang memeriksa apakah email valid dan berasal dari domain tertentu. Jika email tidak valid, fungsi tersebut menimbulkan kesalahan. Jika tidak, itu meneruskan input apa pun yang diberikan.

Pastikan Anda telah membuat sumber data dari tipe **NONE**. Pilih sumber data ini di daftar **Nama sumber data**. Untuk **nama fungsi**, masukkan`validateEmail`. Di area **kode fungsi**, timpa semuanya dengan cuplikan ini:

```
import { util } from '@aws-appsync/utils';

export function request(ctx) {
  const { email } = ctx.stash;
  const valid = util.matches(
    '^[a-zA-Z0-9_.+-]+@(?:(?:[a-zA-Z0-9-]+\.)?[a-zA-Z]+\.)?(myvaliddomain)\.com',
    email
  );
  if (!valid) {
    util.error(`"${email}" is not a valid email.`);
  }

  return { payload: { email } };
}

export function response(ctx) {
  return ctx.result;
}
```

Tinjau input Anda, lalu pilih **Buat**. Kami baru saja membuat fungsi **ValidateEmail** kami. ****Ulangi langkah-langkah ini untuk membuat fungsi SaveUser dengan kode berikut (Demi kesederhanaan, kami menggunakan sumber data NONE dan berpura-pura pengguna telah disimpan dalam sistem setelah fungsi dijalankan.**** ):

```
import { util } from '@aws-appsync/utils';

export function request(ctx) {
  return ctx.prev.result;
}

export function response(ctx) {
  ctx.result.id = util.autoId();
  return ctx.result;
}
```

Kami baru saja membuat fungsi **SaveUser** kami.

## Langkah 3: Menambahkan fungsi ke resolver pipa
<a name="adding-a-function-to-a-pipeline-resolver-js"></a>

Fungsi kita seharusnya ditambahkan secara otomatis ke resolver pipeline yang baru saja kita buat. Jika ini tidak terjadi, atau Anda membuat fungsi melalui halaman **Fungsi**, Anda dapat mengklik **Tambah fungsi** kembali pada halaman `signUp` resolver untuk melampirkannya. Tambahkan fungsi **ValidateEmail** **dan SaveUser ke resolver**. **Fungsi **ValidateEmail** harus ditempatkan sebelum fungsi SaveUser.** Saat Anda menambahkan lebih banyak fungsi, Anda dapat menggunakan opsi **pindah ke atas** dan **bergerak ke bawah** untuk mengatur ulang urutan eksekusi fungsi Anda. Tinjau perubahan Anda, lalu pilih **Simpan**.

## Langkah 4: Menjalankan kueri
<a name="running-a-query-js"></a>

Di AWS AppSync konsol, buka halaman **Kueri.** Di penjelajah, pastikan Anda menggunakan mutasi Anda. Jika tidak, pilih `Mutation` di daftar drop-down, lalu pilih`+`. Masukkan kueri berikut:

```
mutation {
  signUp(input: {email: "nadia@myvaliddomain.com", username: "nadia"}) {
    id
    username
  }
}
```

Ini harus mengembalikan sesuatu seperti:

```
{
  "data": {
    "signUp": {
      "id": "256b6cc2-4694-46f4-a55e-8cb14cc5d7fc",
      "username": "nadia"
    }
  }
}
```

Kami telah berhasil mendaftarkan pengguna kami dan memvalidasi email input menggunakan resolver pipeline.

# Membuat kueri dasar (VTL)
<a name="configuring-resolvers"></a>

**catatan**  
Kami sekarang terutama mendukung runtime APPSYNC\$1JS dan dokumentasinya. [Harap pertimbangkan untuk menggunakan runtime APPSYNC\$1JS dan panduannya di sini.](https://docs.aws.amazon.com/appsync/latest/devguide/configuring-resolvers-js.html)

GraphQL resolver menghubungkan bidang dalam skema tipe ke sumber data. Resolver adalah mekanisme dimana permintaan dipenuhi. AWS AppSync dapat secara otomatis membuat dan menghubungkan resolver dari skema atau membuat skema dan menghubungkan resolver dari tabel yang ada tanpa Anda perlu menulis kode apa pun.

Resolver AWS AppSync digunakan JavaScript untuk mengonversi ekspresi GraphQL menjadi format yang dapat digunakan sumber data. Atau, template pemetaan dapat ditulis dalam [Apache Velocity Template Language (VTL) untuk](https://velocity.apache.org/engine/2.0/vtl-reference.html) mengubah ekspresi GraphQL menjadi format yang dapat digunakan sumber data.

Bagian ini akan menunjukkan cara mengkonfigurasi resolver menggunakan VTL. [Panduan pemrograman gaya tutorial pengantar untuk menulis resolver dapat ditemukan di panduan pemrograman [template pemetaan Resolver, dan utilitas pembantu yang tersedia untuk digunakan ketika pemrograman](resolver-mapping-template-reference-programming-guide.md#aws-appsync-resolver-mapping-template-reference-programming-guide) dapat ditemukan di referensi konteks template pemetaan Resolver.](resolver-context-reference.md#aws-appsync-resolver-mapping-template-context-reference) AWS AppSync juga memiliki alur pengujian dan debug bawaan yang dapat Anda gunakan saat mengedit atau menulis dari awal. Untuk informasi selengkapnya, lihat [Menguji dan men-debug resolver](test-debug-resolvers.md#aws-appsync-test-debug-resolvers).

Sebaiknya ikuti panduan ini sebelum mencoba menggunakan salah satu tutorial yang disebutkan di atas.

Di bagian ini, kita akan membahas cara membuat resolver, menambahkan resolver untuk mutasi, dan menggunakan konfigurasi lanjutan.

## Buat resolver pertama Anda
<a name="create-your-first-resolver"></a>

Mengikuti contoh dari bagian sebelumnya, langkah pertama adalah membuat resolver untuk tipe Anda`Query`.

------
#### [ Console ]

1. Masuk ke Konsol Manajemen AWS dan buka [AppSync konsol](https://console.aws.amazon.com/appsync/).

   1. Di **APIs dasbor**, pilih GraphQL API Anda.

   1. Di **Sidebar**, pilih **Skema**.

1. Di sisi kanan halaman, ada jendela yang disebut **Resolvers**. Kotak ini berisi daftar jenis dan bidang seperti yang didefinisikan dalam jendela **Skema** Anda di sisi kiri halaman. Anda dapat melampirkan resolver ke bidang. Misalnya, di bawah Jenis **kueri**, pilih **Lampirkan** di sebelah `getTodos` bidang.

1. Pada halaman **Create Resolver**, pilih sumber data yang Anda buat dalam panduan [Melampirkan sumber data](https://docs.aws.amazon.com/appsync/latest/devguide/attaching-a-data-source.html). Di jendela **Konfigurasikan templat pemetaan**, Anda dapat memilih templat pemetaan permintaan umum dan respons menggunakan daftar drop-down di sebelah kanan atau menulis sendiri.
**catatan**  
Pasangan template pemetaan permintaan ke template pemetaan respons disebut resolver unit. Resolver unit biasanya dimaksudkan untuk melakukan operasi hafalan; kami sarankan menggunakannya hanya untuk operasi tunggal dengan sejumlah kecil sumber data. Untuk operasi yang lebih kompleks, sebaiknya gunakan resolver pipa, yang dapat menjalankan beberapa operasi dengan beberapa sumber data secara berurutan.  
Untuk informasi selengkapnya tentang perbedaan antara templat pemetaan permintaan dan respons, lihat Resolver [unit](https://docs.aws.amazon.com//appsync/latest/devguide/resolver-mapping-template-reference-overview.html#unit-resolvers).  
Untuk informasi selengkapnya tentang penggunaan resolver pipeline, lihat [Pipeline](pipeline-resolvers.md#aws-appsync-pipeline-resolvers) resolvers.

1. Untuk kasus penggunaan umum, AWS AppSync konsol memiliki templat bawaan yang dapat Anda gunakan untuk mendapatkan item dari sumber data (misalnya, semua kueri item, pencarian individual, dll.). Misalnya, pada versi sederhana skema dari [Merancang skema Anda](designing-your-schema.md#aws-appsync-designing-your-schema) di mana `getTodos` tidak memiliki pagination, template pemetaan permintaan untuk item daftar adalah sebagai berikut:

   ```
   {
       "version" : "2017-02-28",
       "operation" : "Scan"
   }
   ```

1. Anda selalu membutuhkan template pemetaan respons untuk menyertai permintaan. Konsol menyediakan default dengan nilai passthrough berikut untuk daftar:

   ```
   $util.toJson($ctx.result.items)
   ```

   Dalam contoh ini, `context` objek (alias sebagai`$ctx`) untuk daftar item memiliki formulir`$context.result.items`. Jika operasi GraphQL Anda mengembalikan satu item, itu akan menjadi. `$context.result` AWS AppSync menyediakan fungsi pembantu untuk operasi umum, seperti `$util.toJson` fungsi yang tercantum sebelumnya, untuk memformat respons dengan benar. Untuk daftar lengkap fungsi, lihat Referensi utilitas [template pemetaan Resolver](resolver-util-reference.md#aws-appsync-resolver-mapping-template-util-reference).

1. Pilih **Simpan Resolver**.

------
#### [ API ]

1. Buat objek resolver dengan memanggil API. [https://docs.aws.amazon.com/appsync/latest/APIReference/API_CreateResolver.html](https://docs.aws.amazon.com/appsync/latest/APIReference/API_CreateResolver.html)

1. Anda dapat memodifikasi bidang resolver dengan memanggil API. [https://docs.aws.amazon.com/appsync/latest/APIReference/API_UpdateResolver.html](https://docs.aws.amazon.com/appsync/latest/APIReference/API_UpdateResolver.html)

------
#### [ CLI ]

1. Buat resolver dengan menjalankan perintah. [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/create-resolver.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/create-resolver.html)

   Anda harus mengetikkan 6 parameter untuk perintah khusus ini:

   1. API Anda. `api-id`

   1. `type-name`Jenis yang ingin Anda modifikasi dalam skema Anda. Dalam contoh konsol, ini adalah`Query`.

   1. `field-name`Bidang yang ingin Anda modifikasi dalam tipe Anda. Dalam contoh konsol, ini adalah`getTodos`.

   1. Sumber data yang Anda buat dalam panduan [Melampirkan sumber data](https://docs.aws.amazon.com/appsync/latest/devguide/attaching-a-data-source.html). `data-source-name`

   1. Itu`request-mapping-template`, yang merupakan badan permintaan. Dalam contoh konsol, ini adalah:

      ```
      {
          "version" : "2017-02-28",
          "operation" : "Scan"
      }
      ```

   1. Itu`response-mapping-template`, yang merupakan tubuh respons. Dalam contoh konsol, ini adalah:

      ```
      $util.toJson($ctx.result.items)
      ```

   Contoh perintah mungkin terlihat seperti ini:

   ```
   aws appsync create-resolver --api-id abcdefghijklmnopqrstuvwxyz --type-name Query --field-name getTodos --data-source-name TodoTable --request-mapping-template "{ "version" : "2017-02-28", "operation" : "Scan", }" --response-mapping-template ""$"util.toJson("$"ctx.result.items)"
   ```

   Output akan dikembalikan dalam CLI. Inilah contohnya:

   ```
   {
       "resolver": {
           "kind": "UNIT",
           "dataSourceName": "TodoTable",
           "requestMappingTemplate": "{ version : 2017-02-28, operation : Scan, }",
           "resolverArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/types/Query/resolvers/getTodos",
           "typeName": "Query",
           "fieldName": "getTodos",
           "responseMappingTemplate": "$util.toJson($ctx.result.items)"
       }
   }
   ```

1. Untuk memodifikasi templat and/or pemetaan bidang resolver, jalankan perintah. [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/update-resolver.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/update-resolver.html)

   Dengan pengecualian `api-id` parameter, parameter yang digunakan dalam `create-resolver` perintah akan ditimpa oleh nilai-nilai baru dari `update-resolver` perintah.

------

## Menambahkan resolver untuk mutasi
<a name="adding-a-resolver-for-mutations"></a>

Langkah selanjutnya adalah membuat resolver untuk tipe Anda`Mutation`.

------
#### [ Console ]

1. Masuk ke Konsol Manajemen AWS dan buka [AppSync konsol](https://console.aws.amazon.com/appsync/).

   1. Di **APIs dasbor**, pilih GraphQL API Anda.

   1. Di **Sidebar**, pilih **Skema**.

1. Di bawah jenis **Mutasi**, pilih **Lampirkan** di sebelah `addTodo` bidang.

1. Pada halaman **Create Resolver**, pilih sumber data yang Anda buat dalam panduan [Melampirkan sumber data](https://docs.aws.amazon.com/appsync/latest/devguide/attaching-a-data-source.html).

1. Di jendela **Configure mapping templates**, Anda harus memodifikasi template permintaan karena ini adalah mutasi di mana Anda menambahkan item baru ke DynamoDB. Gunakan template pemetaan permintaan berikut:

   ```
   {
       "version" : "2017-02-28",
       "operation" : "PutItem",
       "key" : {
           "id" : $util.dynamodb.toDynamoDBJson($ctx.args.id)
       },
       "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args)
   }
   ```

1. AWS AppSync secara otomatis mengonversi argumen yang ditentukan di `addTodo` bidang dari skema GraphQL Anda menjadi operasi DynamoDB. Contoh sebelumnya menyimpan catatan di DynamoDB menggunakan kunci `id` dari, yang dilewatkan dari argumen mutasi sebagai. `$ctx.args.id` Semua bidang lain yang Anda lewati secara otomatis dipetakan ke atribut DynamoDB. `$util.dynamodb.toMapValuesJson($ctx.args)`

   Untuk resolver ini, gunakan template pemetaan respons berikut:

   ```
   $util.toJson($ctx.result)
   ```

   AWS AppSync juga mendukung alur kerja pengujian dan debug untuk mengedit resolver. Anda dapat menggunakan `context` objek tiruan untuk melihat nilai template yang diubah sebelum memanggil. Secara opsional, Anda dapat melihat eksekusi permintaan penuh ke sumber data secara interaktif saat menjalankan kueri. Untuk informasi selengkapnya, lihat [Menguji dan men-debug resolver](test-debug-resolvers.md#aws-appsync-test-debug-resolvers) serta [Monitoring](monitoring.md#aws-appsync-monitoring) dan logging.

1. Pilih **Simpan Resolver**.

------
#### [ API ]

Anda juga dapat melakukan ini APIs dengan menggunakan perintah di bagian [Create your first resolver](https://docs.aws.amazon.com/appsync/latest/devguide/configuring-resolvers.html#create-your-first-resolver) dan rincian parameter dari bagian ini.

------
#### [ CLI ]

Anda juga dapat melakukan ini di CLI dengan memanfaatkan perintah di bagian [Create your first resolver](https://docs.aws.amazon.com/appsync/latest/devguide/configuring-resolvers.html#create-your-first-resolver) dan rincian parameter dari bagian ini.

------

[Pada titik ini, jika Anda tidak menggunakan resolver lanjutan, Anda dapat mulai menggunakan GraphQL API seperti yang diuraikan dalam Menggunakan API Anda.](using-your-api.md#aws-appsync-using-your-api)

## Resolver tingkat lanjut
<a name="advanced-resolvers"></a>

Jika Anda mengikuti bagian Advanced dan Anda sedang membuat skema sampel dalam [Merancang skema Anda](designing-your-schema.md#aws-appsync-designing-your-schema) untuk melakukan pemindaian paginasi, gunakan template permintaan berikut untuk bidang sebagai gantinya: `getTodos`

```
{
    "version" : "2017-02-28",
    "operation" : "Scan",
    "limit": $util.defaultIfNull(${ctx.args.limit}, 20),
    "nextToken": $util.toJson($util.defaultIfNullOrBlank($ctx.args.nextToken, null))
}
```

Untuk kasus penggunaan pagination ini, pemetaan respons lebih dari sekadar passthrough karena harus berisi *kursor* (sehingga klien tahu halaman apa yang akan dimulai selanjutnya) dan set hasil. Template pemetaan adalah sebagai berikut:

```
{
    "todos": $util.toJson($context.result.items),
    "nextToken": $util.toJson($context.result.nextToken)
}
```

Bidang dalam template pemetaan respons sebelumnya harus sesuai dengan bidang yang ditentukan dalam tipe Anda. `TodoConnection`

Untuk kasus relasi di mana Anda memiliki `Comments` tabel dan Anda menyelesaikan kolom komentar pada `Todo` tipe (yang mengembalikan tipe`[Comment]`), Anda dapat menggunakan template pemetaan yang menjalankan kueri terhadap tabel kedua. Untuk melakukan ini, Anda harus sudah membuat sumber data untuk `Comments` tabel seperti yang diuraikan dalam [Melampirkan sumber data](attaching-a-data-source.md#aws-appsync-getting-started-build-a-schema-from-scratch).

**catatan**  
Kami menggunakan operasi kueri terhadap tabel kedua hanya untuk tujuan ilustrasi. Anda dapat menggunakan operasi lain terhadap DynamoDB sebagai gantinya. Selain itu, Anda dapat menarik data dari sumber data lain, seperti AWS Lambda atau Amazon OpenSearch Service, karena relasinya dikendalikan oleh skema GraphQL Anda.

------
#### [ Console ]

1. Masuk ke Konsol Manajemen AWS dan buka [AppSync konsol](https://console.aws.amazon.com/appsync/).

   1. Di **APIs dasbor**, pilih GraphQL API Anda.

   1. Di **Sidebar**, pilih **Skema**.

1. Di bawah tipe **Todo**, pilih **Lampirkan** di sebelah `comments` bidang.

1. Pada halaman **Create Resolver**, pilih sumber data tabel **Komentar** Anda. Nama default untuk tabel **Komentar** dari panduan mulai cepat adalah`AppSyncCommentTable`, tetapi dapat bervariasi tergantung pada nama yang Anda berikan.

1. Tambahkan cuplikan berikut ke template pemetaan permintaan Anda:

   ```
   {
       "version": "2017-02-28",
       "operation": "Query",
       "index": "todoid-index",
       "query": {
           "expression": "todoid = :todoid",
           "expressionValues": {
               ":todoid": {
                   "S": $util.toJson($context.source.id)
               }
           }
       }
   }
   ```

1. `context.source`Referensi objek induk dari bidang saat ini yang sedang diselesaikan. Dalam contoh ini, `source.id` mengacu pada `Todo` objek individu, yang kemudian digunakan untuk ekspresi query.

   Anda dapat menggunakan template pemetaan respons passthrough sebagai berikut:

   ```
   $util.toJson($ctx.result.items)
   ```

1. Pilih **Simpan Resolver**.

1. Terakhir, kembali ke halaman **Skema** di konsol, lampirkan resolver ke `addComment` bidang, dan tentukan sumber data untuk tabel. `Comments` Templat pemetaan permintaan dalam hal ini sederhana `PutItem` dengan spesifik `todoid` yang dikomentari sebagai argumen, tetapi Anda menggunakan `$utils.autoId()` utilitas untuk membuat kunci pengurutan unik untuk komentar sebagai berikut:

   ```
   {
       "version": "2017-02-28",
       "operation": "PutItem",
       "key": {
           "todoid": { "S": $util.toJson($context.arguments.todoid) },
           "commentid": { "S": "$util.autoId()" }
       },
       "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args)
   }
   ```

   Gunakan template respon passthrough sebagai berikut:

   ```
   $util.toJson($ctx.result)
   ```

------
#### [ API ]

Anda juga dapat melakukan ini APIs dengan menggunakan perintah di bagian [Create your first resolver](https://docs.aws.amazon.com/appsync/latest/devguide/configuring-resolvers.html#create-your-first-resolver) dan rincian parameter dari bagian ini.

------
#### [ CLI ]

Anda juga dapat melakukan ini di CLI dengan memanfaatkan perintah di bagian [Create your first resolver](https://docs.aws.amazon.com/appsync/latest/devguide/configuring-resolvers.html#create-your-first-resolver) dan rincian parameter dari bagian ini.

------

# Menonaktifkan template pemetaan VTL dengan penyelesai Lambda langsung (VTL)
<a name="direct-lambda-reference"></a>

**catatan**  
Kami sekarang terutama mendukung runtime APPSYNC\$1JS dan dokumentasinya. [Harap pertimbangkan untuk menggunakan runtime APPSYNC\$1JS dan panduannya di sini.](https://docs.aws.amazon.com/appsync/latest/devguide/configuring-resolvers-js.html)

Dengan penyelesai Lambda langsung, Anda dapat menghindari penggunaan templat pemetaan VTL saat menggunakan sumber data. AWS Lambda AWS AppSync dapat memberikan payload default ke fungsi Lambda Anda serta terjemahan default dari respons fungsi Lambda ke tipe GraphQL. Anda dapat memilih untuk memberikan template permintaan, template respons, atau tidak keduanya dan AWS AppSync akan menanganinya sesuai dengan itu. 

Untuk mempelajari selengkapnya tentang payload permintaan default dan terjemahan respons yang AWS AppSync disediakan, lihat referensi penyelesai [Lambda Langsung](resolver-mapping-template-reference-lambda.md#direct-lambda-resolvers). Untuk informasi selengkapnya tentang menyiapkan sumber AWS Lambda data dan menyiapkan Kebijakan Kepercayaan IAM, lihat [Melampirkan sumber data](attaching-a-data-source.md). 

## Konfigurasikan penyelesai Lambda langsung
<a name="direct-lambda-reference-resolvers"></a>

Bagian berikut akan menunjukkan cara melampirkan sumber data Lambda dan menambahkan resolver Lambda ke bidang Anda.

### Tambahkan sumber data Lambda
<a name="direct-lambda-datasource"></a>

Sebelum Anda dapat mengaktifkan resolver Lambda langsung, Anda harus menambahkan sumber data Lambda.

------
#### [ Console ]

1. Masuk ke Konsol Manajemen AWS dan buka [AppSynckonsol](https://console.aws.amazon.com/appsync/).

   1. Di **APIs dasbor**, pilih GraphQL API Anda.

   1. Di **Sidebar**, pilih **Sumber data**.

1. Pilih **Buat sumber data**.

   1. Untuk **nama sumber data**, masukkan nama untuk sumber data Anda, seperti**myFunction**. 

   1. Untuk **tipe sumber data**, pilih **AWS Lambda fungsi**.

   1. Untuk **Wilayah**, pilih wilayah yang sesuai.

   1. Untuk **Fungsi ARN**, pilih fungsi Lambda dari daftar dropdown. Anda dapat mencari nama fungsi atau secara manual memasukkan ARN dari fungsi yang ingin Anda gunakan. 

   1. Buat peran IAM baru (disarankan) atau pilih peran yang sudah ada yang memiliki izin `lambda:invokeFunction` IAM. Peran yang ada memerlukan kebijakan kepercayaan, seperti yang dijelaskan di bagian [Melampirkan sumber data](attaching-a-data-source.md). 

      Berikut ini adalah contoh kebijakan IAM yang memiliki izin yang diperlukan untuk melakukan operasi pada sumber daya:

------
#### [ JSON ]

****  

      ```
      { 
           "Version":"2012-10-17",		 	 	  
           "Statement": [ 
               { 
                   "Effect": "Allow", 
                   "Action": [ "lambda:invokeFunction" ], 
                   "Resource": [ 
                       "arn:aws:lambda:us-west-2:123456789012:function:myFunction", 
                       "arn:aws:lambda:us-west-2:123456789012:function:myFunction:*" 
                   ] 
               } 
           ] 
       }
      ```

------

1. Pilih tombol **Buat**.

------
#### [ CLI ]

1. Buat objek sumber data dengan menjalankan [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/create-data-source.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/create-data-source.html)perintah.

   Anda harus mengetikkan 4 parameter untuk perintah khusus ini:

   1. API Anda. `api-id`

   1. `name`Dari sumber data Anda. Dalam contoh konsol, ini adalah **nama sumber data**.

   1. `type`Sumber data. Dalam contoh konsol, ini adalah **AWS Lambda fungsi**.

   1. The`lambda-config`, yang merupakan **Fungsi ARN** dalam contoh konsol.
**catatan**  
Ada parameter lain seperti `Region` yang harus dikonfigurasi tetapi biasanya akan default ke nilai konfigurasi CLI Anda.

   Contoh perintah mungkin terlihat seperti ini:

   ```
   aws appsync create-data-source --api-id abcdefghijklmnopqrstuvwxyz --name myFunction --type AWS_LAMBDA --lambda-config lambdaFunctionArn=arn:aws:lambda:us-west-2:102847592837:function:appsync-lambda-example
   ```

   Output akan dikembalikan dalam CLI. Inilah contohnya:

   ```
   {
       "dataSource": {
           "dataSourceArn": "arn:aws:appsync:us-west-2:102847592837:apis/abcdefghijklmnopqrstuvwxyz/datasources/myFunction",
           "type": "AWS_LAMBDA",
           "name": "myFunction",
           "lambdaConfig": {
               "lambdaFunctionArn": "arn:aws:lambda:us-west-2:102847592837:function:appsync-lambda-example"
           }
       }
   }
   ```

1. Untuk memodifikasi atribut sumber data, jalankan [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/update-data-source.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/update-data-source.html)perintah.

   Dengan pengecualian `api-id` parameter, parameter yang digunakan dalam `create-data-source` perintah akan ditimpa oleh nilai-nilai baru dari `update-data-source` perintah.

------

### Aktifkan penyelesai Lambda langsung
<a name="direct-lambda-enable-templates"></a>

Setelah membuat sumber data Lambda dan menyiapkan peran IAM yang sesuai untuk memungkinkan menjalankan fungsi, Anda dapat AWS AppSync menautkannya ke fungsi resolver atau pipeline. 

------
#### [ Console ]

1. Masuk ke Konsol Manajemen AWS dan buka [AppSynckonsol](https://console.aws.amazon.com/appsync/).

   1. Di **APIs dasbor**, pilih GraphQL API Anda.

   1. Di **Sidebar**, pilih **Skema**.

1. Di jendela **Resolvers**, pilih bidang atau operasi dan kemudian pilih tombol **Lampirkan**.

1. Di halaman **Create new resolver**, pilih fungsi Lambda dari daftar dropdown.

1. **Untuk memanfaatkan penyelesai Lambda langsung, konfirmasikan bahwa templat pemetaan permintaan dan respons dinonaktifkan di bagian Konfigurasi templat pemetaan.**

1. Pilih tombol **Simpan Resolver**.

------
#### [ CLI ]
+ Buat resolver dengan menjalankan perintah. [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/create-resolver.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/create-resolver.html)

  Anda harus mengetikkan 6 parameter untuk perintah khusus ini:

  1. API Anda. `api-id`

  1. `type-name`Jenis dalam skema Anda.

  1. `field-name`Bidang dalam skema Anda.

  1. Nama`data-source-name`, atau fungsi Lambda Anda.

  1. Itu`request-mapping-template`, yang merupakan badan permintaan. Dalam contoh konsol, ini dinonaktifkan:

     ```
     " "
     ```

  1. Itu`response-mapping-template`, yang merupakan tubuh respons. Dalam contoh konsol, ini juga dinonaktifkan:

     ```
     " "
     ```

  Contoh perintah mungkin terlihat seperti ini:

  ```
  aws appsync create-resolver --api-id abcdefghijklmnopqrstuvwxyz --type-name Subscription --field-name onCreateTodo --data-source-name LambdaTest --request-mapping-template " " --response-mapping-template " "
  ```

  Output akan dikembalikan dalam CLI. Inilah contohnya:

  ```
  {
      "resolver": {
          "resolverArn": "arn:aws:appsync:us-west-2:102847592837:apis/abcdefghijklmnopqrstuvwxyz/types/Subscription/resolvers/onCreateTodo",
          "typeName": "Subscription",
          "kind": "UNIT",
          "fieldName": "onCreateTodo",
          "dataSourceName": "LambdaTest"
      }
  }
  ```

------

Ketika Anda menonaktifkan template pemetaan Anda, ada beberapa perilaku tambahan yang akan terjadi di AWS AppSync:
+ [Dengan menonaktifkan template pemetaan, Anda memberi sinyal AWS AppSync bahwa Anda menerima terjemahan data default yang ditentukan dalam referensi penyelesai Lambda Langsung.](resolver-mapping-template-reference-lambda.md#direct-lambda-resolvers)
+ [Dengan menonaktifkan template pemetaan permintaan, sumber data Lambda Anda akan menerima payload yang terdiri dari seluruh objek Context.](resolver-context-reference.md)
+ Dengan menonaktifkan template pemetaan respons, hasil pemanggilan Lambda Anda akan diterjemahkan tergantung pada versi templat pemetaan permintaan atau jika templat pemetaan permintaan juga dinonaktifkan. 

# Menguji dan men-debug resolver di AWS AppSync (VTL)
<a name="test-debug-resolvers"></a>

**catatan**  
Kami sekarang terutama mendukung runtime APPSYNC\$1JS dan dokumentasinya. [Harap pertimbangkan untuk menggunakan runtime APPSYNC\$1JS dan panduannya di sini.](https://docs.aws.amazon.com/appsync/latest/devguide/configuring-resolvers-js.html)

AWS AppSync mengeksekusi resolver pada bidang GraphQL terhadap sumber data. Seperti yang dijelaskan dalam [ikhtisar template pemetaan Resolver](resolver-mapping-template-reference-overview.md#aws-appsync-resolver-mapping-template-reference-overview), resolver berkomunikasi dengan sumber data dengan menggunakan bahasa templating. Ini memungkinkan Anda untuk menyesuaikan perilaku dan menerapkan logika dan kondisi sebelum dan sesudah berkomunikasi dengan sumber data. [Untuk panduan pemrograman gaya tutorial pengantar untuk menulis resolver, lihat panduan pemrograman template pemetaan Resolver.](resolver-mapping-template-reference-programming-guide.md#aws-appsync-resolver-mapping-template-reference-programming-guide)

Untuk membantu pengembang menulis, menguji, dan men-debug resolver ini, AWS AppSync konsol juga menyediakan alat untuk membuat permintaan dan respons GraphQL dengan data tiruan ke penyelesai bidang individual. Selain itu, Anda dapat melakukan kueri, mutasi, dan langganan di AWS AppSync konsol dan melihat aliran log terperinci dari Amazon CloudWatch dari seluruh permintaan. Ini termasuk hasil dari sumber data.

## Pengujian dengan data tiruan
<a name="testing-with-mock-data"></a>

Ketika resolver GraphQL dipanggil, itu berisi objek yang berisi informasi tentang `context` permintaan. Ini termasuk argumen dari klien, informasi identitas, dan data dari bidang GraphQL induk. Ini juga berisi hasil dari sumber data, yang dapat digunakan dalam template respons. Untuk informasi selengkapnya tentang struktur ini dan utilitas pembantu yang tersedia untuk digunakan saat pemrograman, lihat Referensi Konteks Template [Pemetaan Resolver](resolver-context-reference.md#aws-appsync-resolver-mapping-template-context-reference).

Saat menulis atau mengedit resolver, Anda dapat meneruskan objek *konteks *tiruan* atau pengujian* ke editor konsol. Ini memungkinkan Anda untuk melihat bagaimana permintaan dan template respons mengevaluasi tanpa benar-benar berjalan terhadap sumber data. Misalnya, Anda dapat lulus `firstname: Shaggy` argumen pengujian dan melihat bagaimana itu mengevaluasi saat menggunakan `$ctx.args.firstname` dalam kode template Anda. Anda juga dapat menguji evaluasi setiap pembantu utilitas seperti `$util.autoId()` atau`util.time.nowISO8601()`.

### Menguji penyelesai
<a name="test-a-resolver"></a>

Contoh ini akan menggunakan AWS AppSync konsol untuk menguji resolver.

1. Masuk ke Konsol Manajemen AWS dan buka [AppSynckonsol](https://console.aws.amazon.com/appsync/).

   1. Di **APIs dasbor**, pilih GraphQL API Anda.

   1. Di **Sidebar**, pilih **Skema**.

1. Jika Anda belum melakukannya, di bawah tipe dan di samping bidang, pilih **Lampirkan** untuk menambahkan resolver Anda.

   [Untuk informasi selengkapnya tentang cara membuat resolver conplete, lihat Mengonfigurasi resolver.](https://docs.aws.amazon.com/appsync/latest/devguide/configuring-resolvers.html)

   Jika tidak, pilih resolver yang sudah ada di lapangan.

1. Di bagian atas halaman **Edit resolver**, **pilih Pilih konteks pengujian, pilih Buat konteks** **baru**.

1. Pilih objek konteks sampel atau isi JSON secara manual di jendela **konteks Eksekusi di bawah** ini.

1. Masukkan **nama konteks Teks**.

1. Pilih tombol **Simpan**.

1. Di bagian atas halaman **Edit Resolver**, pilih **Run** test.

Untuk contoh yang lebih praktis, misalkan Anda memiliki aplikasi yang menyimpan tipe `Dog` GraphQL yang menggunakan pembuatan ID otomatis untuk objek dan menyimpannya di Amazon DynamoDB. Anda juga ingin menulis beberapa nilai dari argumen mutasi GraphQL, dan hanya mengizinkan pengguna tertentu untuk melihat respons. Berikut ini menunjukkan seperti apa skema itu:

```
type Dog {
  breed: String
  color: String
}

type Mutation {
  addDog(firstname: String, age: Int): Dog
}
```

Saat Anda menambahkan resolver untuk `addDog` mutasi, Anda dapat mengisi objek konteks seperti contoh berikut. Berikut ini memiliki argumen dari klien `name` dan`age`, dan `username` diisi dalam `identity` objek:

```
{
    "arguments" : {
        "firstname": "Shaggy",
        "age": 4
    },
    "source" : {},
    "result" : {
        "breed" : "Miniature Schnauzer",
        "color" : "black_grey"
    },
    "identity": {
        "sub" : "uuid",
        "issuer" : " https://cognito-idp.{region}.amazonaws.com/{userPoolId}",
        "username" : "Nadia",
        "claims" : { },
        "sourceIp" :[  "x.x.x.x" ],
        "defaultAuthStrategy" : "ALLOW"
    }
}
```

Anda dapat menguji ini menggunakan templat pemetaan permintaan dan respons berikut:

 **Templat Permintaan** 

```
{
    "version" : "2017-02-28",
    "operation" : "PutItem",
    "key" : {
        "id" : { "S" : "$util.autoId()" }
    },
    "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args)
}
```

 **Template Respon** 

```
#if ($context.identity.username == "Nadia")
  $util.toJson($ctx.result)
#else
  $util.unauthorized()
#end
```

Template yang dievaluasi memiliki data dari objek konteks pengujian Anda dan nilai yang dihasilkan dari`$util.autoId()`. Selain itu, jika Anda mengubah `username` ke nilai selain`Nadia`, hasilnya tidak akan dikembalikan karena pemeriksaan otorisasi akan gagal. Untuk informasi selengkapnya tentang kontrol akses berbutir halus, lihat Kasus [penggunaan otorisasi](security-authorization-use-cases.md#aws-appsync-security-authorization-use-cases).

### Menguji template pemetaan dengan's AWS AppSync APIs
<a name="testing-with-appsync-api"></a>

Anda dapat menggunakan perintah `EvaluateMappingTemplate` API untuk menguji template pemetaan Anda dari jarak jauh dengan data tiruan. Untuk memulai dengan perintah, pastikan Anda telah menambahkan `appsync:evaluateMappingTemplate` izin ke kebijakan Anda. Contoh:

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "appsync:evaluateMappingTemplate",
            "Resource": "arn:aws:appsync:us-east-1:111122223333:*"
        }
    ]
}
```

------

Anda dapat memanfaatkan perintah dengan menggunakan [AWS CLI](https://aws.amazon.com/cli/)atau [AWS SDKs](https://aws.amazon.com/tools/). Misalnya, ambil `Dog` skema dan templat request/response pemetaannya dari bagian sebelumnya. Menggunakan CLI di stasiun lokal Anda, simpan template permintaan ke file bernama`request.vtl`, lalu simpan `context` objek ke file bernama. `context.json` Dari shell Anda, jalankan perintah berikut:

```
aws appsync evaluate-mapping-template --template file://request.vtl --context file://context.json
```

Perintah mengembalikan respon berikut:

```
{
  "evaluationResult": "{\n    \"version\" : \"2017-02-28\",\n    \"operation\" : \"PutItem\",\n    \"key\" : {\n        \"id\" : { \"S\" : \"afcb4c85-49f8-40de-8f2b-248949176456\" }\n    },\n    \"attributeValues\" : {\"firstname\":{\"S\":\"Shaggy\"},\"age\":{\"N\":4}}\n}\n"
}
```

`evaluationResult`Berisi hasil pengujian template yang Anda berikan dengan yang disediakan`context`. Anda juga dapat menguji template Anda menggunakan AWS SDKs. Berikut adalah contoh menggunakan AWS SDK untuk JavaScript V2: 

```
const AWS = require('aws-sdk')
const client = new AWS.AppSync({ region: 'us-east-2' })

const template = fs.readFileSync('./request.vtl', 'utf8')
const context = fs.readFileSync('./context.json', 'utf8')

client
  .evaluateMappingTemplate({ template, context })
  .promise()
  .then((data) => console.log(data))
```

Menggunakan SDK, Anda dapat dengan mudah menggabungkan pengujian dari rangkaian pengujian favorit Anda untuk memvalidasi perilaku template Anda. Sebaiknya buat pengujian menggunakan [Jest Testing Framework](https://jestjs.io/), tetapi rangkaian pengujian apa pun berfungsi. Cuplikan berikut menunjukkan validasi hipotetis berjalan. Perhatikan bahwa kami mengharapkan respons evaluasi menjadi JSON yang valid, jadi kami gunakan `JSON.parse` untuk mengambil JSON dari respons string:

```
const AWS = require('aws-sdk')
const fs = require('fs')
const client = new AWS.AppSync({ region: 'us-east-2' })

test('request correctly calls DynamoDB', async () => {
  const template = fs.readFileSync('./request.vtl', 'utf8')
  const context = fs.readFileSync('./context.json', 'utf8')
  const contextJSON = JSON.parse(context)
  
  const response = await client.evaluateMappingTemplate({ template, context }).promise()
  const result = JSON.parse(response.evaluationResult)
  
  expect(result.key.id.S).toBeDefined()
  expect(result.attributeValues.firstname.S).toEqual(contextJSON.arguments.firstname)
})
```

 Ini menghasilkan hasil sebagai berikut:

```
Ran all test suites.
> jest

PASS ./index.test.js
✓ request correctly calls DynamoDB (543 ms)

Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 1.511 s, estimated 2 s
```

## Mendebug kueri langsung
<a name="debugging-a-live-query"></a>

Tidak ada pengganti untuk end-to-end pengujian dan logging untuk men-debug aplikasi produksi. AWS AppSync memungkinkan Anda mencatat kesalahan dan detail permintaan lengkap menggunakan Amazon CloudWatch. Selain itu, Anda dapat menggunakan AWS AppSync konsol untuk menguji kueri GraphQL, mutasi, dan langganan serta data log streaming langsung untuk setiap permintaan kembali ke editor kueri untuk di-debug secara real time. Untuk langganan, log menampilkan informasi waktu koneksi.

Untuk melakukan ini, Anda harus mengaktifkan CloudWatch log Amazon terlebih dahulu, seperti yang dijelaskan dalam [Pemantauan dan pencatatan](monitoring.md#aws-appsync-monitoring). Selanjutnya, di AWS AppSync konsol, pilih tab **Queries dan kemudian masukkan kueri** GraphQL yang valid. Di bagian kanan bawah, klik dan seret jendela **Log** untuk membuka tampilan log. Di bagian atas halaman, pilih ikon panah putar untuk menjalankan kueri GraphQL Anda. Dalam beberapa saat, log permintaan dan respons lengkap Anda untuk operasi dialirkan ke bagian ini dan Anda dapat melihatnya di konsol.

# Mengkonfigurasi dan menggunakan resolver pipa di AWS AppSync (VTL)
<a name="pipeline-resolvers"></a>

**catatan**  
Kami sekarang terutama mendukung runtime APPSYNC\$1JS dan dokumentasinya. [Harap pertimbangkan untuk menggunakan runtime APPSYNC\$1JS dan panduannya di sini.](https://docs.aws.amazon.com/appsync/latest/devguide/configuring-resolvers-js.html)

AWS AppSync mengeksekusi resolver pada bidang GraphQL. Dalam beberapa kasus, aplikasi memerlukan eksekusi beberapa operasi untuk menyelesaikan satu bidang GraphQL. Dengan resolver pipeline, pengembang sekarang dapat membuat operasi yang disebut Fungsi dan menjalankannya secara berurutan. Pipeline resolver berguna untuk aplikasi yang, misalnya, memerlukan melakukan pemeriksaan otorisasi sebelum mengambil data untuk bidang.

Pipeline resolver terdiri dari template **Sebelum** pemetaan, template **After** mapping, dan daftar Functions. Setiap Fungsi memiliki template pemetaan **permintaan** dan **respons** yang dijalankan terhadap sumber data. Karena penyelesai pipa mendelegasikan eksekusi ke daftar fungsi, oleh karena itu tidak ditautkan ke sumber data apa pun. Resolver dan fungsi unit adalah primitif yang menjalankan operasi terhadap sumber data. Lihat [ikhtisar template pemetaan Resolver](resolver-mapping-template-reference-overview.md#aws-appsync-resolver-mapping-template-reference-overview) untuk informasi selengkapnya.

## Langkah 1: Membuat resolver pipa
<a name="create-a-pipeline-resolver"></a>

Di AWS AppSync konsol, buka halaman **Skema**.

Simpan skema berikut:

```
schema {
    query: Query
    mutation: Mutation
}

type Mutation {
    signUp(input: Signup): User
}

type Query {
    getUser(id: ID!): User
}

input Signup {
    username: String!
    email: String!
}

type User {
    id: ID!
    username: String
    email: AWSEmail
}
```

**Kita akan memasang resolver pipa ke bidang **SignUp** pada tipe Mutasi.** Pada tipe **Mutasi** di sisi kanan, pilih **Lampirkan** di sebelah bidang `signUp` mutasi. Pada halaman create resolver, klik **Actions**, lalu **Update** runtime. Pilih`Pipeline Resolver`, lalu pilih`VTL`, lalu pilih **Perbarui**. Halaman sekarang harus menampilkan tiga bagian: area teks **Sebelum memetakan template**, bagian **Fungsi**, dan area teks **template Setelah pemetaan**.

Pipeline resolver kami mendaftarkan pengguna dengan terlebih dahulu memvalidasi input alamat email dan kemudian menyimpan pengguna dalam sistem. **Kita akan merangkum validasi email di dalam fungsi ValidateEmail, dan menyimpan pengguna di dalam fungsi **SaveUser**.** **Fungsi **ValidateEmail** dijalankan terlebih dahulu, dan jika email valid, maka fungsi SaveUser dijalankan.**

Alur eksekusi adalah sebagai berikut:

1. Templat pemetaan permintaan resolver mutation.signup

1. fungsi ValidateEmail

1. Fungsi SaveUser

1. Templat pemetaan respons penyelesai mutasi.signup

Karena kami mungkin akan menggunakan kembali fungsi **ValidateEmail** di resolver lain di API kami, kami ingin menghindari mengakses `$ctx.args` karena ini akan berubah dari satu bidang GraphQL ke bidang GraphQL lainnya. Sebagai gantinya, kita dapat menggunakan `$ctx.stash` untuk menyimpan atribut email dari argumen field `signUp(input: Signup)` input.

**SEBELUM** template pemetaan:

```
## store email input field into a generic email key
$util.qr($ctx.stash.put("email", $ctx.args.input.email))
{}
```

Konsol menyediakan passthrough default **setelah** template pemetaan yang akan kita gunakan:

```
$util.toJson($ctx.result)
```

Pilih **Buat** atau **Simpan** untuk memperbarui resolver.

## Langkah 2: Membuat fungsi
<a name="create-a-function"></a>

Dari halaman resolver pipeline, di bagian **Functions**, klik **Add function**, lalu **Create new** function. Dimungkinkan juga untuk membuat fungsi tanpa melalui halaman resolver; untuk melakukan ini, di AWS AppSync konsol, buka halaman **Fungsi**. Pilih tombol **Create Function**. Mari buat fungsi yang memeriksa apakah email valid dan berasal dari domain tertentu. Jika email tidak valid, fungsi tersebut menimbulkan kesalahan. Jika tidak, itu meneruskan input apa pun yang diberikan.

Pada halaman fungsi baru, pilih **Tindakan**, lalu **Perbarui runtime**. Pilih`VTL`, lalu **Perbarui**. Pastikan Anda telah membuat sumber data dari tipe **NONE**. Pilih sumber data ini di daftar **Nama sumber data**. Untuk **nama fungsi**, masukkan`validateEmail`. Di area **kode fungsi**, timpa semuanya dengan cuplikan ini:

```
#set($valid = $util.matches("^[a-zA-Z0-9_.+-]+@(?:(?:[a-zA-Z0-9-]+\.)?[a-zA-Z]+\.)?(myvaliddomain)\.com", $ctx.stash.email))
#if (!$valid)
    $util.error("$ctx.stash.email is not a valid email.")
#end
{
    "payload": { "email": $util.toJson(${ctx.stash.email}) }
}
```

Tempelkan ini ke template pemetaan respons:

```
$util.toJson($ctx.result)
```

Tinjau perubahan Anda, lalu pilih **Buat**. Kami baru saja membuat fungsi **ValidateEmail** kami. ****Ulangi langkah-langkah ini untuk membuat fungsi SaveUser dengan template pemetaan permintaan dan respons berikut (Demi kesederhanaan, kami menggunakan sumber data NONE dan berpura-pura pengguna telah disimpan dalam sistem setelah fungsi dijalankan.**** ): 

Permintaan template pemetaan:

```
## $ctx.prev.result contains the signup input values. We could have also
## used $ctx.args.input.
{
    "payload": $util.toJson($ctx.prev.result)
}
```

Templat pemetaan respons:

```
## an id is required so let's add a unique random identifier to the output
$util.qr($ctx.result.put("id", $util.autoId()))
$util.toJson($ctx.result)
```

Kami baru saja membuat fungsi **SaveUser** kami.

## Langkah 3: Menambahkan fungsi ke resolver pipa
<a name="adding-a-function-to-a-pipeline-resolver"></a>

Fungsi kita seharusnya ditambahkan secara otomatis ke resolver pipeline yang baru saja kita buat. Jika ini bukan masalahnya, atau Anda membuat fungsi melalui halaman **Fungsi**, Anda dapat mengklik **Tambahkan fungsi** pada halaman resolver untuk melampirkannya. Tambahkan fungsi **ValidateEmail** **dan SaveUser ke resolver**. **Fungsi **ValidateEmail** harus ditempatkan sebelum fungsi SaveUser.** Saat Anda menambahkan lebih banyak fungsi, Anda dapat menggunakan opsi **pindah ke atas** dan **bergerak ke bawah** untuk mengatur ulang urutan eksekusi fungsi Anda. Tinjau perubahan Anda, lalu pilih **Simpan**.

## Langkah 4: Menjalankan kueri
<a name="executing-a-query"></a>

Di AWS AppSync konsol, buka halaman **Kueri.** Di penjelajah, pastikan Anda menggunakan mutasi Anda. Jika tidak, pilih `Mutation` di daftar drop-down, lalu pilih`+`. Masukkan kueri berikut:

```
mutation {
  signUp(input: {
    email: "nadia@myvaliddomain.com"
    username: "nadia"
  }) {
    id
    email
  }
}
```

Ini harus mengembalikan sesuatu seperti:

```
{
  "data": {
    "signUp": {
      "id": "256b6cc2-4694-46f4-a55e-8cb14cc5d7fc",
      "email": "nadia@myvaliddomain.com"
    }
  }
}
```

Kami telah berhasil mendaftarkan pengguna kami dan memvalidasi email input menggunakan resolver pipeline. Untuk mengikuti tutorial yang lebih lengkap yang berfokus pada resolver pipeline, Anda dapat pergi ke [Tutorial:](tutorial-pipeline-resolvers.md#aws-appsync-tutorial-pipeline-resolvers) Pipeline Resolvers 

# Menggunakan AWS AppSync API dengan AWS CDK
<a name="using-your-api"></a>

**Tip**  
[Sebelum Anda menggunakan CDK, kami sarankan untuk meninjau [dokumentasi resmi](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html) CDK bersama dengan referensi CDK AWS AppSync.](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync-readme.html)  
Kami juga merekomendasikan untuk memastikan bahwa instalasi [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) dan [NPM](https://docs.npmjs.com/) Anda bekerja pada sistem Anda.

Pada bagian ini, kita akan membuat aplikasi CDK sederhana yang dapat menambahkan dan mengambil item dari tabel DynamoDB. Ini dimaksudkan untuk menjadi contoh quickstart menggunakan beberapa kode dari bagian [Merancang skema Anda](https://docs.aws.amazon.com/appsync/latest/devguide/designing-your-schema.html), [Melampirkan sumber data](https://docs.aws.amazon.com/appsync/latest/devguide/attaching-a-data-source.html), dan [Mengkonfigurasi resolvers](https://docs.aws.amazon.com/appsync/latest/devguide/configuring-resolvers-js.html) (). JavaScript

## Menyiapkan proyek CDK
<a name="Setting-up-a-cdk-project"></a>

**Awas**  
Langkah-langkah ini mungkin tidak sepenuhnya akurat tergantung pada lingkungan Anda. Kami berasumsi sistem Anda memiliki utilitas yang diperlukan yang diinstal, cara untuk berinteraksi dengan AWS layanan, dan konfigurasi yang tepat di tempat.

Langkah pertama adalah menginstal AWS CDK. Di CLI Anda, Anda dapat memasukkan perintah berikut:

```
npm install -g aws-cdk
```

Selanjutnya, Anda perlu membuat direktori proyek, lalu arahkan ke sana. Contoh set perintah untuk membuat dan menavigasi ke direktori adalah:

```
mkdir example-cdk-app
cd example-cdk-app
```

Selanjutnya, Anda perlu membuat aplikasi. Layanan kami terutama menggunakan TypeScript. Di direktori proyek Anda, masukkan perintah berikut:

```
cdk init app --language typescript
```

Ketika Anda melakukan ini, aplikasi CDK bersama dengan file inisialisasi akan diinstal:

![\[Terminal output showing Git repository initialization and npm install completion.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/cdk-init-app-example.png)


Struktur proyek Anda mungkin terlihat seperti ini:

![\[Project directory structure showing folders and files for an example CDK app.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/cdk-init-directories.png)


Anda akan melihat kami memiliki beberapa direktori penting:
+ `bin`: File bin awal akan membuat aplikasi. Kami tidak akan menyentuh ini dalam panduan ini.
+ `lib`: Direktori lib berisi file tumpukan Anda. Anda dapat menganggap file tumpukan sebagai unit eksekusi individual. Konstruksi akan berada di dalam file tumpukan kami. Pada dasarnya, ini adalah sumber daya untuk layanan yang akan diputar CloudFormation saat aplikasi diterapkan. Di sinilah sebagian besar pengkodean kami akan terjadi.
+ `node_modules`: Direktori ini dibuat oleh NPM dan berisi semua dependensi paket yang Anda instal menggunakan perintah. `npm`

File tumpukan awal kami mungkin berisi sesuatu seperti ini:

```
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
// import * as sqs from 'aws-cdk-lib/aws-sqs';

export class ExampleCdkAppStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here

    // example resource
    // const queue = new sqs.Queue(this, 'ExampleCdkAppQueue', {
    //   visibilityTimeout: cdk.Duration.seconds(300)
    // });
  }
}
```

Ini adalah kode boilerplate untuk membuat tumpukan di aplikasi kita. Sebagian besar kode kita dalam contoh ini akan masuk ke dalam lingkup kelas ini.

Untuk memverifikasi bahwa file stack Anda ada di aplikasi, di direktori aplikasi Anda, jalankan perintah berikut di terminal:

```
cdk ls
```

Daftar tumpukan Anda akan muncul. Jika tidak, maka Anda mungkin perlu menjalankan langkah-langkah lagi atau memeriksa dokumentasi resmi untuk bantuan.

Jika Anda ingin membuat perubahan kode Anda sebelum menerapkan, Anda selalu dapat menjalankan perintah berikut di terminal:

```
npm run build
```

Dan, untuk melihat perubahan sebelum menerapkan:

```
cdk diff
```

Sebelum kita menambahkan kode kita ke file stack, kita akan melakukan bootstrap. Bootstrapping memungkinkan kami menyediakan sumber daya untuk CDK sebelum aplikasi diterapkan. Informasi lebih lanjut tentang proses ini dapat ditemukan [di sini](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html). Untuk membuat bootstrap, perintahnya adalah:

```
cdk bootstrap aws://ACCOUNT-NUMBER/REGION
```

**Tip**  
Langkah ini memerlukan beberapa izin IAM di akun Anda. Bootstrap Anda akan ditolak jika Anda tidak memilikinya. Jika ini terjadi, Anda mungkin harus menghapus sumber daya yang tidak lengkap yang disebabkan oleh bootstrap seperti bucket S3 yang dihasilkannya.

Bootstrap akan memutar beberapa sumber daya. Pesan terakhir akan terlihat seperti ini:

![\[Terminal output showing successful bootstrapping of an AWS environment.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/cdk-init-bootstrap-final.png)


Ini dilakukan sekali per akun per Wilayah, jadi Anda tidak perlu sering melakukannya. Sumber daya utama bootstrap adalah CloudFormation tumpukan dan bucket Amazon S3.

Bucket Amazon S3 digunakan untuk menyimpan file dan peran IAM yang memberikan izin yang diperlukan untuk melakukan penerapan. Sumber daya yang diperlukan didefinisikan dalam CloudFormation tumpukan, yang disebut tumpukan bootstrap, yang biasanya diberi nama`CDKToolkit`. Seperti CloudFormation tumpukan apa pun, itu muncul di CloudFormation konsol setelah digunakan:

![\[CDKToolkit stack with CREATE_COMPLETE status in CloudFormation console.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/cdk-init-bootstrap-cfn-console.png)


Hal yang sama dapat dikatakan untuk ember:

![\[S3 bucket details showing name, region, access settings, and creation date.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/cdk-init-bootstrap-bucket-console.png)


Untuk mengimpor layanan yang kita butuhkan di file stack kita, kita dapat menggunakan perintah berikut:

```
npm install aws-cdk-lib # V2 command
```

**Tip**  
Jika Anda mengalami masalah dengan V2, Anda dapat menginstal pustaka individual menggunakan perintah V1:  

```
npm install @aws-cdk/aws-appsync @aws-cdk/aws-dynamodb
```
Kami tidak merekomendasikan ini karena V1 telah usang.

## Menerapkan proyek CDK - Skema
<a name="implementing-a-cdk-project-schema"></a>

Kita sekarang dapat mulai menerapkan kode kita. Pertama, kita harus membuat skema kita. Anda cukup membuat `.graphql` file di aplikasi Anda:

```
mkdir schema
touch schema.graphql
```

Dalam contoh kami, kami menyertakan direktori tingkat atas `schema` yang disebut berisi: `schema.graphql`

![\[File structure showing a schema folder containing schema.graphql file.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/cdk-code-schema-directory.png)


Di dalam skema kita, mari kita sertakan contoh sederhana:

```
input CreatePostInput {
    title: String
    content: String
}

type Post {
    id: ID!
    title: String
    content: String
}

type Mutation {
    createPost(input: CreatePostInput!): Post
}

type Query {
    getPost: [Post]
}
```

Kembali ke file tumpukan kami, kami perlu memastikan arahan impor berikut ditentukan:

```
import * as cdk from 'aws-cdk-lib';
import * as appsync from 'aws-cdk-lib/aws-appsync';
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
import { Construct } from 'constructs';
```

Di dalam kelas, kita akan menambahkan kode untuk membuat GraphQL API kita dan menghubungkannya ke file kita: `schema.graphql`

```
export class ExampleCdkAppStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    
    // makes a GraphQL API
    const api = new appsync.GraphqlApi(this, 'post-apis', {
      name: 'api-to-process-posts',
      schema: appsync.SchemaFile.fromAsset('schema/schema.graphql'),
    });
  }
}
```

Kami juga akan menambahkan beberapa kode untuk mencetak URL GraphQL, kunci API, dan Wilayah:

```
export class ExampleCdkAppStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    
    // Makes a GraphQL API construct
    const api = new appsync.GraphqlApi(this, 'post-apis', {
      name: 'api-to-process-posts',
      schema: appsync.SchemaFile.fromAsset('schema/schema.graphql'),
    });

    // Prints out URL
    new cdk.CfnOutput(this, "GraphQLAPIURL", {
      value: api.graphqlUrl
    });

    // Prints out the AppSync GraphQL API key to the terminal
    new cdk.CfnOutput(this, "GraphQLAPIKey", {
      value: api.apiKey || ''
    });

    // Prints out the stack region to the terminal
    new cdk.CfnOutput(this, "Stack Region", {
      value: this.region
    });
  }
}
```

Pada titik ini, kita akan menggunakan deploy aplikasi kita lagi:

```
cdk deploy
```

Ini adalah hasilnya:

![\[Deployment output showing ExampleCdkAppStack details, including GraphQL API URL and stack region.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/cdk-code-deploy-schema.png)


Tampaknya contoh kami berhasil, tetapi mari kita periksa AWS AppSync konsol hanya untuk mengonfirmasi:

![\[GraphQL interface showing successful API request with response data displayed.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/cdk-code-deploy-schema-result-1.png)


Tampaknya API kami telah dibuat. Sekarang, kita akan memeriksa skema yang dilampirkan ke API:

![\[GraphQL schema defining CreatePostInput, Post type, Mutation, and Query operations.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/cdk-code-deploy-schema-result-2.png)


Ini tampaknya cocok dengan kode skema kami, jadi berhasil. Cara lain untuk mengonfirmasi ini dari sudut pandang metadata adalah dengan melihat tumpukan: CloudFormation 

![\[CloudFormation stack showing ExampleCdkAppStack update complete and CDKToolkit creation complete.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/cdk-code-deploy-schema-result-3.png)


Saat kami menerapkan aplikasi CDK kami, aplikasi ini akan CloudFormation memutar sumber daya seperti bootstrap. Setiap tumpukan dalam aplikasi kami memetakan 1:1 dengan CloudFormation tumpukan. Jika Anda kembali ke kode tumpukan, nama tumpukan diambil dari nama `ExampleCdkAppStack` kelas. Anda dapat melihat sumber daya yang dibuatnya, yang juga cocok dengan konvensi penamaan kami di konstruksi GraphQL API kami:

![\[Expanded view of post-apis resource showing Schema, DefaultApiKey, and CDKMetadata.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/cdk-code-deploy-schema-result-4.png)


## Menerapkan proyek CDK - Sumber data
<a name="implementing-a-cdk-project-data-source"></a>

Selanjutnya, kita perlu menambahkan sumber data kita. Contoh kita akan menggunakan tabel DynamoDB. Di dalam kelas stack, kita akan menambahkan beberapa kode untuk membuat tabel baru:

```
export class ExampleCdkAppStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // Makes a GraphQL API construct
    const api = new appsync.GraphqlApi(this, 'post-apis', {
      name: 'api-to-process-posts',
      schema: appsync.SchemaFile.fromAsset('schema/schema.graphql'),
    });

    //creates a DDB table
    const add_ddb_table = new dynamodb.Table(this, 'posts-table', {
      partitionKey: {
        name: 'id',
        type: dynamodb.AttributeType.STRING,
      },
    });

    // Prints out URL
    new cdk.CfnOutput(this, "GraphQLAPIURL", {
      value: api.graphqlUrl
    });

    // Prints out the AppSync GraphQL API key to the terminal
    new cdk.CfnOutput(this, "GraphQLAPIKey", {
      value: api.apiKey || ''
    });

    // Prints out the stack region to the terminal
    new cdk.CfnOutput(this, "Stack Region", {
      value: this.region
    });
  }
}
```

Pada titik ini, mari kita gunakan lagi:

```
cdk deploy
```

Kita harus memeriksa konsol DynamoDB untuk tabel baru kita:

![\[DynamoDB console showing ExampleCdkAppStack-poststable as Active with Provisioned capacity.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/cdk-code-deploy-ddb-result-1.png)


Nama tumpukan kami benar, dan nama tabel cocok dengan kode kami. Jika kita memeriksa CloudFormation tumpukan kita lagi, kita sekarang akan melihat tabel baru:

![\[Expanded view of a logical ID in CloudFormation showing post-apis, posts-table, and CDKMetadata.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/cdk-code-deploy-ddb-result-2.png)


## Menerapkan proyek CDK - Resolver
<a name="implementing-a-cdk-project-resolver"></a>

Contoh ini akan menggunakan dua resolver: satu untuk menanyakan tabel dan satu untuk menambahkannya. Karena kita menggunakan resolver pipeline, kita perlu mendeklarasikan dua resolver pipeline dengan satu fungsi di masing-masing. Dalam query, kita akan menambahkan kode berikut:

```
export class ExampleCdkAppStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // Makes a GraphQL API construct
    const api = new appsync.GraphqlApi(this, 'post-apis', {
      name: 'api-to-process-posts',
      schema: appsync.SchemaFile.fromAsset('schema/schema.graphql'),
    });

    //creates a DDB table
    const add_ddb_table = new dynamodb.Table(this, 'posts-table', {
      partitionKey: {
        name: 'id',
        type: dynamodb.AttributeType.STRING,
      },
    });

    // Creates a function for query
    const add_func = new appsync.AppsyncFunction(this, 'func-get-post', {
      name: 'get_posts_func_1',
      api,
      dataSource: api.addDynamoDbDataSource('table-for-posts', add_ddb_table),
      code: appsync.Code.fromInline(`
          export function request(ctx) {
          return { operation: 'Scan' };
          }

          export function response(ctx) {
          return ctx.result.items;
          }
  `),
      runtime: appsync.FunctionRuntime.JS_1_0_0,
    });

    // Creates a function for mutation
    const add_func_2 = new appsync.AppsyncFunction(this, 'func-add-post', {
      name: 'add_posts_func_1',
      api,
      dataSource: api.addDynamoDbDataSource('table-for-posts-2', add_ddb_table),
      code: appsync.Code.fromInline(`
          export function request(ctx) {
            return {
            operation: 'PutItem',
            key: util.dynamodb.toMapValues({id: util.autoId()}),
            attributeValues: util.dynamodb.toMapValues(ctx.args.input),
            };
          }

          export function response(ctx) {
            return ctx.result;
          }
      `),
      runtime: appsync.FunctionRuntime.JS_1_0_0,
    });

    // Adds a pipeline resolver with the get function
    new appsync.Resolver(this, 'pipeline-resolver-get-posts', {
      api,
      typeName: 'Query',
      fieldName: 'getPost',
      code: appsync.Code.fromInline(`
          export function request(ctx) {
          return {};
          }

          export function response(ctx) {
          return ctx.prev.result;
          }
  `),
      runtime: appsync.FunctionRuntime.JS_1_0_0,
      pipelineConfig: [add_func],
    });

    // Adds a pipeline resolver with the create function
    new appsync.Resolver(this, 'pipeline-resolver-create-posts', {
      api,
      typeName: 'Mutation',
      fieldName: 'createPost',
      code: appsync.Code.fromInline(`
          export function request(ctx) {
          return {};
          }

          export function response(ctx) {
          return ctx.prev.result;
          }
  `),
      runtime: appsync.FunctionRuntime.JS_1_0_0,
      pipelineConfig: [add_func_2],
    });

    // Prints out URL
    new cdk.CfnOutput(this, "GraphQLAPIURL", {
      value: api.graphqlUrl
    });

    // Prints out the AppSync GraphQL API key to the terminal
    new cdk.CfnOutput(this, "GraphQLAPIKey", {
      value: api.apiKey || ''
    });

    // Prints out the stack region to the terminal
    new cdk.CfnOutput(this, "Stack Region", {
      value: this.region
    });
  }
}
```

Dalam cuplikan ini, kami menambahkan resolver pipeline yang disebut `pipeline-resolver-create-posts` dengan fungsi yang disebut melekat padanya. `func-add-post` Ini adalah kode yang akan ditambahkan `Posts` ke tabel. Pipeline resolver lainnya dipanggil `pipeline-resolver-get-posts` dengan fungsi yang disebut `func-get-post` yang mengambil `Posts` ditambahkan ke tabel.

Kami akan menerapkan ini untuk menambahkannya ke AWS AppSync layanan:

```
cdk deploy
```

Mari kita periksa AWS AppSync konsol untuk melihat apakah mereka dilampirkan ke GraphQL API kami:

![\[GraphQL API schema showing mutation and query fields with Pipeline resolvers.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/cdk-code-deploy-resolver-result-1.png)


Tampaknya benar. Dalam kode, kedua resolver ini dilampirkan ke GraphQL API yang kami buat (dilambangkan dengan nilai `api` props yang ada di resolver dan fungsi). Di GraphQL API, bidang yang kami lampirkan pada resolver kami juga ditentukan dalam alat peraga (ditentukan oleh `typename` dan props di setiap resolver). `fieldname`

Mari kita lihat apakah konten resolver sudah benar dimulai dengan: `pipeline-resolver-get-posts`

![\[Code snippet showing request and response functions in a resolver, with an arrow pointing to them.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/cdk-code-deploy-resolver-result-2.png)


Penangan sebelum dan sesudah cocok dengan nilai `code` alat peraga kami. Kita juga dapat melihat bahwa fungsi dipanggil`add_posts_func_1`, yang cocok dengan nama fungsi yang kita lampirkan di resolver.

Mari kita lihat isi kode dari fungsi itu:

![\[Function code showing request and response methods for a PutItem operation.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/cdk-code-deploy-resolver-result-3.png)


Ini cocok dengan `code` alat peraga `add_posts_func_1` fungsi. Kueri kami berhasil diunggah, jadi mari kita periksa kueri:

![\[Resolver code with request and response functions, and a get_posts_func_1 function listed below.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/cdk-code-deploy-resolver-result-4.png)


Ini juga cocok dengan kode. Jika kita melihat`get_posts_func_1`:

![\[Code snippet showing two exported functions: request returning 'Scan' operation and response returning items.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/cdk-code-deploy-resolver-result-5.png)


Semuanya tampak ada di tempatnya. Untuk mengonfirmasi ini dari perspektif metadata, kita dapat memeriksa tumpukan kita lagi: CloudFormation 

![\[List of logical IDs for AWS resources including API, table, functions, and pipelines.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/cdk-code-deploy-resolver-result-6.png)


Sekarang, kita perlu menguji kode ini dengan melakukan beberapa permintaan.

## Menerapkan proyek CDK - Permintaan
<a name="implementing-a-cdk-project-requests"></a>

Untuk menguji aplikasi kami di AWS AppSync konsol, kami membuat satu kueri dan satu mutasi:

![\[GraphQL code snippet showing a query to get post details and a mutation to create a post.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/cdk-code-request-1.png)


`MyMutation`berisi `createPost` operasi dengan argumen `1970-01-01T12:30:00.000Z` dan`first post`. Ia mengembalikan `date` dan `title` yang kami lewatkan serta `id` nilai yang dihasilkan secara otomatis. Menjalankan mutasi menghasilkan hasil:

```
{
  "data": {
    "createPost": {
      "date": "1970-01-01T12:30:00.000Z",
      "id": "4dc1c2dd-0aa3-4055-9eca-7c140062ada2",
      "title": "first post"
    }
  }
}
```

Jika kita memeriksa tabel DynamoDB dengan cepat, kita dapat melihat entri kita di tabel ketika kita memindainya:

![\[DynamoDB table entry showing id, date, and title fields for a single item.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/cdk-code-request-2.png)


Kembali ke AWS AppSync konsol, jika kita menjalankan kueri untuk mengambil ini`Post`, kita mendapatkan hasil sebagai berikut:

```
{
  "data": {
    "getPost": [
      {
        "id": "9f62c4dd-49d5-48d5-b835-143284c72fe0",
        "date": "1970-01-01T12:30:00.000Z",
        "title": "first post"
      }
    ]
  }
}
```

# Menggunakan langganan untuk aplikasi data real-time di AWS AppSync
<a name="aws-appsync-real-time-data"></a>

**penting**  
Mulai 13 Maret 2025, Anda dapat membangun PubSub API real-time yang didukung dengan WebSockets menggunakan AWS AppSync Acara. Untuk informasi selengkapnya, lihat [Mempublikasikan acara melalui WebSocket](https://docs.aws.amazon.com/appsync/latest/eventapi/publish-websocket.html) *Panduan Pengembang AWS AppSync Acara*.

AWS AppSyncmemungkinkan Anda memanfaatkan langganan untuk menerapkan pembaruan aplikasi langsung, pemberitahuan push, dll. Ketika klien menjalankan operasi langganan GraphQL, koneksi WebSocket aman secara otomatis dibuat dan dikelola oleh. AWS AppSync Aplikasi kemudian dapat mendistribusikan data secara real-time dari sumber data ke pelanggan sambil AWS AppSync terus mengelola koneksi aplikasi dan persyaratan penskalaan. Bagian berikut akan menunjukkan kepada Anda bagaimana langganan AWS AppSync bekerja.

## Arahan langganan skema GraphQL
<a name="graphql-schema-subscription-directives"></a>

Langganan di AWS AppSync dipanggil sebagai respons terhadap mutasi. Ini berarti Anda dapat membuat sumber data apa pun secara AWS AppSync real time dengan menentukan direktif skema GraphQL pada mutasi.

Pustaka AWS Amplify klien secara otomatis menangani manajemen koneksi berlangganan. Pustaka menggunakan pure WebSockets sebagai protokol jaringan antara klien dan layanan.

**catatan**  
Untuk mengontrol otorisasi pada waktu koneksi ke langganan, Anda dapat menggunakan AWS Identity and Access Management (IAM),, kumpulan identitas Amazon Cognito AWS Lambda, atau kumpulan pengguna Amazon Cognito untuk otorisasi tingkat lapangan. Untuk kontrol akses berbutir halus pada langganan, Anda dapat melampirkan resolver ke bidang langganan Anda dan melakukan logika menggunakan identitas pemanggil dan sumber data. AWS AppSync Untuk informasi selengkapnya, lihat [Mengkonfigurasi otorisasi dan otentikasi untuk mengamankan GraphQL Anda APIs](security-authz.md).

Langganan dipicu dari mutasi dan set pemilihan mutasi dikirim ke pelanggan.

Contoh berikut menunjukkan cara bekerja dengan langganan GraphQL. Itu tidak menentukan sumber data karena sumber data bisa Lambda, Amazon DynamoDB, atau Amazon Service. OpenSearch 

Untuk memulai langganan, Anda harus menambahkan titik masuk langganan ke skema Anda sebagai berikut:

```
schema {
    query: Query
    mutation: Mutation
    subscription: Subscription
}
```

Misalkan Anda memiliki situs posting blog, dan Anda ingin berlangganan blog baru dan perubahan ke blog yang ada. Untuk melakukan ini, tambahkan `Subscription` definisi berikut ke skema Anda:

```
type Subscription {
    addedPost: Post
    updatedPost: Post
    deletedPost: Post
}
```

Misalkan lebih lanjut bahwa Anda memiliki mutasi berikut:

```
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!
}
```

Anda dapat membuat bidang ini secara real time dengan menambahkan `@aws_subscribe(mutations: ["mutation_field_1", "mutation_field_2"])` arahan untuk setiap langganan yang ingin Anda terima notifikasi, sebagai berikut:

```
type Subscription {
    addedPost: Post
    @aws_subscribe(mutations: ["addPost"])
    updatedPost: Post
    @aws_subscribe(mutations: ["updatePost"])
    deletedPost: Post
    @aws_subscribe(mutations: ["deletePost"])
}
```

Karena `@aws_subscribe(mutations: ["",..,""])` mengambil array input mutasi, Anda dapat menentukan beberapa mutasi, yang memulai langganan. Jika Anda berlangganan dari klien, kueri GraphQL Anda mungkin terlihat seperti berikut:

```
subscription NewPostSub {
    addedPost {
        __typename
        version
        title
        content
        author
        url
    }
}
```

Kueri berlangganan ini diperlukan untuk koneksi dan perkakas klien.

Dengan WebSockets klien murni, penyaringan set seleksi dilakukan per klien, karena setiap klien dapat menentukan set pilihannya sendiri. Dalam hal ini, set pemilihan langganan harus merupakan bagian dari set pemilihan mutasi. Misalnya, langganan yang `addedPost{author title}` ditautkan ke mutasi hanya `addPost(...){id author title url version}` menerima penulis dan judul posting. Itu tidak menerima bidang lainnya. Namun, jika mutasi tidak memiliki penulis dalam kumpulan pemilihannya, pelanggan akan mendapatkan `null` nilai untuk bidang penulis (atau kesalahan jika bidang penulis didefinisikan sebagai required/not-null dalam skema).

Set pemilihan langganan sangat penting saat menggunakan pure WebSockets. Jika bidang tidak didefinisikan secara eksplisit dalam langganan, maka bidang tersebut AWS AppSync tidak ditampilkan.

Pada contoh sebelumnya, langganan tidak memiliki argumen. Misalkan skema Anda terlihat seperti berikut:

```
type Subscription {
    updatedPost(id:ID! author:String): Post
    @aws_subscribe(mutations: ["updatePost"])
}
```

Dalam hal ini, klien Anda mendefinisikan langganan sebagai berikut:

```
subscription UpdatedPostSub {
    updatedPost(id:"XYZ", author:"ABC") {
        title
        content
    }
}
```

Jenis pengembalian `subscription` bidang dalam skema Anda harus cocok dengan tipe pengembalian bidang mutasi yang sesuai. Pada contoh sebelumnya, ini ditampilkan sebagai keduanya `addPost` dan `addedPost` dikembalikan sebagai tipe`Post`.

Untuk mengatur langganan pada klien, lihat[Membangun aplikasi klien menggunakan Amplify client](building-a-client-app.md).

## Menggunakan argumen berlangganan
<a name="using-subscription-arguments"></a>

Bagian penting dari penggunaan langganan GraphQL adalah memahami kapan dan bagaimana menggunakan argumen. Anda dapat membuat perubahan halus untuk memodifikasi bagaimana dan kapan memberi tahu klien tentang mutasi yang telah terjadi. Untuk melakukan ini, lihat skema sampel dari chapter quickstart, yang menciptakan “Todos”. Untuk skema sampel ini, mutasi berikut didefinisikan:

```
type Mutation {
    createTodo(input: CreateTodoInput!): Todo
    updateTodo(input: UpdateTodoInput!): Todo
    deleteTodo(input: DeleteTodoInput!): Todo
}
```

Dalam contoh default, klien dapat berlangganan pembaruan apa pun `Todo` `onUpdateTodo` `subscription` dengan menggunakan tanpa argumen:

```
subscription OnUpdateTodo {
  onUpdateTodo {
    description
    id
    name
    when
  }
}
```

Anda dapat memfilter Anda `subscription` dengan menggunakan argumennya. Misalnya, untuk hanya memicu `subscription` ketika a `todo` dengan spesifik `ID` diperbarui, tentukan `ID` nilainya:

```
subscription OnUpdateTodo {
  onUpdateTodo(id: "a-todo-id") {
    description
    id
    name
    when
  }
}
```

Anda juga dapat melewati beberapa argumen. Misalnya, berikut ini `subscription` menunjukkan cara mendapatkan pemberitahuan tentang `Todo` pembaruan apa pun di tempat dan waktu tertentu:

```
subscription todosAtHome {
  onUpdateTodo(when: "tomorrow", where: "at home") {
    description
    id
    name
    when
    where
  }
}
```

Perhatikan bahwa semua argumen bersifat opsional. Jika Anda tidak menentukan argumen apa pun di Anda`subscription`, Anda akan berlangganan semua `Todo` pembaruan yang terjadi di aplikasi Anda. Namun, Anda dapat memperbarui definisi bidang Anda `subscription` untuk meminta `ID` argumen. Ini akan memaksa respons spesifik, `todo` bukan semua `todo` s:

```
onUpdateTodo(
  id: ID!,
  name: String,
  when: String,
  where: String,
  description: String
): Todo
```

### Argumen nilai null memiliki arti
<a name="argument-null-value-has-meaning"></a>

Saat membuat kueri langganan AWS AppSync, nilai `null` argumen akan memfilter hasil secara berbeda dari menghilangkan argumen sepenuhnya.

Mari kita kembali ke contoh API todos di mana kita bisa membuat todos. Lihat skema sampel dari chapter quickstart.

Mari kita memodifikasi skema kita untuk menyertakan `owner` bidang baru, pada `Todo` tipe, yang menggambarkan siapa pemiliknya. `owner`Bidang tidak diperlukan dan hanya dapat diatur`UpdateTodoInput`. Lihat versi skema yang disederhanakan berikut ini:

```
type Todo {
  id: ID!
  name: String!
  when: String!
  where: String!
  description: String!
  owner: String
}

input CreateTodoInput {
  name: String!
  when: String!
  where: String!
  description: String!
}

input UpdateTodoInput {
  id: ID!
  name: String
  when: String
  where: String
  description: String
  owner: String
}

type Subscription {
    onUpdateTodo(
        id: ID,
        name: String,
        when: String,
        where: String,
        description: String
    ): Todo @aws_subscribe(mutations: ["updateTodo"])
}
```

Langganan berikut mengembalikan semua `Todo` pembaruan:

```
subscription MySubscription {
  onUpdateTodo {
    description
    id
    name
    when
    where
  }
}
```

Jika Anda memodifikasi langganan sebelumnya untuk menambahkan argumen bidang`owner: null`, Anda sekarang mengajukan pertanyaan yang berbeda. Langganan ini sekarang mendaftarkan klien untuk mendapatkan pemberitahuan tentang semua `Todo` pembaruan yang belum diberikan pemilik.

```
subscription MySubscription {
  onUpdateTodo(owner: null) {
    description
    id
    name
    when
    where
  }
}
```

**catatan**  
**Per 1 Januari 2022, MQTT over tidak lagi tersedia sebagai WebSockets protokol untuk langganan GraphQL di. AWS AppSync APIs Pure WebSockets adalah satu-satunya protokol yang didukung di AWS AppSync.**  
Klien berdasarkan AWS AppSync SDK atau pustaka Amplify, dirilis setelah November 2019, secara otomatis menggunakan WebSockets pure secara default. Upgrade klien ke versi terbaru memungkinkan mereka untuk menggunakan AWS AppSync WebSockets mesin murni.  
Pure WebSockets hadir dengan ukuran muatan yang lebih besar (240 KB), variasi opsi klien yang lebih luas, dan CloudWatch metrik yang ditingkatkan. Untuk informasi lebih lanjut tentang menggunakan WebSocket klien murni, lihat[Membangun WebSocket klien real-time di AWS AppSync](real-time-websocket-client.md).

# Membuat generik yang pub/sub APIs didukung oleh tanpa server WebSockets di AWS AppSync
<a name="aws-appsync-real-time-create-generic-api-serverless-websocket"></a>

**penting**  
Mulai 13 Maret 2025, Anda dapat membangun PubSub API real-time yang didukung dengan WebSockets menggunakan AWS AppSync Acara. Untuk informasi selengkapnya, lihat [Mempublikasikan acara melalui WebSocket](https://docs.aws.amazon.com/appsync/latest/eventapi/publish-websocket.html) *Panduan Pengembang AWS AppSync Acara*.

Beberapa aplikasi hanya memerlukan sederhana WebSocket APIs di mana klien mendengarkan saluran atau topik tertentu. Data JSON generik tanpa bentuk spesifik atau persyaratan yang diketik dengan kuat dapat didorong ke klien yang mendengarkan salah satu saluran ini dalam pola berlangganan publikasi (pub/sub) yang murni dan sederhana.

Gunakan AWS AppSync untuk mengimplementasikan sederhana pub/sub WebSocket APIs dengan sedikit atau tanpa pengetahuan GraphQL dalam hitungan menit dengan secara otomatis menghasilkan kode GraphQL di backend API dan sisi klien.

## Buat dan konfigurasikan pub-sub APIs
<a name="aws-appsync-real-time-enhanced-filtering-using-pub-sub-apis"></a>

Untuk memulai, lakukan hal berikut: 

1. Masuk ke Konsol Manajemen AWS dan buka [AppSync konsol](https://console.aws.amazon.com/appsync/).

   1. Di **Dashboard**, pilih **Create API**.

1. Pada layar berikutnya, pilih **Buat API real-time**, lalu pilih **Berikutnya**.

1. Masukkan nama yang ramah untuk pub/sub API Anda.

1. Anda dapat mengaktifkan fitur [API pribadi](https://docs.aws.amazon.com/appsync/latest/devguide/using-private-apis.html), tetapi kami sarankan untuk tetap menonaktifkannya untuk saat ini. Pilih **Berikutnya**.

1. Anda dapat memilih untuk secara otomatis membuat pub/sub API yang berfungsi menggunakan WebSockets. Kami merekomendasikan untuk menonaktifkan fitur ini untuk saat ini juga. Pilih **Berikutnya**.

1. Pilih **Buat API** dan kemudian tunggu beberapa menit. AWS AppSync Pub/sub API baru yang telah dikonfigurasi sebelumnya akan dibuat di akun Anda. AWS 

API menggunakan AWS AppSync resolver lokal bawaan (untuk informasi selengkapnya tentang penggunaan resolver lokal, lihat [Tutorial: Local Resolvers](https://docs.aws.amazon.com/appsync/latest/devguide/tutorial-local-resolvers-js.html) in the *AWS AppSync Developer Guide*) untuk mengelola beberapa pub/sub saluran dan WebSocket koneksi sementara, yang secara otomatis mengirimkan dan memfilter data ke klien berlangganan hanya berdasarkan nama saluran. Panggilan API diotorisasi dengan kunci API.

Setelah API diterapkan, Anda akan disajikan dengan beberapa langkah tambahan untuk menghasilkan kode klien dan mengintegrasikannya dengan aplikasi klien Anda. Sebagai contoh tentang cara mengintegrasikan klien dengan cepat, panduan ini akan menggunakan aplikasi web React sederhana.

1. Mulailah dengan membuat aplikasi React boilerplate menggunakan [NPM di mesin lokal](https://www.npmjs.com/get-npm) Anda:

   ```
   $ npx create-react-app mypubsub-app 
   $ cd mypubsub-app
   ```
**catatan**  
Contoh ini menggunakan [library Amplify](https://docs.amplify.aws/lib/) untuk menghubungkan klien ke API backend. Namun tidak perlu membuat proyek Amplify CLI secara lokal. Meskipun React adalah klien pilihan dalam contoh ini, pustaka Amplify juga mendukung klien iOS, Android, dan Flutter, memberikan kemampuan yang sama di runtime yang berbeda ini. [Klien Amplify yang didukung menyediakan abstraksi sederhana untuk berinteraksi dengan backend API AWS AppSync GraphQL dengan beberapa baris kode termasuk kemampuan bawaan yang sepenuhnya kompatibel dengan protokol real-time: WebSocket AWS AppSync WebSocket ](https://docs.aws.amazon.com/appsync/latest/devguide/real-time-websocket-client.html)  

   ```
   $ npm install @aws-amplify/api
   ```

1. Di AWS AppSync konsol, pilih **JavaScript**, lalu **Unduh untuk mengunduh** satu file dengan detail konfigurasi API dan kode operasi GraphQL yang dihasilkan.

1. Salin file yang diunduh ke `/src` folder dalam proyek React Anda.

1. Selanjutnya, ganti konten `src/App.js` file boilerplate yang ada dengan kode klien sampel yang tersedia di konsol.

1. Gunakan perintah berikut untuk memulai aplikasi secara lokal:

   ```
   $ npm start
   ```

1. Untuk menguji pengiriman dan penerimaan data real-time, buka dua jendela browser dan akses*localhost:3000*. Aplikasi sampel dikonfigurasi untuk mengirim data JSON generik ke saluran hard-code bernama. *robots*

1.  **Di salah satu jendela browser, masukkan gumpalan JSON berikut di kotak teks lalu klik Kirim:** 

   ```
   {
     "robot":"r2d2",
     "planet": "tatooine"
   }
   ```

Kedua instance browser berlangganan *robots* saluran dan menerima data yang dipublikasikan secara real time, ditampilkan di bagian bawah aplikasi web:

![\[Contoh aplikasi React untuk pub/sub API\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/pub-sub-react.png)


Semua kode API GraphQL yang diperlukan, termasuk skema, resolver, dan operasi dibuat secara otomatis untuk mengaktifkan kasus penggunaan umum. pub/sub Di backend, data dipublikasikan ke AWS AppSync titik akhir real-time dengan mutasi GraphQL seperti berikut ini:

```
mutation PublishData {
    publish(data: "{\"msg\": \"hello world!\"}", name: "channel") {
        data
        name
    }
}
```

Pelanggan mengakses data yang dipublikasikan yang dikirim ke saluran sementara tertentu dengan langganan GraphQL terkait:

```
subscription SubscribeToData {
    subscribe(name:"channel") {
        name
        data
    }
}
```

## Menerapkan pub-sub APIs ke dalam aplikasi yang ada
<a name="aws-appsync-real-time-enhanced-filtering-existing-apps"></a>

Jika Anda hanya perlu mengimplementasikan fitur real-time dalam aplikasi yang ada, konfigurasi pub/sub API generik ini dapat dengan mudah diintegrasikan ke dalam aplikasi atau teknologi API apa pun. Meskipun ada keuntungan dalam menggunakan titik akhir API tunggal untuk mengakses, memanipulasi, dan menggabungkan data dengan aman dari satu atau lebih sumber data dalam satu panggilan jaringan dengan GraphQL, tidak perlu mengonversi atau membangun kembali aplikasi berbasis REST yang ada dari awal untuk memanfaatkan kemampuan real-time. AWS AppSync Misalnya, Anda dapat memiliki beban kerja CRUD yang ada di titik akhir API terpisah dengan klien mengirim dan menerima pesan atau peristiwa dari aplikasi yang ada ke pub/sub API generik hanya untuk waktu nyata dan tujuan. pub/sub 

# Mendefinisikan filter langganan yang disempurnakan di AWS AppSync
<a name="aws-appsync-real-time-enhanced-filtering"></a>

**penting**  
Mulai 13 Maret 2025, Anda dapat membangun PubSub API real-time yang didukung dengan WebSockets menggunakan AWS AppSync Acara. Untuk informasi selengkapnya, lihat [Mempublikasikan acara melalui WebSocket](https://docs.aws.amazon.com/appsync/latest/eventapi/publish-websocket.html) *Panduan Pengembang AWS AppSync Acara*.

Di AWS AppSync, Anda dapat menentukan dan mengaktifkan logika bisnis untuk pemfilteran data di backend secara langsung di resolver langganan GraphQL API dengan menggunakan filter yang mendukung operator logis tambahan. Anda dapat mengonfigurasi filter ini, tidak seperti argumen langganan yang ditentukan pada kueri langganan di klien. Untuk informasi selengkapnya tentang penggunaan argumen langganan, lihat[Menggunakan argumen berlangganan](aws-appsync-real-time-data.md#using-subscription-arguments). Untuk daftar operator, lihat[AWS AppSync referensi utilitas template pemetaan resolver](resolver-util-reference.md).

Untuk tujuan dokumen ini, kami membagi pemfilteran data real-time ke dalam kategori berikut:
+ **Pemfilteran dasar** - Pemfilteran berdasarkan argumen yang ditentukan klien dalam kueri langganan.
+ **Penyaringan yang disempurnakan** - Pemfilteran berdasarkan logika yang didefinisikan secara terpusat di backend layanan. AWS AppSync 

Bagian berikut menjelaskan cara mengonfigurasi filter langganan yang disempurnakan dan menunjukkan penggunaan praktisnya.

## Mendefinisikan langganan dalam skema GraphQL Anda
<a name="aws-appsync-real-time-enhanced-filtering-using-subscription-filters"></a>

Untuk menggunakan filter langganan yang disempurnakan, Anda menentukan langganan dalam skema GraphQL lalu tentukan filter yang disempurnakan menggunakan ekstensi pemfilteran. Untuk mengilustrasikan cara kerja penyaringan langganan yang disempurnakan AWS AppSync, gunakan skema GraphQL berikut, yang mendefinisikan API sistem manajemen tiket, sebagai contoh:

```
type Ticket {
	id: ID
	createdAt: AWSDateTime
	content: String
	severity: Int
	priority: Priority
	category: String
	group: String
	status: String
	
}

type Mutation {
	createTicket(input: TicketInput): Ticket
}

type Query {
	getTicket(id: ID!): Ticket
}

type Subscription {
	onSpecialTicketCreated: Ticket @aws_subscribe(mutations: ["createTicket"])
	onGroupTicketCreated(group: String!): Ticket @aws_subscribe(mutations: ["createTicket"])
}



enum Priority {
	none
	lowest
	low
	medium
	high
	highest
}

input TicketInput {
	content: String
	severity: Int
	priority: Priority
	category: String
	group: String
```

Misalkan Anda membuat sumber `NONE` data untuk API Anda, lalu lampirkan resolver ke `createTicket` mutasi menggunakan sumber data ini. Penangan Anda mungkin terlihat seperti ini:

```
import { util } from '@aws-appsync/utils';

export function request(ctx) {
	return {
		payload: {
			id: util.autoId(),
			createdAt: util.time.nowISO8601(),
			status: 'pending',
			...ctx.args.input,
		},
	};
}

export function response(ctx) {
	return ctx.result;
}
```

**catatan**  
Filter yang disempurnakan diaktifkan di handler GraphQL resolver dalam langganan tertentu. Untuk informasi selengkapnya, lihat [Referensi Resolver](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html).

Untuk mengimplementasikan perilaku filter yang disempurnakan, Anda harus menggunakan `extensions.setSubscriptionFilter()` fungsi tersebut untuk menentukan ekspresi filter yang dievaluasi terhadap data yang dipublikasikan dari mutasi GraphQL yang mungkin diminati oleh klien berlangganan. Untuk informasi selengkapnya tentang ekstensi pemfilteran, lihat [Ekstensi](https://docs.aws.amazon.com//appsync/latest/devguide/extensions-js.html).

Bagian berikut menjelaskan cara menggunakan ekstensi penyaringan untuk mengimplementasikan filter yang disempurnakan.

## Membuat filter langganan yang disempurnakan menggunakan ekstensi penyaringan
<a name="aws-appsync-real-time-enhanced-filtering-defining-filters"></a>

Filter yang disempurnakan ditulis dalam JSON di handler respons dari resolver langganan. Filter dapat dikelompokkan bersama dalam daftar yang disebut a`filterGroup`. Filter didefinisikan menggunakan setidaknya satu aturan, masing-masing dengan bidang, operator, dan nilai. Mari kita tentukan resolver baru untuk `onSpecialTicketCreated` itu menyiapkan filter yang disempurnakan. Anda dapat mengonfigurasi beberapa aturan dalam filter yang dievaluasi menggunakan logika AND, sementara beberapa filter dalam grup filter dievaluasi menggunakan logika OR:

```
import { util, extensions } from '@aws-appsync/utils';

export function request(ctx) {
	// simplfy return null for the payload
	return { payload: null };
}

export function response(ctx) {
	const filter = {
		or: [
			{ severity: { ge: 7 }, priority: { in: ['high', 'medium'] } },
			{ category: { eq: 'security' }, group: { in: ['admin', 'operators'] } },
		],
	};
	extensions.setSubscriptionFilter(util.transform.toSubscriptionFilter(filter));

  // important: return null in the response
	return null;
}
```

Berdasarkan filter yang ditentukan dalam contoh sebelumnya, tiket penting secara otomatis didorong ke klien API berlangganan jika tiket dibuat dengan:
+ `priority`tingkat `high` atau `medium`

  DAN 
+ `severity`tingkat lebih besar dari atau sama dengan `7` (`ge`)

ATAU 
+ `classification`tiket diatur ke `Security` 

  DAN 
+ `group`penugasan diatur ke `admin` atau `operators`

![\[Contoh yang menunjukkan kueri pemfilteran tiket\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/aws-priority-example.png)


Filter yang didefinisikan dalam resolver langganan (penyaringan yang ditingkatkan) lebih diutamakan daripada pemfilteran hanya berdasarkan argumen langganan (pemfilteran dasar). Untuk informasi selengkapnya tentang penggunaan argumen langganan, lihat [Menggunakan argumen langganan](https://docs.aws.amazon.com//appsync/latest/devguide/aws-appsync-real-time-data.html#using-subscription-arguments)).

Jika argumen didefinisikan dan diperlukan dalam skema GraphQL langganan, pemfilteran berdasarkan argumen yang diberikan hanya terjadi jika argumen didefinisikan sebagai aturan dalam metode resolver. `extensions.setSubscriptionFilter()` Namun, jika tidak ada metode `extensions` penyaringan dalam resolver langganan, argumen yang didefinisikan dalam klien hanya digunakan untuk pemfilteran dasar. Anda tidak dapat menggunakan pemfilteran dasar dan penyaringan yang disempurnakan secara bersamaan.

Anda dapat menggunakan [`context`variabel](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference-js.html) dalam logika ekstensi filter langganan untuk mengakses informasi kontekstual tentang permintaan. Misalnya, saat menggunakan Amazon Cognito User Pools, OIDC, atau otorisasi kustom Lambda untuk otorisasi, Anda dapat mengambil informasi tentang pengguna saat langganan dibuat. `context.identity` Anda dapat menggunakan informasi tersebut untuk membuat filter berdasarkan identitas pengguna Anda.

Sekarang asumsikan bahwa Anda ingin menerapkan perilaku filter yang disempurnakan untuk`onGroupTicketCreated`. `onGroupTicketCreated`Langganan membutuhkan `group` nama wajib sebagai argumen. Saat dibuat, tiket secara otomatis diberi `pending` status. Anda dapat mengatur filter langganan untuk hanya menerima tiket yang baru dibuat milik grup yang disediakan:

```
import { util, extensions } from '@aws-appsync/utils';

export function request(ctx) {
	// simplfy return null for the payload
	return { payload: null };
}

export function response(ctx) {
	const filter = { group: { eq: ctx.args.group }, status: { eq: 'pending' } };
	extensions.setSubscriptionFilter(util.transform.toSubscriptionFilter(filter));

	return null;
}
```

Ketika data dipublikasikan menggunakan mutasi seperti pada contoh berikut:

```
mutation CreateTicket {
  createTicket(input: {priority: medium, severity: 2, group: "aws"}) {
    id
    priority
    severity
    status
    group
    createdAt
  }
}
```

Klien berlangganan mendengarkan data yang akan didorong secara otomatis WebSockets segera setelah tiket dibuat dengan `createTicket` mutasi:

```
subscription OnGroup {
  onGroupTicketCreated(group: "aws") {
    category
    status
    severity
    priority
    id
    group
    createdAt
    content
  }
}
```

Klien dapat berlangganan tanpa argumen karena logika penyaringan diimplementasikan dalam AWS AppSync layanan dengan penyaringan yang ditingkatkan, yang menyederhanakan kode klien. Klien menerima data hanya jika kriteria filter yang ditentukan terpenuhi.

## Mendefinisikan filter yang disempurnakan untuk bidang skema bersarang
<a name="aws-appsync-real-time-enhanced-filters-nested-schema-fields.title"></a>

Anda dapat menggunakan pemfilteran langganan yang disempurnakan untuk memfilter bidang skema bersarang. Misalkan kita memodifikasi skema dari bagian sebelumnya untuk memasukkan jenis lokasi dan alamat:

```
type Ticket {
	id: ID
	createdAt: AWSDateTime
	content: String
	severity: Int
	priority: Priority
	category: String
	group: String
	status: String
	location: ProblemLocation
}

type Mutation {
	createTicket(input: TicketInput): Ticket
}

type Query {
	getTicket(id: ID!): Ticket
}

type Subscription {
	onSpecialTicketCreated: Ticket @aws_subscribe(mutations: ["createTicket"])
	onGroupTicketCreated(group: String!): Ticket @aws_subscribe(mutations: ["createTicket"])
}

type ProblemLocation {
	address: Address
}

type Address {
	country: String
}

enum Priority {
	none
	lowest
	low
	medium
	high
	highest
}

input TicketInput {
	content: String
	severity: Int
	priority: Priority
	category: String
	group: String
	location: AWSJSON
```

Dengan skema ini, Anda dapat menggunakan `.` pemisah untuk mewakili bersarang. Contoh berikut menambahkan aturan filter untuk bidang skema bersarang di bawah. `location.address.country` Langganan akan dipicu jika alamat tiket diatur ke`USA`:

```
import { util, extensions } from '@aws-appsync/utils';

export const request = (ctx) => ({ payload: null });

export function response(ctx) {
	const filter = {
		or: [
			{ severity: { ge: 7 }, priority: { in: ['high', 'medium'] } },
			{ category: { eq: 'security' }, group: { in: ['admin', 'operators'] } },
			{ 'location.address.country': { eq: 'USA' } },
		],
	};
	extensions.setSubscriptionFilter(util.transform.toSubscriptionFilter(filter));
	return null;
}
```

Dalam contoh di atas, `location` mewakili tingkat bersarang satu, `address` mewakili tingkat bersarang dua, dan `country` mewakili tingkat bersarang tiga, yang semuanya dipisahkan oleh pemisah. `.`

Anda dapat menguji langganan ini dengan menggunakan `createTicket` mutasi:

```
mutation CreateTicketInUSA {
  createTicket(input: {location: "{\"address\":{\"country\":\"USA\"}}"}) {
    category
    content
    createdAt
    group
    id
    location {
      address {
        country
      }
    }
    priority
    severity
    status
  }
}
```

## Mendefinisikan filter yang disempurnakan dari klien
<a name="aws-appsync-real-time-enhanced-filtering-defining-from-client"></a>

[Anda dapat menggunakan pemfilteran dasar di GraphQL dengan argumen langganan.](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-real-time-data.html#using-subscription-arguments) Klien yang membuat panggilan dalam kueri langganan mendefinisikan nilai argumen. Saat filter yang disempurnakan diaktifkan di resolver AWS AppSync langganan dengan `extensions` pemfilteran, filter backend yang ditentukan dalam resolver akan diutamakan dan diprioritaskan.

Konfigurasikan filter dinamis yang ditingkatkan yang ditentukan klien menggunakan `filter` argumen dalam langganan. Saat Anda mengonfigurasi filter ini, Anda harus memperbarui skema GraphQL untuk mencerminkan argumen baru:

```
...
type Subscription {
    onSpecialTicketCreated(filter: String): Ticket
        @aws_subscribe(mutations: ["createTicket"])
}
...
```

Klien kemudian dapat mengirim kueri langganan seperti pada contoh berikut:

```
subscription onSpecialTicketCreated($filter: String) {
     onSpecialTicketCreated(filter: $filter) {
        id
        group
        description
        priority
        severity
     }
 }
```

Anda dapat mengkonfigurasi variabel query seperti contoh berikut:

```
{"filter" : "{\"severity\":{\"le\":2}}"}
```

Utilitas `util.transform.toSubscriptionFilter()` resolver dapat diimplementasikan dalam template pemetaan respons langganan untuk menerapkan filter yang ditentukan dalam argumen langganan untuk setiap klien:

```
import { util, extensions } from '@aws-appsync/utils';

export function request(ctx) {
	// simplfy return null for the payload
	return { payload: null };
}

export function response(ctx) {
	const filter = ctx.args.filter;
	extensions.setSubscriptionFilter(util.transform.toSubscriptionFilter(filter));
	return null;
}
```

Dengan strategi ini, klien dapat menentukan filter mereka sendiri yang menggunakan logika penyaringan yang disempurnakan dan operator tambahan. Filter ditetapkan ketika klien tertentu memanggil kueri langganan dalam WebSocket koneksi aman. Untuk informasi selengkapnya tentang utilitas transformasi untuk penyaringan yang disempurnakan, termasuk format payload variabel `filter` kueri, lihat ikhtisar [JavaScriptresolver](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html).

## Pembatasan penyaringan tambahan yang ditingkatkan
<a name="aws-appsync-real-time-enhanced-filtering-additional-restrictions"></a>

Di bawah ini adalah beberapa kasus penggunaan di mana pembatasan tambahan ditempatkan pada filter yang disempurnakan:
+ Filter yang disempurnakan tidak mendukung pemfilteran untuk daftar objek tingkat atas. Dalam kasus penggunaan ini, data yang dipublikasikan dari mutasi akan diabaikan untuk langganan yang ditingkatkan.
+ AWS AppSync mendukung hingga lima tingkat bersarang. Filter pada bidang skema melewati tingkat lima bersarang akan diabaikan. Ambil respons GraphQL di bawah ini. `continent`Bidang di `venue.address.country.metadata.continent` diperbolehkan karena itu adalah sarang tingkat lima. Namun, `financial` in `venue.address.country.metadata.capital.financial` adalah sarang level enam, jadi filter tidak akan berfungsi:

  ```
  {
      "data": {
          "onCreateFilterEvent": {
              "venue": {
                  "address": {
                      "country": {
                          "metadata": {
                              "capital": {
                                  "financial": "New York"
                              },
                              "continent" : "North America"
                          }
                      },
                      "state": "WA"
                  },
                  "builtYear": 2023
              },
              "private": false,
          }
      }
  }
  ```

# Berhenti berlangganan WebSocket koneksi menggunakan filter di AWS AppSync
<a name="aws-appsync-real-time-invalidation"></a>

**penting**  
Mulai 13 Maret 2025, Anda dapat membangun PubSub API real-time yang didukung dengan WebSockets menggunakan AWS AppSync Acara. Untuk informasi selengkapnya, lihat [Mempublikasikan acara melalui WebSocket](https://docs.aws.amazon.com/appsync/latest/eventapi/publish-websocket.html) *Panduan Pengembang AWS AppSync Acara*.

Di AWS AppSync, Anda dapat berhenti berlangganan secara paksa dan menutup (membatalkan) WebSocket koneksi dari klien yang terhubung berdasarkan logika penyaringan tertentu. Ini berguna dalam skenario terkait otorisasi seperti ketika Anda menghapus pengguna dari grup.

Pembatalan langganan terjadi sebagai respons terhadap muatan yang ditentukan dalam mutasi. Sebaiknya Anda memperlakukan mutasi yang digunakan untuk membatalkan koneksi langganan sebagai operasi administratif di API dan izin cakupan sesuai dengan membatasi penggunaannya pada pengguna admin, grup, atau layanan backend. Misalnya, menggunakan arahan otorisasi skema seperti atau. `@aws_auth(cognito_groups: ["Administrators"])` `@aws_iam` Untuk informasi selengkapnya, lihat [Menggunakan mode otorisasi tambahan](https://docs.aws.amazon.com/appsync/latest/devguide/security-authz.html#using-additional-authorization-modes).

Filter pembatalan menggunakan sintaks dan logika yang sama dengan filter langganan yang [disempurnakan](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-real-time-enhanced-filtering.html). Tentukan filter ini menggunakan utilitas berikut:
+ `extensions.invalidateSubscriptions()`— Didefinisikan dalam penangan respons GraphQL resolver untuk mutasi.
+ `extensions.setSubscriptionInvalidationFilter()`— Didefinisikan dalam penangan respons GraphQL resolver dari langganan yang ditautkan ke mutasi.

[Untuk informasi selengkapnya tentang ekstensi pemfilteran pembatalan, lihat JavaScript ikhtisar penyelesai.](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html)

## Menggunakan pembatalan langganan
<a name="aws-appsync-real-time-invalidation-using-invalidations"></a>

Untuk melihat cara kerja pembatalan langganan AWS AppSync, gunakan skema GraphQL berikut:

```
type User {
  userId: ID!
  groupId: ID!
}
    
type Group {
  groupId: ID!
  name: String!
  members: [ID!]!
}

type GroupMessage {
  userId: ID!
  groupId: ID!
  message: String!
}

type Mutation {
    createGroupMessage(userId: ID!, groupId : ID!, message: String!): GroupMessage
    removeUserFromGroup(userId: ID!, groupId : ID!) : User @aws_iam
}

type Subscription {
    onGroupMessageCreated(userId: ID!, groupId : ID!): GroupMessage
        @aws_subscribe(mutations: ["createGroupMessage"])
}

type Query {
	none: String
}
```

Tentukan filter pembatalan dalam kode penyelesai `removeUserFromGroup` mutasi:

```
import { extensions } from '@aws-appsync/utils';

export function request(ctx) {
	return { payload: null };
}

export function response(ctx) {
	const { userId, groupId } = ctx.args;
	extensions.invalidateSubscriptions({
		subscriptionField: 'onGroupMessageCreated',
		payload: { userId, groupId },
	});
	return { userId, groupId };
}
```

Saat mutasi dipanggil, data yang ditentukan dalam `payload` objek digunakan untuk berhenti berlangganan langganan yang ditentukan. `subscriptionField` Filter pembatalan juga didefinisikan dalam template pemetaan respons `onGroupMessageCreated` langganan. 

Jika `extensions.invalidateSubscriptions()` payload berisi ID yang cocok dengan klien berlangganan seperti yang didefinisikan dalam filter, langganan terkait akan berhenti berlangganan. IDs Selain itu, WebSocket koneksi ditutup. Tentukan kode resolver langganan untuk langganan: `onGroupMessageCreated`

```
import { util, extensions } from '@aws-appsync/utils';

export function request(ctx) {
	// simplfy return null for the payload
	return { payload: null };
}

export function response(ctx) {
	const filter = { groupId: { eq: ctx.args.groupId } };
	extensions.setSubscriptionFilter(util.transform.toSubscriptionFilter(filter));

	const invalidation = { groupId: { eq: ctx.args.groupId }, userId: { eq: ctx.args.userId } };
	extensions.setSubscriptionInvalidationFilter(util.transform.toSubscriptionFilter(invalidation));

	return null;
}
```

Perhatikan bahwa handler respons langganan dapat memiliki filter langganan dan filter pembatalan yang ditentukan secara bersamaan.

Misalnya, asumsikan bahwa klien A berlangganan pengguna baru dengan ID `user-1` ke grup dengan ID `group-1` menggunakan permintaan berlangganan berikut:

```
onGroupMessageCreated(userId : "user-1", groupId: :"group-1"){...}
```

AWS AppSync menjalankan resolver langganan, yang menghasilkan filter langganan dan pembatalan seperti yang didefinisikan dalam template pemetaan respons sebelumnya`onGroupMessageCreated`. Untuk klien A, filter langganan memungkinkan data dikirim hanya ke`group-1`, dan filter pembatalan ditentukan untuk keduanya `user-1` dan. `group-1`

Sekarang asumsikan bahwa klien B berlangganan pengguna dengan ID `user-2` ke grup dengan ID `group-2` menggunakan permintaan berlangganan berikut:

```
onGroupMessageCreated(userId : "user-2", groupId: :"group-2"){...}
```

AWS AppSync menjalankan resolver langganan, yang menghasilkan filter langganan dan pembatalan. Untuk klien B, filter langganan memungkinkan data dikirim hanya ke`group-2`, dan filter pembatalan ditentukan untuk keduanya `user-2` dan. `group-2`

Selanjutnya, asumsikan bahwa pesan grup baru dengan ID `message-1` dibuat menggunakan permintaan mutasi seperti pada contoh berikut:

```
createGroupMessage(id: "message-1", groupId :
      "group-1", message: "test message"){...}
```

Klien berlangganan yang cocok dengan filter yang ditentukan secara otomatis menerima muatan data berikut melalui: WebSockets

```
{
  "data": {
    "onGroupMessageCreated": {
      "id": "message-1",
      "groupId": "group-1",
      "message": "test message",
    }
  }
}
```

Klien A menerima pesan karena kriteria pemfilteran cocok dengan filter langganan yang ditentukan. Namun, klien B tidak menerima pesan, karena pengguna bukan bagian dari`group-1`. Selain itu, permintaan tidak cocok dengan filter langganan yang ditentukan dalam resolver langganan.

Akhirnya, asumsikan `user-1` bahwa dihapus dari `group-1` menggunakan permintaan mutasi berikut:

```
removeUserFromGroup(userId: "user-1", groupId : "group-1"){...}
```

Mutasi memulai pembatalan langganan seperti yang didefinisikan dalam kode penangan respons `extensions.invalidateSubscriptions()` resolvernya. AWS AppSync kemudian berhenti berlangganan klien A dan menutup koneksinya. WebSocket Klien B tidak terpengaruh, karena payload pembatalan yang ditentukan dalam mutasi tidak cocok dengan pengguna atau grupnya.

Ketika AWS AppSync membatalkan koneksi, klien menerima pesan yang mengonfirmasi bahwa mereka berhenti berlangganan:

```
{
  "message": "Subscription complete."
}
```

## Menggunakan variabel konteks dalam filter pembatalan langganan
<a name="aws-appsync-real-time-invalidation-context"></a>

Seperti halnya filter langganan yang disempurnakan, Anda dapat menggunakan [`context`variabel](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference-js.html) dalam ekstensi filter pembatalan langganan untuk mengakses data tertentu.

Misalnya, Anda dapat mengonfigurasi alamat email sebagai payload pembatalan dalam mutasi, lalu mencocokkannya dengan atribut email atau klaim dari pengguna berlangganan yang diotorisasi dengan kumpulan pengguna Amazon Cognito atau OpenID Connect. Filter pembatalan yang ditentukan dalam invalidator `extensions.setSubscriptionInvalidationFilter()` langganan memeriksa apakah alamat email yang ditetapkan oleh `extensions.invalidateSubscriptions()` muatan mutasi cocok dengan alamat email yang diambil dari token JWT pengguna, memulai pembatalan. `context.identity.claims.email`

# Membangun WebSocket klien real-time di AWS AppSync
<a name="real-time-websocket-client"></a>

**penting**  
Mulai 13 Maret 2025, Anda dapat membangun PubSub API real-time yang didukung dengan WebSockets menggunakan AWS AppSync Acara. Untuk informasi selengkapnya, lihat [Mempublikasikan acara melalui WebSocket](https://docs.aws.amazon.com/appsync/latest/eventapi/publish-websocket.html) *Panduan Pengembang AWS AppSync Acara*..

AWS AppSync WebSocket klien real-time memungkinkan langganan GraphQL melalui proses multi-langkah. Klien pertama-tama membuat WebSocket koneksi dengan titik akhir AWS AppSync real-time, mengirim pesan inisialisasi koneksi, dan menunggu pengakuan. Setelah koneksi berhasil, klien mendaftarkan langganan dengan mengirim pesan awal dengan kueri unik dan IDs GraphQL. AWS AppSync mengonfirmasi langganan yang berhasil dengan pesan pengakuan. Klien kemudian mendengarkan acara berlangganan, yang dipicu oleh mutasi yang sesuai. Untuk menjaga koneksi, AWS AppSync kirimkan pesan keep-alive secara berkala. Setelah selesai, klien membatalkan pendaftaran langganan dengan mengirim pesan berhenti. Sistem ini mendukung beberapa langganan pada satu WebSocket koneksi dan mengakomodasi berbagai mode otorisasi, termasuk kunci API, kumpulan pengguna Amazon Cognito, IAM, dan Lambda.

## Implementasi WebSocket klien real-time untuk langganan GraphQL
<a name="appsynclong-real-time-websocket-client-implementation-guide-for-graphql-subscriptions"></a>

Diagram urutan dan langkah-langkah berikut menunjukkan alur kerja langganan real-time antara WebSocket klien, klien HTTP, dan. AWS AppSync

![\[Sequence diagram showing WebSocket client, AppSync endpoints, and HTTP client interactions for real-time subscriptions.\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/realtime-client-flow.png)


1. Klien membuat WebSocket koneksi dengan titik akhir AWS AppSync real-time. Jika ada kesalahan jaringan, klien harus melakukan backoff eksponensial yang gelisah. Untuk informasi lebih lanjut, lihat [Eksponensial backoff dan jitter](https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/) di Blog Arsitektur. AWS 

1. (Opsional) Setelah berhasil membangun WebSocket koneksi, klien mengirim `connection_init` pesan.

1. Jika `connection_init` dikirim, klien menunggu `connection_ack` pesan dari AWS AppSync. Pesan ini menyertakan `connectionTimeoutMs` parameter, yang merupakan waktu tunggu maksimum dalam milidetik untuk pesan `"ka"` (keep-alive).

1. AWS AppSync mengirim `"ka"` pesan secara berkala. Klien melacak waktu menerima setiap `"ka"` pesan. Jika klien tidak menerima `"ka"` pesan dalam `connectionTimeoutMs` milidetik, klien harus menutup koneksi.

1. Klien mendaftarkan langganan dengan mengirim pesan `start` berlangganan. WebSocket Koneksi tunggal mendukung beberapa langganan, bahkan jika mereka berada dalam mode otorisasi yang berbeda.

1. Klien menunggu untuk mengirim `start_ack` pesan AWS AppSync untuk mengkonfirmasi langganan yang berhasil. Jika ada kesalahan, AWS AppSync mengembalikan `"type": "error"` pesan.

1. Klien mendengarkan acara berlangganan, yang dikirim setelah mutasi yang sesuai dipanggil. Kueri dan mutasi biasanya dikirim melalui `https://` titik akhir AWS AppSync GraphQL. Langganan mengalir melalui titik akhir AWS AppSync real-time menggunakan secure WebSocket ()`wss://`.

1. Klien membatalkan pendaftaran langganan dengan mengirim pesan `stop` berlangganan.

1. Setelah membatalkan pendaftaran semua langganan dan memeriksa bahwa tidak ada pesan yang ditransfer melalui WebSocket, klien dapat memutuskan sambungan dari koneksi. WebSocket 

## Detail jabat tangan untuk membuat koneksi WebSocket
<a name="handshake-details-to-establish-the-websocket-connection"></a>

Untuk menghubungkan dan memulai jabat tangan yang sukses dengan AWS AppSync, WebSocket klien membutuhkan yang berikut:
+ Titik akhir AWS AppSync waktu-nyata
+ Header - Berisi informasi yang relevan dengan AWS AppSync titik akhir dan otorisasi. AWS AppSync mendukung tiga metode berikut untuk menyediakan header: 
  + Header melalui string kueri
    + Informasi header dikodekan sebagai string base64, berasal dari objek JSON yang dirangkai. Objek JSON ini berisi rincian yang relevan dengan AWS AppSync endpoint dan otorisasi. Isi objek JSON bervariasi tergantung pada mode otorisasi.
  + Header melalui `Sec-WebSocket-Protocol`
    + String berenkode Base64URL dari objek JSON yang dirangkai yang berisi informasi yang relevan dengan AWS AppSync titik akhir dan otorisasi diteruskan sebagai protokol di header. `Sec-WebSocket-Protocol` Isi objek JSON bervariasi tergantung pada mode otorisasi.
  + Header melalui header HTTP standar:
    + Header dapat diteruskan sebagai header HTTP standar dalam permintaan koneksi, mirip dengan bagaimana header diteruskan untuk kueri dan mutasi GraphQL. AWS AppSync Namun, meneruskan header melalui header HTTP standar tidak didukung untuk permintaan koneksi API pribadi.
+  `payload`— String yang dikodekan Base64 dari. `payload` Payload diperlukan hanya jika header disediakan menggunakan string kueri

Dengan persyaratan ini, WebSocket klien dapat terhubung ke URL, yang berisi titik akhir real-time dengan string kueri, menggunakan `graphql-ws` sebagai WebSocket protokol.

### Menemukan titik akhir real-time dari titik akhir GraphQL
<a name="discovering-the-appsync-real-time-endpoint-from-the-appsync-graphql-endpoint"></a>

Endpoint GraphQL dan endpoint real-time sedikit berbeda AWS AppSync dalam protokol dan domain. AWS AppSync Anda dapat mengambil titik akhir GraphQL menggunakan perintah (). AWS Command Line Interface AWS CLI`aws appsync get-graphql-api`

****AWS AppSync Titik akhir GraphQL:****  
 `https://example1234567890000.appsync-api.us-east-1.amazonaws.com/graphql`

****AWS AppSync titik akhir waktu nyata:****  
 `wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql`

Aplikasi dapat terhubung ke titik akhir AWS AppSync GraphQL `https://` () menggunakan klien HTTP apa pun untuk kueri dan mutasi. Aplikasi dapat terhubung ke titik akhir AWS AppSync real-time (`wss://`) menggunakan WebSocket klien apa pun untuk berlangganan.

Dengan nama domain khusus, Anda dapat berinteraksi dengan kedua titik akhir menggunakan satu domain. Misalnya, jika Anda mengonfigurasi `api.example.com` sebagai domain kustom, Anda dapat berinteraksi dengan GraphQL dan titik akhir real-time menggunakan ini: URLs

**AWS AppSync titik akhir GraphQL domain kustom:**  
`https://api.example.com/graphql`

**AWS AppSync titik akhir real-time domain kustom:**  
`wss://api.example.com/graphql/realtime`

## Format parameter header berdasarkan mode otorisasi AWS AppSync API
<a name="header-parameter-format-based-on-appsync-api-authorization-mode"></a>

Format `header` objek yang digunakan dalam string kueri koneksi bervariasi tergantung pada mode otorisasi AWS AppSync API. `host`Bidang dalam objek mengacu pada titik akhir AWS AppSync GraphQL, yang digunakan untuk memvalidasi koneksi bahkan jika panggilan dilakukan `wss://` terhadap titik akhir real-time. Untuk memulai jabat tangan dan membuat koneksi resmi, `payload` harus menjadi objek JSON kosong. Payload diperlukan hanya jika header dilewatkan melalui string kueri.

Bagian berikut menunjukkan format header untuk setiap mode otorisasi.

### Kunci API
<a name="api-key"></a>

#### Header kunci API
<a name="api-key-list"></a>

**Isi header**
+  `"host": <string>`: Host untuk titik akhir AWS AppSync GraphQL atau nama domain kustom Anda.
+  `"x-api-key": <string>`: Kunci API dikonfigurasi untuk AWS AppSync API.

**Contoh**

```
{
    "host":"example1234567890000.appsync-api.us-east-1.amazonaws.com",
    "x-api-key":"da2-12345678901234567890123456"
}
```

**Header melalui string kueri**

Pertama, objek JSON yang berisi `host` dan `x-api-key` diubah menjadi string. Selanjutnya, string ini dikodekan menggunakan pengkodean base64. String yang dikodekan base64 yang dihasilkan ditambahkan sebagai parameter kueri yang diberi nama `header` ke WebSocket URL untuk membuat koneksi dengan titik akhir waktu nyata. AWS AppSync URL permintaan yang dihasilkan mengambil bentuk berikut:

```
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql?header=eyJob3N0IjoiZXhhbXBsZTEyMzQ1Njc4OTAwMDAuYXBwc3luYy1hcGkudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20iLCJ4LWFtei1kYXRlIjoiMjAyMDA0MDFUMDAxMDEwWiIsIngtYXBpLWtleSI6ImRhMi16NHc0NHZoczV6Z2MzZHRqNXNranJsbGxqaSJ9&payload=e30=
```

Penting untuk dicatat bahwa selain objek header yang dikodekan base64, objek JSON kosong \$1\$1 juga dikodekan base64 dan disertakan sebagai parameter kueri terpisah yang dinamai dalam URL. `payload` WebSocket

**Header melalui `Sec-WebSocket-Protocol`**

Sebuah objek JSON yang berisi `host` dan dikonversi ke string dan kemudian `x-api-key` dikodekan menggunakan pengkodean base64URL. String yang disandikan Base64URL yang dihasilkan diawali dengan. `header-` String awalan ini kemudian digunakan sebagai sub-protokol baru selain `graphql-ws` di `Sec-WebSocket-Protocol` header saat membuat WebSocket koneksi dengan titik akhir AWS AppSync real-time. 

URL permintaan yang dihasilkan mengambil bentuk berikut:

```
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql
```

`Sec-WebSocket-Protocol`Header berisi nilai berikut:

```
"sec-websocket-protocol" : ["graphql-ws", "header-ewogICAgImhvc3QiOiJleGFtcGxlMTIzNDU2Nzg5MDAwMC5hcHBzeW5jLWFwaS51cy1lYXN0LTEuYW1hem9uYXdzLmNvbSIsCiAgICAieC1hcGkta2V5IjoiZGEyLTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Igp9"]
```

**Header melalui header HTTP standar**

Dalam metode ini, informasi kunci host dan API ditransmisikan menggunakan header HTTP standar saat membuat WebSocket koneksi dengan titik akhir AWS AppSync real-time. URL permintaan yang dihasilkan mengambil bentuk berikut:

```
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql
```

Header permintaan akan mencakup yang berikut:

```
"sec-websocket-protocol" : ["graphql-ws"]
"host":"example1234567890000.appsync-api.us-east-1.amazonaws.com",
"x-api-key":"da2-12345678901234567890123456"
```

### Kumpulan pengguna Amazon Cognito dan OpenID Connect (OIDC)
<a name="amazon-cognito-user-pools-and-openid-connect-oidc"></a>

#### Header Amazon Cognito dan OIDC
<a name="amazon-cognito-user-pools-and-openid-connect-oidc-list"></a>

Isi header:
+  `"Authorization": <string>`: Token ID JWT. Header dapat menggunakan [skema Bearer](https://datatracker.ietf.org/doc/html/rfc6750#section-2.1).
+  `"host": <string>`: Host untuk titik akhir AWS AppSync GraphQL atau nama domain kustom Anda.

Contoh:

```
{
    "Authorization":"eyEXAMPLEiJjbG5xb3A5eW5MK09QYXIrMTJHWEFLSXBieU5WNHhsQjEXAMPLEnM2WldvPSIsImFsZyI6IlEXAMPLEn0.eyEXAMPLEiJhNmNmMjcwNy0xNjgxLTQ1NDItOWYxOC1lNjY0MTg2NjlkMzYiLCJldmVudF9pZCI6ImVkMzM5MmNkLWNjYTMtNGM2OC1hNDYyLTJlZGI3ZTNmY2FjZiIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4iLCJhdXRoX3RpbWUiOjE1Njk0NTc3MTgsImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5hcC1zb3V0aGVhc3QtMi5hbWF6b25hd3MuY29tXC9hcC1zb3V0aGVhc3QtMl83OHY0SVZibVAiLCJleHAiOjE1Njk0NjEzMjAsImlhdCI6MTU2OTQ1NzcyMCwianRpIjoiNTgzZjhmYmMtMzk2MS00YzA4LWJhZTAtYzQyY2IxMTM5NDY5IiwiY2xpZW50X2lkIjoiM3FlajVlMXZmMzd1N3RoZWw0dG91dDJkMWwiLCJ1c2VybmFtZSI6ImVsb3EXAMPLEn0.B4EXAMPLEFNpJ6ikVp7e6DRee95V6Qi-zEE2DJH7sHOl2zxYi7f-SmEGoh2AD8emxQRYajByz-rE4Jh0QOymN2Ys-ZIkMpVBTPgu-TMWDyOHhDUmUj2OP82yeZ3wlZAtr_gM4LzjXUXmI_K2yGjuXfXTaa1mvQEBG0mQfVd7SfwXB-jcv4RYVi6j25qgow9Ew52ufurPqaK-3WAKG32KpV8J4-Wejq8t0c-yA7sb8EnB551b7TU93uKRiVVK3E55Nk5ADPoam_WYE45i3s5qVAP_-InW75NUoOCGTsS8YWMfb6ecHYJ-1j-bzA27zaT9VjctXn9byNFZmEXAMPLExw",
    "host":"example1234567890000.appsync-api.us-east-1.amazonaws.com"
}
```

**Header melalui string kueri**

Pertama, objek JSON yang berisi `host` dan `Authorization` diubah menjadi string. Selanjutnya, string ini dikodekan menggunakan pengkodean base64. String yang dikodekan base64 yang dihasilkan ditambahkan sebagai parameter kueri yang diberi nama `header` ke WebSocket URL untuk membuat koneksi dengan titik akhir waktu nyata. AWS AppSync URL permintaan yang dihasilkan mengambil bentuk berikut:

```
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql?header=eyJBdXRob3JpemF0aW9uIjoiZXlKcmFXUWlPaUpqYkc1eGIzQTVlVzVNSzA5UVlYSXJNVEpIV0VGTFNYQmllVTVXTkhoc1FqaFBWVzlZTW5NMldsZHZQU0lzSW1Gc1p5STZJbEpUTWpVMkluMC5leUp6ZFdJaU9pSmhObU5tTWpjd055MHhOamd4TFRRMU5ESXRPV1l4T0MxbE5qWTBNVGcyTmpsa016WWlMQ0psZG1WdWRGOXBaQ0k2SW1Wa016TTVNbU5rTFdOallUTXROR00yT0MxaE5EWXlMVEpsWkdJM1pUTm1ZMkZqWmlJc0luUnZhMlZ1WDNWelpTSTZJbUZqWTJWemN5SXNJbk5qYjNCbElqb2lZWGR6TG1OdloyNXBkRzh1YzJsbmJtbHVMblZ6WlhJdVlXUnRhVzRpTENKaGRYUm9YM1JwYldVaU9qRTFOamswTlRjM01UZ3NJbWx6Y3lJNkltaDBkSEJ6T2x3dlhDOWpiMmR1YVhSdkxXbGtjQzVoY0MxemIzVjBhR1ZoYzNRdE1pNWhiV0Y2YjI1aGQzTXVZMjl0WEM5aGNDMXpiM1YwYUdWaGMzUXRNbDgzT0hZMFNWWmliVkFpTENKbGVIQWlPakUxTmprME5qRXpNakFzSW1saGRDSTZNVFUyT1RRMU56Y3lNQ3dpYW5ScElqb2lOVGd6WmpobVltTXRNemsyTVMwMFl6QTRMV0poWlRBdFl6UXlZMkl4TVRNNU5EWTVJaXdpWTJ4cFpXNTBYMmxrSWpvaU0zRmxhalZsTVhabU16ZDFOM1JvWld3MGRHOTFkREprTVd3aUxDSjFjMlZ5Ym1GdFpTSTZJbVZzYjNKNllXWmxJbjAuQjRjZEp0aDNLRk5wSjZpa1ZwN2U2RFJlZTk1VjZRaS16RUUyREpIN3NIT2wyenhZaTdmLVNtRUdvaDJBRDhlbXhRUllhakJ5ei1yRTRKaDBRT3ltTjJZcy1aSWtNcFZCVFBndS1UTVdEeU9IaERVbVVqMk9QODJ5ZVozd2xaQXRyX2dNNEx6alhVWG1JX0syeUdqdVhmWFRhYTFtdlFFQkcwbVFmVmQ3U2Z3WEItamN2NFJZVmk2ajI1cWdvdzlFdzUydWZ1clBxYUstM1dBS0czMktwVjhKNC1XZWpxOHQwYy15QTdzYjhFbkI1NTFiN1RVOTN1S1JpVlZLM0U1NU5rNUFEUG9hbV9XWUU0NWkzczVxVkFQXy1Jblc3NU5Vb09DR1RzUzhZV01mYjZlY0hZSi0xai1iekEyN3phVDlWamN0WG45YnlORlptS0xwQTJMY3h3IiwiaG9zdCI6ImV4YW1wbGUxMjM0NTY3ODkwMDAwLmFwcHN5bmMtYXBpLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tIn0=&payload=e30=
```

Penting untuk dicatat bahwa selain objek header yang dikodekan base64, objek JSON kosong \$1\$1 juga dikodekan base64 dan disertakan sebagai parameter kueri terpisah yang dinamai dalam URL. `payload` WebSocket

**Header melalui `Sec-WebSocket-Protocol`**

Sebuah objek JSON yang berisi `host` dan dikonversi ke string dan kemudian `Authorization` dikodekan menggunakan pengkodean base64URL. String yang disandikan Base64URL yang dihasilkan diawali dengan. `header-` String awalan ini kemudian digunakan sebagai sub-protokol baru selain `graphql-ws` di `Sec-WebSocket-Protocol` header saat membuat WebSocket koneksi dengan titik akhir AWS AppSync real-time. 

URL permintaan yang dihasilkan mengambil bentuk berikut:

```
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql
```

`Sec-WebSocket-Protocol`Header berisi nilai berikut:

```
"sec-websocket-protocol" : ["graphql-ws", "header-ewogICAgImhvc3QiOiJleGFtcGxlMTIzNDU2Nzg5MDAwMC5hcHBzeW5jLWFwaS51cy1lYXN0LTEuYW1hem9uYXdzLmNvbSIsCiAgICAieC1hcGkta2V5IjoiZGEyLTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Igp9"]
```

**Header melalui header HTTP standar**

Dalam metode ini, informasi host dan Otorisasi ditransmisikan menggunakan header HTTP standar saat membuat WebSocket koneksi dengan titik akhir AWS AppSync real-time. URL permintaan yang dihasilkan mengambil bentuk berikut:

```
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql
```

Header permintaan akan mencakup yang berikut:

```
"sec-websocket-protocol" : ["graphql-ws"]
"Authorization":"eyEXAMPLEiJjbG5xb3A5eW5MK09QYXIrMTJHWEFLSXBieU5WNHhsQjEXAMPLEnM2WldvPSIsImFsZyI6IlEXAMPLEn0.eyEXAMPLEiJhNmNmMjcwNy0xNjgxLTQ1NDItOWYxOC1lNjY0MTg2NjlkMzYiLCJldmVudF9pZCI6ImVkMzM5MmNkLWNjYTMtNGM2OC1hNDYyLTJlZGI3ZTNmY2FjZiIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4iLCJhdXRoX3RpbWUiOjE1Njk0NTc3MTgsImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5hcC1zb3V0aGVhc3QtMi5hbWF6b25hd3MuY29tXC9hcC1zb3V0aGVhc3QtMl83OHY0SVZibVAiLCJleHAiOjE1Njk0NjEzMjAsImlhdCI6MTU2OTQ1NzcyMCwianRpIjoiNTgzZjhmYmMtMzk2MS00YzA4LWJhZTAtYzQyY2IxMTM5NDY5IiwiY2xpZW50X2lkIjoiM3FlajVlMXZmMzd1N3RoZWw0dG91dDJkMWwiLCJ1c2VybmFtZSI6ImVsb3EXAMPLEn0.B4EXAMPLEFNpJ6ikVp7e6DRee95V6Qi-zEE2DJH7sHOl2zxYi7f-SmEGoh2AD8emxQRYajByz-rE4Jh0QOymN2Ys-ZIkMpVBTPgu-TMWDyOHhDUmUj2OP82yeZ3wlZAtr_gM4LzjXUXmI_K2yGjuXfXTaa1mvQEBG0mQfVd7SfwXB-jcv4RYVi6j25qgow9Ew52ufurPqaK-3WAKG32KpV8J4-Wejq8t0c-yA7sb8EnB551b7TU93uKRiVVK3E55Nk5ADPoam_WYE45i3s5qVAP_-InW75NUoOCGTsS8YWMfb6ecHYJ-1j-bzA27zaT9VjctXn9byNFZmEXAMPLExw",
"host":"example1234567890000.appsync-api.us-east-1.amazonaws.com"
```

### IAM
<a name="iam"></a>

#### Tajuk IAM
<a name="iam-list"></a>

**Konten header**
+  `"accept": "application/json, text/javascript"`: `<string>` Parameter konstan.
+  `"content-encoding": "amz-1.0"`: `<string>` Parameter konstan.
+  `"content-type": "application/json; charset=UTF-8"`: `<string>` Parameter konstan.
+  `"host": <string>`: Ini adalah host untuk titik akhir AWS AppSync GraphQL.
  + `"x-amz-date": <string>`: Stempel waktu harus dalam UTC dan dalam format ISO 8601 berikut: YYYYMMDD'T'HHMMSS'Z'. Misalnya, 20150830T123600Z adalah stempel waktu yang valid. Jangan sertakan milidetik dalam stempel waktu. Untuk informasi selengkapnya, lihat [Menangani tanggal di Tanda Tangan Versi 4](https://docs.aws.amazon.com/general/latest/gr/sigv4-date-handling.html) di *Referensi Umum AWS*.
  +  `"X-Amz-Security-Token": <string>`: Token AWS sesi, yang diperlukan saat menggunakan kredensil keamanan sementara. Untuk informasi selengkapnya, lihat [Menggunakan kredensil sementara dengan AWS sumber daya](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_credentials_temp_use-resources.html) di Panduan Pengguna *IAM*.
  +  `"Authorization": <string>`: Tanda tangan Versi 4 (SiGv4) informasi penandatanganan untuk titik akhir. AWS AppSync Untuk informasi selengkapnya tentang proses penandatanganan, lihat [Tugas 4: Menambahkan tanda tangan ke permintaan HTTP](https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html) di *Referensi Umum AWS*.

Permintaan HTTP penandatanganan SigV4 menyertakan URL kanonik, yang merupakan titik akhir AWS AppSync GraphQL dengan ditambahkan. `/connect` AWS Wilayah titik akhir layanan adalah Wilayah yang sama dengan tempat Anda menggunakan AWS AppSync API, dan nama layanannya adalah 'appsync'. Permintaan HTTP untuk menandatangani adalah sebagai berikut:

```
{
  url: "https://example1234567890000.appsync-api.us-east-1.amazonaws.com/graphql/connect",
  data: "{}",
  method: "POST",
  headers: {
    "accept": "application/json, text/javascript",
    "content-encoding": "amz-1.0",
    "content-type": "application/json; charset=UTF-8",
  }
}
```

**Contoh**

```
{
  "accept": "application/json, text/javascript",
  "content-encoding": "amz-1.0",
  "content-type": "application/json; charset=UTF-8",
  "host": "example1234567890000.appsync-api.us-east-1.amazonaws.com",
  "x-amz-date": "20200401T001010Z",
  "X-Amz-Security-Token": "AgEXAMPLEZ2luX2VjEAoaDmFwLXNvdXRoZWFEXAMPLEcwRQIgAh97Cljq7wOPL8KsxP3YtDuyc/9hAj8PhJ7Fvf38SgoCIQDhJEXAMPLEPspioOztj++pEagWCveZUjKEn0zyUhBEXAMPLEjj//////////8BEXAMPLExODk2NDgyNzg1NSIMo1mWnpESWUoYw4BkKqEFSrm3DXuL8w+ZbVc4JKjDP4vUCKNR6Le9C9pZp9PsW0NoFy3vLBUdAXEXAMPLEOVG8feXfiEEA+1khgFK/wEtwR+9zF7NaMMMse07wN2gG2tH0eKMEXAMPLEQX+sMbytQo8iepP9PZOzlZsSFb/dP5Q8hk6YEXAMPLEYcKZsTkDAq2uKFQ8mYUVA9EtQnNRiFLEY83aKvG/tqLWNnGlSNVx7SMcfovkFDqQamm+88y1OwwAEYK7qcoceX6Z7GGcaYuIfGpaX2MCCELeQvZ+8WxEgOnIfz7GYvsYNjLZSaRnV4G+ILY1F0QNW64S9Nvj+BwDg3ht2CrNvpwjVYlj9U3nmxE0UG5ne83LL5hhqMpm25kmL7enVgw2kQzmU2id4IKu0C/WaoDRuO2F5zE63vJbxN8AYs7338+4B4HBb6BZ6OUgg96Q15RA41/gIqxaVPxyTpDfTU5GfSLxocdYeniqqpFMtZG2n9d0u7GsQNcFkNcG3qDZm4tDo8tZbuym0a2VcF2E5hFEgXBa+XLJCfXi/77OqAEjP0x7Qdk3B43p8KG/BaioP5RsV8zBGvH1zAgyPha2rN70/tT13yrmPd5QYEfwzexjKrV4mWIuRg8NTHYSZJUaeyCwTom80VFUJXG+GYTUyv5W22aBcnoRGiCiKEYTLOkgXecdKFTHmcIAejQ9Welr0a196Kq87w5KNMCkcCGFnwBNFLmfnbpNqT6rUBxxs3X5ntX9d8HVtSYINTsGXXMZCJ7fnbWajhg/aox0FtHX21eF6qIGT8j1z+l2opU+ggwUgkhUUgCH2TfqBj+MLMVVvpgqJsPKt582caFKArIFIvO+9QupxLnEH2hz04TMTfnU6bQC6z1buVe7h+tOLnh1YPFsLQ88anib/7TTC8k9DsBTq0ASe8R2GbSEsmO9qbbMwgEaYUhOKtGeyQsSJdhSk6XxXThrWL9EnwBCXDkICMqdntAxyyM9nWsZ4bL9JHqExgWUmfWChzPFAqn3F4y896UqHTZxlq3WGypn5HHcem2Hqf3IVxKH1inhqdVtkryEiTWrI7ZdjbqnqRbl+WgtPtKOOweDlCaRs3R2qXcbNgVhleMk4IWnF8D1695AenU1LwHjOJLkCjxgNFiWAFEPH9aEXAMPLExA==",
  "Authorization": "AWS4-HMAC-SHA256 Credential=XXXXXXXXXXXXXXXXXXX/20200401/us-east-1/appsync/aws4_request, SignedHeaders=accept;content-encoding;content-type;host;x-amz-date;x-amz-security-token, Signature=83EXAMPLEbcc1fe3ee69f75cd5ebbf4cb4f150e4f99cec869f149c5EXAMPLEdc"
}
```

**Header melalui string kueri**

Pertama, objek JSON yang berisi titik akhir `host` (AWS AppSync GraphQL) dan header otorisasi lainnya diubah menjadi string. Selanjutnya, string ini dikodekan menggunakan pengkodean base64. String yang dikodekan base64 yang dihasilkan ditambahkan ke WebSocket URL sebagai parameter kueri bernama. `header` URL permintaan yang dihasilkan mengambil bentuk berikut:

```
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql?header=eyJBdXRob3JpemF0aW9uIjoiZXlKcmFXUWlPaUpqYkc1eGIzQTVlVzVNSzA5UVlYSXJNVEpIV0VGTFNYQmllVTVXTkhoc1FqaFBWVzlZTW5NMldsZHZQU0lzSW1Gc1p5STZJbEpUTWpVMkluMC5leUp6ZFdJaU9pSmhObU5tTWpjd055MHhOamd4TFRRMU5ESXRPV1l4T0MxbE5qWTBNVGcyTmpsa016WWlMQ0psZG1WdWRGOXBaQ0k2SW1Wa016TTVNbU5rTFdOallUTXROR00yT0MxaE5EWXlMVEpsWkdJM1pUTm1ZMkZqWmlJc0luUnZhMlZ1WDNWelpTSTZJbUZqWTJWemN5SXNJbk5qYjNCbElqb2lZWGR6TG1OdloyNXBkRzh1YzJsbmJtbHVMblZ6WlhJdVlXUnRhVzRpTENKaGRYUm9YM1JwYldVaU9qRTFOamswTlRjM01UZ3NJbWx6Y3lJNkltaDBkSEJ6T2x3dlhDOWpiMmR1YVhSdkxXbGtjQzVoY0MxemIzVjBhR1ZoYzNRdE1pNWhiV0Y2YjI1aGQzTXVZMjl0WEM5aGNDMXpiM1YwYUdWaGMzUXRNbDgzT0hZMFNWWmliVkFpTENKbGVIQWlPakUxTmprME5qRXpNakFzSW1saGRDSTZNVFUyT1RRMU56Y3lNQ3dpYW5ScElqb2lOVGd6WmpobVltTXRNemsyTVMwMFl6QTRMV0poWlRBdFl6UXlZMkl4TVRNNU5EWTVJaXdpWTJ4cFpXNTBYMmxrSWpvaU0zRmxhalZsTVhabU16ZDFOM1JvWld3MGRHOTFkREprTVd3aUxDSjFjMlZ5Ym1GdFpTSTZJbVZzYjNKNllXWmxJbjAuQjRjZEp0aDNLRk5wSjZpa1ZwN2U2RFJlZTk1VjZRaS16RUUyREpIN3NIT2wyenhZaTdmLVNtRUdvaDJBRDhlbXhRUllhakJ5ei1yRTRKaDBRT3ltTjJZcy1aSWtNcFZCVFBndS1UTVdEeU9IaERVbVVqMk9QODJ5ZVozd2xaQXRyX2dNNEx6alhVWG1JX0syeUdqdVhmWFRhYTFtdlFFQkcwbVFmVmQ3U2Z3WEItamN2NFJZVmk2ajI1cWdvdzlFdzUydWZ1clBxYUstM1dBS0czMktwVjhKNC1XZWpxOHQwYy15QTdzYjhFbkI1NTFiN1RVOTN1S1JpVlZLM0U1NU5rNUFEUG9hbV9XWUU0NWkzczVxVkFQXy1Jblc3NU5Vb09DR1RzUzhZV01mYjZlY0hZSi0xai1iekEyN3phVDlWamN0WG45YnlORlptS0xwQTJMY3h3IiwiaG9zdCI6ImV4YW1wbGUxMjM0NTY3ODkwMDAwLmFwcHN5bmMtYXBpLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tIn0=&payload=e30=
```

Penting untuk dicatat bahwa selain objek header yang dikodekan base64, objek JSON kosong \$1\$1 juga dikodekan base64 dan disertakan sebagai parameter kueri terpisah yang dinamai dalam URL. `payload` WebSocket

**Header melalui `Sec-WebSocket-Protocol`**

Objek JSON yang berisi header otorisasi `host` dan lainnya diubah menjadi string dan kemudian dikodekan menggunakan pengkodean base64URL. String yang disandikan Base64URL yang dihasilkan diawali dengan. `header-` String awalan ini kemudian digunakan sebagai sub-protokol baru selain `graphql-ws` di `Sec-WebSocket-Protocol` header saat membuat WebSocket koneksi dengan titik akhir AWS AppSync real-time. 

URL permintaan yang dihasilkan mengambil bentuk berikut:

```
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql
```

`Sec-WebSocket-Protocol`Header berisi nilai berikut:

```
"sec-websocket-protocol" : ["graphql-ws", "header-ew0KICAiYWNjZXB0IjogImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIsDQogICJjb250ZW50LWVuY29kaW5nIjogImFtei0xLjAiLA0KICAiY29udGVudC10eXBlIjogImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLTgiLA0KICAiaG9zdCI6ICJleGFtcGxlMTIzNDU2Nzg5MDAwMC5hcHBzeW5jLWFwaS51cy1lYXN0LTEuYW1hem9uYXdzLmNvbSIsDQogICJ4LWFtei1kYXRlIjogIjIwMjAwNDAxVDAwMTAxMFoiLA0KICAiWC1BbXotU2VjdXJpdHktVG9rZW4iOiAiQWdFWEFNUExFWjJsdVgyVmpFQW9hRG1Gd0xYTnZkWFJvWldGRVhBTVBMRWN3UlFJZ0FoOTdDbGpxN3dPUEw4S3N4UDNZdER1eWMvOWhBajhQaEo3RnZmMzhTZ29DSVFEaEpFWEFNUExFUHNwaW9PenRqKytwRWFnV0N2ZVpVaktFbjB6eVVoQkVYQU1QTEVqai8vLy8vLy8vLy84QkVYQU1QTEV4T0RrMk5EZ3lOemcxTlNJTW8xbVducEVTV1VvWXc0QmtLcUVGU3JtM0RYdUw4dytaYlZjNEpLakRQNHZVQ0tOUjZMZTlDOXBacDlQc1cwTm9GeTN2TEJVZEFYRVhBTVBMRU9WRzhmZVhmaUVFQSsxa2hnRksvd0V0d1IrOXpGN05hTU1Nc2UwN3dOMmdHMnRIMGVLTUVYQU1QTEVRWCtzTWJ5dFFvOGllcFA5UFpPemxac1NGYi9kUDVROGhrNllFWEFNUExFWWNLWnNUa0RBcTJ1S0ZROG1ZVVZBOUV0UW5OUmlGTEVZODNhS3ZHL3RxTFdObkdsU05WeDdTTWNmb3ZrRkRxUWFtbSs4OHkxT3d3QUVZSzdxY29jZVg2WjdHR2NhWXVJZkdwYVgyTUNDRUxlUXZaKzhXeEVnT25JZno3R1l2c1lOakxaU2FSblY0RytJTFkxRjBRTlc2NFM5TnZqK0J3RGczaHQyQ3JOdnB3alZZbGo5VTNubXhFMFVHNW5lODNMTDVoaHFNcG0yNWttTDdlblZndzJrUXptVTJpZDRJS3UwQy9XYW9EUnVPMkY1ekU2M3ZKYnhOOEFZczczMzgrNEI0SEJiNkJaNk9VZ2c5NlExNVJBNDEvZ0lxeGFWUHh5VHBEZlRVNUdmU0x4b2NkWWVuaXFxcEZNdFpHMm45ZDB1N0dzUU5jRmtOY0czcURabTR0RG84dFpidXltMGEyVmNGMkU1aEZFZ1hCYStYTEpDZlhpLzc3T3FBRWpQMHg3UWRrM0I0M3A4S0cvQmFpb1A1UnNWOHpCR3ZIMXpBZ3lQaGEyck43MC90VDEzeXJtUGQ1UVlFZnd6ZXhqS3JWNG1XSXVSZzhOVEhZU1pKVWFleUN3VG9tODBWRlVKWEcrR1lUVXl2NVcyMmFCY25vUkdpQ2lLRVlUTE9rZ1hlY2RLRlRIbWNJQWVqUTlXZWxyMGExOTZLcTg3dzVLTk1Da2NDR0Zud0JORkxtZm5icE5xVDZyVUJ4eHMzWDVudFg5ZDhIVnRTWUlOVHNHWFhNWkNKN2ZuYldhamhnL2FveDBGdEhYMjFlRjZxSUdUOGoxeitsMm9wVStnZ3dVZ2toVVVnQ0gyVGZxQmorTUxNVlZ2cGdxSnNQS3Q1ODJjYUZLQXJJRkl2Tys5UXVweExuRUgyaHowNFRNVGZuVTZiUUM2ejFidVZlN2grdE9MbmgxWVBGc0xRODhhbmliLzdUVEM4azlEc0JUcTBBU2U4UjJHYlNFc21POXFiYk13Z0VhWVVoT0t0R2V5UXNTSmRoU2s2WHhYVGhyV0w5RW53QkNYRGtJQ01xZG50QXh5eU05bldzWjRiTDlKSHFFeGdXVW1mV0NoelBGQXFuM0Y0eTg5NlVxSFRaeGxxM1dHeXBuNUhIY2VtMkhxZjNJVnhLSDFpbmhxZFZ0a3J5RWlUV3JJN1pkamJxbnFSYmwrV2d0UHRLT093ZURsQ2FSczNSMnFYY2JOZ1ZobGVNazRJV25GOEQxNjk1QWVuVTFMd0hqT0pMa0NqeGdORmlXQUZFUEg5YUVYQU1QTEV4QT09IiwNCiAgIkF1dGhvcml6YXRpb24iOiAiQVdTNC1ITUFDLVNIQTI1NiBDcmVkZW50aWFsPVhYWFhYWFhYWFhYWFhYWFhYWFgvMjAyMDA0MDEvdXMtZWFzdC0xL2FwcHN5bmMvYXdzNF9yZXF1ZXN0LCBTaWduZWRIZWFkZXJzPWFjY2VwdDtjb250ZW50LWVuY29kaW5nO2NvbnRlbnQtdHlwZTtob3N0O3gtYW16LWRhdGU7eC1hbXotc2VjdXJpdHktdG9rZW4sIFNpZ25hdHVyZT04M0VYQU1QTEViY2MxZmUzZWU2OWY3NWNkNWViYmY0Y2I0ZjE1MGU0Zjk5Y2VjODY5ZjE0OWM1RVhBTVBMRWRjIg0KfQ"]
```

**Header melalui header HTTP standar**

Dalam metode ini, host dan informasi otorisasi lainnya ditransmisikan menggunakan header HTTP standar saat membuat WebSocket koneksi dengan titik akhir AWS AppSync real-time. URL permintaan yang dihasilkan mengambil bentuk berikut:

```
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql
```

Header permintaan akan mencakup yang berikut:

```
"sec-websocket-protocol" : ["graphql-ws"]
"accept": "application/json, text/javascript",
"content-encoding": "amz-1.0",
"content-type": "application/json; charset=UTF-8",
"host": "example1234567890000.appsync-api.us-east-1.amazonaws.com",
"x-amz-date": "20200401T001010Z",
"X-Amz-Security-Token": "AgEXAMPLEZ2luX2VjEAoaDmFwLXNvdXRoZWFEXAMPLEcwRQIgAh97Cljq7wOPL8KsxP3YtDuyc/9hAj8PhJ7Fvf38SgoCIQDhJEXAMPLEPspioOztj++pEagWCveZUjKEn0zyUhBEXAMPLEjj//////////8BEXAMPLExODk2NDgyNzg1NSIMo1mWnpESWUoYw4BkKqEFSrm3DXuL8w+ZbVc4JKjDP4vUCKNR6Le9C9pZp9PsW0NoFy3vLBUdAXEXAMPLEOVG8feXfiEEA+1khgFK/wEtwR+9zF7NaMMMse07wN2gG2tH0eKMEXAMPLEQX+sMbytQo8iepP9PZOzlZsSFb/dP5Q8hk6YEXAMPLEYcKZsTkDAq2uKFQ8mYUVA9EtQnNRiFLEY83aKvG/tqLWNnGlSNVx7SMcfovkFDqQamm+88y1OwwAEYK7qcoceX6Z7GGcaYuIfGpaX2MCCELeQvZ+8WxEgOnIfz7GYvsYNjLZSaRnV4G+ILY1F0QNW64S9Nvj+BwDg3ht2CrNvpwjVYlj9U3nmxE0UG5ne83LL5hhqMpm25kmL7enVgw2kQzmU2id4IKu0C/WaoDRuO2F5zE63vJbxN8AYs7338+4B4HBb6BZ6OUgg96Q15RA41/gIqxaVPxyTpDfTU5GfSLxocdYeniqqpFMtZG2n9d0u7GsQNcFkNcG3qDZm4tDo8tZbuym0a2VcF2E5hFEgXBa+XLJCfXi/77OqAEjP0x7Qdk3B43p8KG/BaioP5RsV8zBGvH1zAgyPha2rN70/tT13yrmPd5QYEfwzexjKrV4mWIuRg8NTHYSZJUaeyCwTom80VFUJXG+GYTUyv5W22aBcnoRGiCiKEYTLOkgXecdKFTHmcIAejQ9Welr0a196Kq87w5KNMCkcCGFnwBNFLmfnbpNqT6rUBxxs3X5ntX9d8HVtSYINTsGXXMZCJ7fnbWajhg/aox0FtHX21eF6qIGT8j1z+l2opU+ggwUgkhUUgCH2TfqBj+MLMVVvpgqJsPKt582caFKArIFIvO+9QupxLnEH2hz04TMTfnU6bQC6z1buVe7h+tOLnh1YPFsLQ88anib/7TTC8k9DsBTq0ASe8R2GbSEsmO9qbbMwgEaYUhOKtGeyQsSJdhSk6XxXThrWL9EnwBCXDkICMqdntAxyyM9nWsZ4bL9JHqExgWUmfWChzPFAqn3F4y896UqHTZxlq3WGypn5HHcem2Hqf3IVxKH1inhqdVtkryEiTWrI7ZdjbqnqRbl+WgtPtKOOweDlCaRs3R2qXcbNgVhleMk4IWnF8D1695AenU1LwHjOJLkCjxgNFiWAFEPH9aEXAMPLExA==",
"Authorization": "AWS4-HMAC-SHA256 Credential=XXXXXXXXXXXXXXXXXXX/20200401/us-east-1/appsync/aws4_request, SignedHeaders=accept;content-encoding;content-type;host;x-amz-date;x-amz-security-token, Signature=83EXAMPLEbcc1fe3ee69f75cd5ebbf4cb4f150e4f99cec869f149c5EXAMPLEdc"
```

Untuk menandatangani permintaan menggunakan domain kustom:

```
{
  url: "https://api.example.com/graphql/connect",
  data: "{}",
  method: "POST",
  headers: {
    "accept": "application/json, text/javascript",
    "content-encoding": "amz-1.0",
    "content-type": "application/json; charset=UTF-8",
  }
}
```

**Contoh**

```
{
  "accept": "application/json, text/javascript",
  "content-encoding": "amz-1.0",
  "content-type": "application/json; charset=UTF-8",
  "host": "api.example.com",
  "x-amz-date": "20200401T001010Z",
  "X-Amz-Security-Token": "AgEXAMPLEZ2luX2VjEAoaDmFwLXNvdXRoZWFEXAMPLEcwRQIgAh97Cljq7wOPL8KsxP3YtDuyc/9hAj8PhJ7Fvf38SgoCIQDhJEXAMPLEPspioOztj++pEagWCveZUjKEn0zyUhBEXAMPLEjj//////////8BEXAMPLExODk2NDgyNzg1NSIMo1mWnpESWUoYw4BkKqEFSrm3DXuL8w+ZbVc4JKjDP4vUCKNR6Le9C9pZp9PsW0NoFy3vLBUdAXEXAMPLEOVG8feXfiEEA+1khgFK/wEtwR+9zF7NaMMMse07wN2gG2tH0eKMEXAMPLEQX+sMbytQo8iepP9PZOzlZsSFb/dP5Q8hk6YEXAMPLEYcKZsTkDAq2uKFQ8mYUVA9EtQnNRiFLEY83aKvG/tqLWNnGlSNVx7SMcfovkFDqQamm+88y1OwwAEYK7qcoceX6Z7GGcaYuIfGpaX2MCCELeQvZ+8WxEgOnIfz7GYvsYNjLZSaRnV4G+ILY1F0QNW64S9Nvj+BwDg3ht2CrNvpwjVYlj9U3nmxE0UG5ne83LL5hhqMpm25kmL7enVgw2kQzmU2id4IKu0C/WaoDRuO2F5zE63vJbxN8AYs7338+4B4HBb6BZ6OUgg96Q15RA41/gIqxaVPxyTpDfTU5GfSLxocdYeniqqpFMtZG2n9d0u7GsQNcFkNcG3qDZm4tDo8tZbuym0a2VcF2E5hFEgXBa+XLJCfXi/77OqAEjP0x7Qdk3B43p8KG/BaioP5RsV8zBGvH1zAgyPha2rN70/tT13yrmPd5QYEfwzexjKrV4mWIuRg8NTHYSZJUaeyCwTom80VFUJXG+GYTUyv5W22aBcnoRGiCiKEYTLOkgXecdKFTHmcIAejQ9Welr0a196Kq87w5KNMCkcCGFnwBNFLmfnbpNqT6rUBxxs3X5ntX9d8HVtSYINTsGXXMZCJ7fnbWajhg/aox0FtHX21eF6qIGT8j1z+l2opU+ggwUgkhUUgCH2TfqBj+MLMVVvpgqJsPKt582caFKArIFIvO+9QupxLnEH2hz04TMTfnU6bQC6z1buVe7h+tOLnh1YPFsLQ88anib/7TTC8k9DsBTq0ASe8R2GbSEsmO9qbbMwgEaYUhOKtGeyQsSJdhSk6XxXThrWL9EnwBCXDkICMqdntAxyyM9nWsZ4bL9JHqExgWUmfWChzPFAqn3F4y896UqHTZxlq3WGypn5HHcem2Hqf3IVxKH1inhqdVtkryEiTWrI7ZdjbqnqRbl+WgtPtKOOweDlCaRs3R2qXcbNgVhleMk4IWnF8D1695AenU1LwHjOJLkCjxgNFiWAFEPH9aEXAMPLExA==",
  "Authorization": "AWS4-HMAC-SHA256 Credential=XXXXXXXXXXXXXXXXXXX/20200401/us-east-1/appsync/aws4_request, SignedHeaders=accept;content-encoding;content-type;host;x-amz-date;x-amz-security-token, Signature=83EXAMPLEbcc1fe3ee69f75cd5ebbf4cb4f150e4f99cec869f149c5EXAMPLEdc"
}
```

**Minta URL dengan string kueri**

```
wss://api.example.com/graphql?header=eyEXAMPLEHQiOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFEXAMPLEQiLCJjb250ZW50LWVuY29kaW5nIjoEXAMPLEEuMCIsImNvbnRlbnQtdHlwZSI6ImFwcGxpY2F0aW9EXAMPLE47IGNoYXJzZXQ9VVRGLTgiLCJob3N0IjoiZXhhbXBsZEXAMPLENjc4OTAwMDAuYXBwc3luYy1hcGkudXMtZWFzdC0xLmFtYEXAMPLEcy5jb20iLCJ4LWFtei1kYXRlIjoiMjAyMDA0MDFUMDAxMDEwWiIsIlgtEXAMPLElY3VyaXR5LVRva2VuIjoiQWdvSmIzSnBaMmx1WDJWakVBb2FEbUZ3TFhOdmRYUm9aV0Z6ZEMweUlrY3dSUUlnQWg5N0NsanE3d09QTDhLc3hQM1l0RHV5Yy85aEFqOFBoSjdGdmYzOFNnb0NJUURoSllKYkpsbmpQc3Bpb096dGorK3BFYWdXQ3ZlWlVqS0VuMHp5VWhCbXhpck5CUWpqLy8vLy8vLy8vLzhCRUFBYUREY3hPRGsyTkRneU56ZzFOU0lNbzFtV25wRVNXVW9ZdzRCa0txRUZTcm0zRFh1TDh3K1piVmM0SktqRFA0dlVDS05SNkxlOUM5cFpwOVBzVzBOb0Z5M3ZMQlVkQVh3dDZQSld1T1ZHOGZlWGZpRUVBKzFraGdGSy93RXR3Uis5ekY3TmFNTU1zZTA3d04yZ0cydEgwZUtNVFhuOEF3QVFYK3NNYnl0UW84aWVwUDlQWk96bFpzU0ZiL2RQNVE4aGs2WWpHVGFMMWVZY0tac1RrREFxMnVLRlE4bVlVVkE5RXRRbk5SaUZMRVk4M2FLdkcvdHFMV05uR2xTTlZ4N1NNY2ZvdmtGRHFRYW1tKzg4eTFPd3dBRVlLN3Fjb2NlWDZaN0dHY2FZdUlmR3BhWDJNQ0NFTGVRdlorOFd4RWdPbklmejdHWXZzWU5qTFpTYVJuVjRHK0lMWTFGMFFOVzY0UzlOdmorQndEZzNodDJDck52cHdqVllsajlVM25teEUwVUc1bmU4M0xMNWhocU1wbTI1a21MN2VuVmd3MmtRem1VMmlkNElLdTBDL1dhb0RSdU8yRjV6RTYzdkpieE44QVlzNzMzOCs0QjRIQmI2Qlo2T1VnZzk2UTE1UkE0MS9nSXF4YVZQeHlUcERmVFU1R2ZTTHhvY2RZZW5pcXFwRk10WkcybjlkMHU3R3NRTmNGa05jRzNxRFptNHREbzh0WmJ1eW0wYTJWY0YyRTVoRkVnWEJhK1hMSkNmWGkvNzdPcUFFalAweDdRZGszQjQzcDhLRy9CYWlvUDVSc1Y4ekJHdkgxekFneVBoYTJyTjcwL3RUMTN5cm1QZDVRWUVmd3pleGpLclY0bVdJdVJnOE5USFlTWkpVYWV5Q3dUb204MFZGVUpYRytHWVRVeXY1VzIyYUJjbm9SR2lDaUtFWVRMT2tnWGVjZEtGVEhtY0lBZWpROVdlbHIwYTE5NktxODd3NUtOTUNrY0NHRm53Qk5GTG1mbmJwTnFUNnJVQnh4czNYNW50WDlkOEhWdFNZSU5Uc0dYWE1aQ0o3Zm5iV2FqaGcvYW94MEZ0SFgyMWVGNnFJR1Q4ajF6K2wyb3BVK2dnd1Vna2hVVWdDSDJUZnFCaitNTE1WVnZwZ3FKc1BLdDU4MmNhRktBcklGSXZPKzlRdXB4TG5FSDJoejA0VE1UZm5VNmJRQzZ6MWJ1VmU3aCt0T0xuaDFZUEZzTFE4OGFuaWIvN1RUQzhrOURzQlRxMEFTZThSMkdiU0VzbU85cWJiTXdnRWFZVWhPS3RHZXlRc1NKZGhTazZYeFhUaHJXTDlFbndCQ1hEa0lDTXFkbnRBeHl5TTluV3NaNGJMOUpIcUV4Z1dVbWZXQ2h6UEZBcW4zRjR5ODk2VXFIVFp4bHEzV0d5cG41SEhjZW0ySHFmM0lWeEtIMWluaHFkVnRrcnlFaVRXckk3WmRqYnFucVJibCtXZ3RQdEtPT3dlRGxDYVJzM1IycVhjYk5nVmhsZU1rNElXbkY4RDE2OTVBZW5VMUx3SGpPSkxrQ2p4Z05GaVdBRkVQSDlhTklhcXMvWnhBPT0iLCJBdXRob3JpemF0aW9uIjoiQVdTNC1ITUFDLVNIQTI1NiBDcmVkZW50aWFsPVhYWFhYWFhYWFhYWFhYWFhYWFgvMjAxOTEwMDIvdXMtZWFzdC0xEXAMPLE5bmMvYXdzNF9yZXF1ZXN0LCBTaWduZWRIZWFkZXJzPWFjY2VwdDtjb250ZWEXAMPLE29kaW5nO2NvbnRlbnQtdHlwZTtob3EXAMPLEW16LWRhdGU7eC1hbXotc2VjdXJpdHktdG9rZW4sIFNpZ25hdHVyZT04MzE4EXAMPLEiY2MxZmUzZWU2OWY3NWNkEXAMPLE0Y2I0ZjE1MGU0Zjk5Y2VjODY5ZjE0OWM1ZDAzNDEXAMPLEn0=&payload=e30=
```

**catatan**  
Satu WebSocket koneksi dapat memiliki beberapa langganan (bahkan dengan mode otentikasi yang berbeda). Salah satu cara untuk menerapkan ini adalah dengan membuat WebSocket koneksi untuk langganan pertama dan kemudian menutupnya ketika langganan terakhir tidak terdaftar. Anda dapat mengoptimalkan ini dengan menunggu beberapa detik sebelum menutup WebSocket koneksi, jika aplikasi berlangganan segera setelah langganan terakhir tidak terdaftar. Untuk contoh aplikasi seluler, saat mengubah dari satu layar ke layar lainnya, saat *melepas pemasangan*, ia menghentikan langganan, dan pada acara *pemasangan*, ia memulai langganan yang berbeda.

### Otorisasi Lambda
<a name="lambda-auth"></a>

#### Header otorisasi Lambda
<a name="lambda-auth-list"></a>

**Konten header**
+  `"Authorization": <string>`: Nilai yang dilewatkan sebagai`authorizationToken`.
+  `"host": <string>`: Host untuk titik akhir AWS AppSync GraphQL atau nama domain kustom Anda.

**Contoh**

```
{
    "Authorization":"M0UzQzM1MkQtMkI0Ni00OTZCLUI1NkQtMUM0MTQ0QjVBRTczCkI1REEzRTIxLTk5NzItNDJENi1BQjMwLTFCNjRFNzQ2NzlCNQo=",
    "host":"example1234567890000.appsync-api.us-east-1.amazonaws.com"
}
```

**Header melalui string kueri**

Pertama, objek JSON yang berisi `host` dan `Authorization` diubah menjadi string. Selanjutnya, string ini dikodekan menggunakan pengkodean base64. String yang dikodekan base64 yang dihasilkan ditambahkan sebagai parameter kueri yang diberi nama `header` ke WebSocket URL untuk membuat koneksi dengan titik akhir waktu nyata. AWS AppSync URL permintaan yang dihasilkan mengambil bentuk berikut:

```
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql?header=eyJBdXRob3JpemF0aW9uIjoiZXlKcmFXUWlPaUpqYkc1eGIzQTVlVzVNSzA5UVlYSXJNVEpIV0VGTFNYQmllVTVXTkhoc1FqaFBWVzlZTW5NMldsZHZQU0lzSW1Gc1p5STZJbEpUTWpVMkluMC5leUp6ZFdJaU9pSmhObU5tTWpjd055MHhOamd4TFRRMU5ESXRPV1l4T0MxbE5qWTBNVGcyTmpsa016WWlMQ0psZG1WdWRGOXBaQ0k2SW1Wa016TTVNbU5rTFdOallUTXROR00yT0MxaE5EWXlMVEpsWkdJM1pUTm1ZMkZqWmlJc0luUnZhMlZ1WDNWelpTSTZJbUZqWTJWemN5SXNJbk5qYjNCbElqb2lZWGR6TG1OdloyNXBkRzh1YzJsbmJtbHVMblZ6WlhJdVlXUnRhVzRpTENKaGRYUm9YM1JwYldVaU9qRTFOamswTlRjM01UZ3NJbWx6Y3lJNkltaDBkSEJ6T2x3dlhDOWpiMmR1YVhSdkxXbGtjQzVoY0MxemIzVjBhR1ZoYzNRdE1pNWhiV0Y2YjI1aGQzTXVZMjl0WEM5aGNDMXpiM1YwYUdWaGMzUXRNbDgzT0hZMFNWWmliVkFpTENKbGVIQWlPakUxTmprME5qRXpNakFzSW1saGRDSTZNVFUyT1RRMU56Y3lNQ3dpYW5ScElqb2lOVGd6WmpobVltTXRNemsyTVMwMFl6QTRMV0poWlRBdFl6UXlZMkl4TVRNNU5EWTVJaXdpWTJ4cFpXNTBYMmxrSWpvaU0zRmxhalZsTVhabU16ZDFOM1JvWld3MGRHOTFkREprTVd3aUxDSjFjMlZ5Ym1GdFpTSTZJbVZzYjNKNllXWmxJbjAuQjRjZEp0aDNLRk5wSjZpa1ZwN2U2RFJlZTk1VjZRaS16RUUyREpIN3NIT2wyenhZaTdmLVNtRUdvaDJBRDhlbXhRUllhakJ5ei1yRTRKaDBRT3ltTjJZcy1aSWtNcFZCVFBndS1UTVdEeU9IaERVbVVqMk9QODJ5ZVozd2xaQXRyX2dNNEx6alhVWG1JX0syeUdqdVhmWFRhYTFtdlFFQkcwbVFmVmQ3U2Z3WEItamN2NFJZVmk2ajI1cWdvdzlFdzUydWZ1clBxYUstM1dBS0czMktwVjhKNC1XZWpxOHQwYy15QTdzYjhFbkI1NTFiN1RVOTN1S1JpVlZLM0U1NU5rNUFEUG9hbV9XWUU0NWkzczVxVkFQXy1Jblc3NU5Vb09DR1RzUzhZV01mYjZlY0hZSi0xai1iekEyN3phVDlWamN0WG45YnlORlptS0xwQTJMY3h3IiwiaG9zdCI6ImV4YW1wbGUxMjM0NTY3ODkwMDAwLmFwcHN5bmMtYXBpLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tIn0=&payload=e30=
```

Penting untuk dicatat bahwa selain objek header yang dikodekan base64, objek JSON kosong \$1\$1 juga dikodekan base64 dan disertakan sebagai parameter kueri terpisah yang dinamai dalam URL. `payload` WebSocket

**Header melalui `Sec-WebSocket-Protocol`**

Sebuah objek JSON yang berisi `host` dan dikonversi ke string dan kemudian `Authorization` dikodekan menggunakan pengkodean base64URL. String yang disandikan Base64URL yang dihasilkan diawali dengan. `header-` String awalan ini kemudian digunakan sebagai sub-protokol baru selain `graphql-ws` di `Sec-WebSocket-Protocol` header saat membuat WebSocket koneksi dengan titik akhir AWS AppSync real-time. 

URL permintaan yang dihasilkan mengambil bentuk berikut:

```
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql
```

`Sec-WebSocket-Protocol`Header berisi nilai berikut:

```
"sec-websocket-protocol" : ["graphql-ws", "header-ewogICAgImhvc3QiOiJleGFtcGxlMTIzNDU2Nzg5MDAwMC5hcHBzeW5jLWFwaS51cy1lYXN0LTEuYW1hem9uYXdzLmNvbSIsCiAgICAieC1hcGkta2V5IjoiZGEyLTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Igp9"]
```

**Header melalui header HTTP standar**

Dalam metode ini, informasi host dan Otorisasi ditransmisikan menggunakan header HTTP standar saat membuat WebSocket koneksi dengan titik akhir AWS AppSync real-time. URL permintaan yang dihasilkan mengambil bentuk berikut:

```
wss://example1234567890000.appsync-realtime-api.us-east-1.amazonaws.com/graphql
```

Header permintaan akan mencakup yang berikut:

```
"sec-websocket-protocol" : ["graphql-ws"]
"Authorization":"eyEXAMPLEiJjbG5xb3A5eW5MK09QYXIrMTJHWEFLSXBieU5WNHhsQjEXAMPLEnM2WldvPSIsImFsZyI6IlEXAMPLEn0.eyEXAMPLEiJhNmNmMjcwNy0xNjgxLTQ1NDItOWYxOC1lNjY0MTg2NjlkMzYiLCJldmVudF9pZCI6ImVkMzM5MmNkLWNjYTMtNGM2OC1hNDYyLTJlZGI3ZTNmY2FjZiIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4iLCJhdXRoX3RpbWUiOjE1Njk0NTc3MTgsImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5hcC1zb3V0aGVhc3QtMi5hbWF6b25hd3MuY29tXC9hcC1zb3V0aGVhc3QtMl83OHY0SVZibVAiLCJleHAiOjE1Njk0NjEzMjAsImlhdCI6MTU2OTQ1NzcyMCwianRpIjoiNTgzZjhmYmMtMzk2MS00YzA4LWJhZTAtYzQyY2IxMTM5NDY5IiwiY2xpZW50X2lkIjoiM3FlajVlMXZmMzd1N3RoZWw0dG91dDJkMWwiLCJ1c2VybmFtZSI6ImVsb3EXAMPLEn0.B4EXAMPLEFNpJ6ikVp7e6DRee95V6Qi-zEE2DJH7sHOl2zxYi7f-SmEGoh2AD8emxQRYajByz-rE4Jh0QOymN2Ys-ZIkMpVBTPgu-TMWDyOHhDUmUj2OP82yeZ3wlZAtr_gM4LzjXUXmI_K2yGjuXfXTaa1mvQEBG0mQfVd7SfwXB-jcv4RYVi6j25qgow9Ew52ufurPqaK-3WAKG32KpV8J4-Wejq8t0c-yA7sb8EnB551b7TU93uKRiVVK3E55Nk5ADPoam_WYE45i3s5qVAP_-InW75NUoOCGTsS8YWMfb6ecHYJ-1j-bzA27zaT9VjctXn9byNFZmEXAMPLExw",
"host":"example1234567890000.appsync-api.us-east-1.amazonaws.com"
```

## WebSocket Operasi waktu nyata
<a name="real-time-websocket-operation"></a>

Setelah memulai WebSocket jabat tangan yang sukses dengan AWS AppSync, klien harus mengirim pesan berikutnya untuk terhubung ke AWS AppSync operasi yang berbeda. Pesan-pesan ini memerlukan data berikut:
+  `type`: Jenis operasi.
+  `id`: Pengenal unik untuk langganan. Kami merekomendasikan menggunakan UUID untuk tujuan ini.
+  `payload`: Muatan terkait, tergantung pada jenis operasi.

`type`Bidang adalah satu-satunya bidang yang diperlukan; `id` dan `payload` bidang adalah opsional.

### Urutan peristiwa
<a name="sequence-of-events"></a>

Agar berhasil memulai, membuat, mendaftar, dan memproses permintaan berlangganan, klien harus melangkah melalui urutan berikut:

1. Inisialisasi koneksi () `connection_init`

1. Pengakuan koneksi () `connection_ack`

1. Pendaftaran berlangganan (`start`)

1. Pengakuan berlangganan () `start_ack`

1. Memproses berlangganan (`data`)

1. Unregistrasi langganan () `stop`

## Koneksi pesan init
<a name="connection-init-message"></a>

(Opsional) Setelah jabat tangan berhasil, klien dapat mengirim `connection_init` pesan untuk mulai berkomunikasi dengan titik akhir AWS AppSync real-time. Pesannya adalah string yang diperoleh dengan merangkai objek JSON sebagai berikut:

```
{ "type": "connection_init" }
```

## Koneksi mengakui pesan
<a name="connection-acknowledge-message"></a>

Setelah mengirim `connection_init` pesan, klien harus menunggu `connection_ack` pesan. Semua pesan yang dikirim sebelum menerima `connection_ack` diabaikan. Pesan harus berbunyi sebagai berikut:

```
{
  "type": "connection_ack",
  "payload": {
    // Time in milliseconds waiting for ka message before the client should terminate the WebSocket connection
    "connectionTimeoutMs": 300000
  }
}
```

## Pesan keep-alive
<a name="keep-alive-message"></a>

Selain pesan pengakuan koneksi, klien secara berkala menerima pesan keep-alive. Jika klien tidak menerima pesan keep-alive dalam periode batas waktu koneksi, klien harus menutup koneksi. AWS AppSync terus mengirim pesan-pesan ini dan melayani langganan terdaftar sampai mematikan koneksi secara otomatis (setelah 24 jam). Pesan yang tetap hidup adalah detak jantung dan tidak perlu klien untuk mengakuinya.

```
{ "type": "ka" }
```

## Pesan pendaftaran berlangganan
<a name="subscription-registration-message"></a>

Setelah klien menerima `connection_ack` pesan, klien dapat mengirim pesan pendaftaran langganan ke AWS AppSync. Jenis pesan ini adalah objek JSON stringified yang berisi bidang-bidang berikut:
+  `"id": <string>`: ID langganan. ID ini harus unik untuk setiap langganan, jika tidak server mengembalikan kesalahan yang menunjukkan bahwa ID langganan diduplikasi.
+  `"type": "start"`: `<string>` Parameter konstan.
+  `"payload": <Object>`: Objek yang berisi informasi yang relevan dengan langganan.
  +  `"data": <string>`: Sebuah objek JSON stringified yang berisi query GraphQL dan variabel.
    +  `"query": <string>`: Operasi GraphQL.
    +  `"variables": <Object>`: Sebuah objek yang berisi variabel untuk query.
  +  `"extensions": <Object>`: Objek yang berisi objek otorisasi.
+  `"authorization": <Object>`: Objek yang berisi bidang yang diperlukan untuk otorisasi.

### Objek otorisasi untuk pendaftaran berlangganan
<a name="authorization-object-for-subscription-registration"></a>

Aturan yang sama di [Format parameter header berdasarkan mode otorisasi AWS AppSync API](#header-parameter-format-based-on-appsync-api-authorization-mode) bagian ini berlaku untuk objek otorisasi. Satu-satunya pengecualian adalah untuk IAM, di mana informasi tanda tangan SiGv4 sedikit berbeda. Untuk lebih jelasnya, lihat contoh IAM.

Contoh menggunakan kumpulan pengguna Amazon Cognito:

```
{
  "id": "ee849ef0-cf23-4cb8-9fcb-152ae4fd1e69",
  "payload": {
    "data": "{\"query\":\"subscription onCreateMessage {\\n onCreateMessage {\\n __typename\\n message\\n }\\n }\",\"variables\":{}}",
      "extensions": {
        "authorization": {
          "Authorization": "eyEXAMPLEiJjbG5xb3A5eW5MK09QYXIrMTJEXAMPLEBieU5WNHhsQjhPVW9YMnM2WldvPSIsImFsZyI6IlEXAMPLEn0.eyJzdWIiOiJhNmNmMjcwNy0xNjgxLTQ1NDItEXAMPLENjY0MTg2NjlkMzYiLCJldmVudF9pZCI6ImU3YWVmMzEyLWUEXAMPLEY0Zi04YjlhLTRjMWY5M2Q5ZTQ2OCIsInRva2VuX3VzZSI6ImFjY2VzcyIsIEXAMPLEIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4iLCJhdXRoX3RpbWUiOjE1Njk2MTgzMzgsImlzcyI6Imh0dEXAMPLEXC9jb2duaXRvLWlkcC5hcC1zb3V0aGVhc3QtMi5hbWF6b25hd3MuY29tXC9hcC1zbEXAMPLEc3QtMl83OHY0SVZibVAiLCJleHAiOjE1NzAyNTQ3NTUsImlhdCI6MTU3MDI1MTE1NSwianRpIjoiMmIEXAMPLEktZTVkMi00ZDhkLWJiYjItNjA0YWI4MDEwOTg3IiwiY2xpZW50X2lkIjoiM3FlajVlMXZmMzd1EXAMPLE0dG91dDJkMWwiLCJ1c2VybmFtZSI6ImVsb3J6YWZlIn0.CT-qTCtrYeboUJ4luRSTPXaNewNeEXAMPLE14C6sfg05tO0fOMpiUwj9k19gtNCCMqoSsjtQoUweFnH4JYa5EXAMPLEVxOyQEQ4G7jQrt5Ks6STn53vuseR3zRW9snWgwz7t3ZmQU-RWvW7yQU3sNQRLEXAMPLEcd0yufBiCYs3dfQxTTdvR1B6Wz6CD78lfNeKqfzzUn2beMoup2h6EXAMPLE4ow8cUPUPvG0DzRtHNMbWskjPanu7OuoZ8iFO_Eot9kTtAlVKYoNbWkZhkD8dxutyoU4RSH5JoLAnrGF5c8iKgv0B2dfEXAMPLEIihxaZVJ9w9w48S4EXAMPLEcA",
          "host": "example1234567890000.appsync-api.us-east-1.amazonaws.com"
         }
      }
  },
  "type": "start"
}
```

Contoh menggunakan IAM:

```
{
  "id": "eEXAMPLE-cf23-1234-5678-152EXAMPLE69",
  "payload": {
    "data": "{\"query\":\"subscription onCreateMessage {\\n onCreateMessage {\\n __typename\\n message\\n }\\n }\",\"variables\":{}}",
    "extensions": {
      "authorization": {
        "accept": "application/json, text/javascript",
        "content-type": "application/json; charset=UTF-8",
        "X-Amz-Security-Token": "AgEXAMPLEZ2luX2VjEAoaDmFwLXNvdXRoZWFEXAMPLEcwRQIgAh97Cljq7wOPL8KsxP3YtDuyc/9hAj8PhJ7Fvf38SgoCIQDhJEXAMPLEPspioOztj++pEagWCveZUjKEn0zyUhBEXAMPLEjj//////////8BEXAMPLExODk2NDgyNzg1NSIMo1mWnpESWUoYw4BkKqEFSrm3DXuL8w+ZbVc4JKjDP4vUCKNR6Le9C9pZp9PsW0NoFy3vLBUdAXEXAMPLEOVG8feXfiEEA+1khgFK/wEtwR+9zF7NaMMMse07wN2gG2tH0eKMEXAMPLEQX+sMbytQo8iepP9PZOzlZsSFb/dP5Q8hk6YEXAMPLEYcKZsTkDAq2uKFQ8mYUVA9EtQnNRiFLEY83aKvG/tqLWNnGlSNVx7SMcfovkFDqQamm+88y1OwwAEYK7qcoceX6Z7GGcaYuIfGpaX2MCCELeQvZ+8WxEgOnIfz7GYvsYNjLZSaRnV4G+ILY1F0QNW64S9Nvj+BwDg3ht2CrNvpwjVYlj9U3nmxE0UG5ne83LL5hhqMpm25kmL7enVgw2kQzmU2id4IKu0C/WaoDRuO2F5zE63vJbxN8AYs7338+4B4HBb6BZ6OUgg96Q15RA41/gIqxaVPxyTpDfTU5GfSLxocdYeniqqpFMtZG2n9d0u7GsQNcFkNcG3qDZm4tDo8tZbuym0a2VcF2E5hFEgXBa+XLJCfXi/77OqAEjP0x7Qdk3B43p8KG/BaioP5RsV8zBGvH1zAgyPha2rN70/tT13yrmPd5QYEfwzexjKrV4mWIuRg8NTHYSZJUaeyCwTom80VFUJXG+GYTUyv5W22aBcnoRGiCiKEYTLOkgXecdKFTHmcIAejQ9Welr0a196Kq87w5KNMCkcCGFnwBNFLmfnbpNqT6rUBxxs3X5ntX9d8HVtSYINTsGXXMZCJ7fnbWajhg/aox0FtHX21eF6qIGT8j1z+l2opU+ggwUgkhUUgCH2TfqBj+MLMVVvpgqJsPKt582caFKArIFIvO+9QupxLnEH2hz04TMTfnU6bQC6z1buVe7h+tOLnh1YPFsLQ88anib/7TTC8k9DsBTq0ASe8R2GbSEsmO9qbbMwgEaYUhOKtGeyQsSJdhSk6XxXThrWL9EnwBCXDkICMqdntAxyyM9nWsZ4bL9JHqExgWUmfWChzPFAqn3F4y896UqHTZxlq3WGypn5HHcem2Hqf3IVxKH1inhqdVtkryEiTWrI7ZdjbqnqRbl+WgtPtKOOweDlCaRs3R2qXcbNgVhleMk4IWnF8D1695AenU1LwHjOJLkCjxgNFiWAFEPH9aEXAMPLExA==",
        "Authorization": "AWS4-HMAC-SHA256 Credential=XXXXXXXXXXXXXXXXXXXX/20200401/us-east-1/appsync/aws4_request, SignedHeaders=accept;content-encoding;content-type;host;x-amz-date;x-amz-security-token, Signature=b90131a61a7c4318e1c35ead5dbfdeb46339a7585bbdbeceeaff51f4022eb1fd",
        "content-encoding": "amz-1.0",
        "host": "example1234567890000.appsync-api.us-east-1.amazonaws.com",
        "x-amz-date": "20200401T001010Z"
      }
    }
  },
  "type": "start"
}
```

Contoh menggunakan nama domain kustom:

```
{
  "id": "key-cf23-4cb8-9fcb-152ae4fd1e69",
  "payload": {
    "data": "{\"query\":\"subscription onCreateMessage {\\n onCreateMessage {\\n __typename\\n message\\n }\\n }\",\"variables\":{}}",
      "extensions": {
        "authorization": {
          "x-api-key": "da2-12345678901234567890123456",
          "host": "api.example.com"
         }
      }
  },
  "type": "start"
}
```

Tanda tangan SigV4 tidak perlu ditambahkan `/connect` ke URL, dan operasi GraphQL stringified JSON menggantikan. `data` Berikut ini adalah contoh permintaan tanda tangan SiGv4:

```
{
  url: "https://example1234567890000.appsync-api.us-east-1.amazonaws.com/graphql",
  data: "{\"query\":\"subscription onCreateMessage {\\n onCreateMessage {\\n __typename\\n message\\n }\\n }\",\"variables\":{}}",
  method: "POST",
  headers: {
    "accept": "application/json, text/javascript",
    "content-encoding": "amz-1.0",
    "content-type": "application/json; charset=UTF-8",
  }
}
```

## Pesan pengakuan berlangganan
<a name="subscription-acknowledge-message"></a>

Setelah mengirim pesan mulai berlangganan, klien harus menunggu AWS AppSync untuk mengirim `start_ack` pesan. `start_ack`Pesan tersebut menunjukkan bahwa langganan berhasil.

Contoh pengakuan berlangganan:

```
{
  "type": "start_ack",
  "id": "eEXAMPLE-cf23-1234-5678-152EXAMPLE69"
}
```

## Pesan kesalahan
<a name="error-message"></a>

Jika koneksi init atau pendaftaran langganan gagal, atau jika langganan berakhir dari server, server mengirimkan pesan kesalahan ke klien. Jika kesalahan terjadi selama koneksi waktu init, koneksi akan ditutup oleh server.
+  `"type": "error"`: `<string>` Parameter konstan.
+  `"id": <string>`: ID dari langganan terdaftar yang sesuai, jika relevan.
+  `"payload" <Object>`: Objek yang berisi informasi kesalahan yang sesuai.

Contoh:

```
{
  "type": "error",
  "payload": {
    "errors": [
      {
        "errorType": "LimitExceededError",
        "message": "Rate limit exceeded"
      }
    ]
  }
}
```

## Memproses pesan data
<a name="processing-data-messages"></a>

Ketika klien mengirimkan mutasi, AWS AppSync mengidentifikasi semua pelanggan yang tertarik padanya dan mengirim `"type":"data"` pesan ke masing-masing menggunakan langganan yang sesuai `id` dari operasi berlangganan. `"start"` Klien diharapkan untuk melacak langganan `id` yang dikirimkannya sehingga ketika menerima pesan data, klien dapat mencocokkannya dengan langganan yang sesuai.
+  `"type": "data"`: `<string>` Parameter konstan.
+  `"id": <string>`: ID dari langganan terdaftar yang sesuai.
+  `"payload" <Object>`: Objek yang berisi informasi berlangganan.

Contoh:

```
{
  "type": "data",
  "id": "ee849ef0-cf23-4cb8-9fcb-152ae4fd1e69",
  "payload": {
    "data": {
      "onCreateMessage": {
        "__typename": "Message",
        "message": "test"
      }
    }
  }
}
```

## Pesan pembatalan pendaftaran berlangganan
<a name="subscription-unregistration-message"></a>

Saat aplikasi ingin berhenti mendengarkan acara berlangganan, klien harus mengirim pesan dengan objek JSON yang dirangkai berikut:
+  `"type": "stop"`: `<string>` Parameter konstan.
+  `"id": <string>`: ID langganan untuk membatalkan pendaftaran.

Contoh:

```
{
  "type":"stop",
  "id":"ee849ef0-cf23-4cb8-9fcb-152ae4fd1e69"
}
```

AWS AppSync mengirimkan kembali pesan konfirmasi dengan objek JSON stringifikasi berikut:
+  `"type": "complete"`: `<string>` Parameter konstan.
+  `"id": <string>`: ID langganan yang tidak terdaftar.

Setelah klien menerima pesan konfirmasi, ia tidak menerima pesan lagi untuk langganan khusus ini.

Contoh:

```
{
  "type":"complete",
  "id":"eEXAMPLE-cf23-1234-5678-152EXAMPLE69"
}
```

## Memutuskan sambungan WebSocket
<a name="disconnecting-the-websocket"></a>

Sebelum memutuskan sambungan, untuk menghindari kehilangan data, klien harus memiliki logika yang diperlukan untuk memeriksa bahwa tidak ada operasi saat ini di tempat melalui WebSocket koneksi. Semua langganan harus tidak terdaftar sebelum memutuskan sambungan dari. WebSocket

# Menggabungkan APIs AWS AppSync
<a name="merged-api"></a>

Karena penggunaan GraphQL meluas dalam suatu organisasi, trade-off antara ease-of-use kecepatan pengembangan API dan API dapat muncul. Di satu sisi, organisasi mengadopsi AWS AppSync dan GraphQL untuk menyederhanakan pengembangan aplikasi. Ini memberi pengembang API fleksibel yang dapat mereka gunakan untuk mengakses, memanipulasi, dan menggabungkan data dengan aman dari satu atau lebih domain data dengan satu panggilan jaringan. Di sisi lain, tim dalam organisasi yang bertanggung jawab atas domain data berbeda yang digabungkan menjadi satu titik akhir API GraphQL mungkin menginginkan kemampuan untuk membuat, mengelola, dan menerapkan pembaruan API secara independen satu sama lain. Ini meningkatkan kecepatan perkembangan mereka. 

Untuk mengatasi ketegangan ini, APIs fitur AWS AppSync Gabungan memungkinkan tim dari domain data yang berbeda untuk membuat dan menerapkan secara independen AWS AppSync APIs (misalnya, skema GraphQL, resolver, sumber data, dan fungsi), yang kemudian dapat digabungkan menjadi satu API gabungan. Ini memberi organisasi kemampuan untuk mempertahankan API lintas domain yang mudah digunakan, dan cara bagi tim yang berbeda yang berkontribusi pada API tersebut kemampuan untuk secara cepat dan mandiri membuat pembaruan API.

Diagram berikut menunjukkan alur kerja API gabungan:

![\[Diagram yang menunjukkan alur kerja API gabungan dengan beberapa sumber digabungkan APIs menjadi satu titik akhir API gabungan\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/merged-api-workflow.png)


Menggunakan Merged APIs, organisasi dapat mengimpor sumber daya dari beberapa sumber independen AWS AppSync APIs ke dalam satu titik akhir API AWS AppSync Gabungan. Untuk melakukan ini, AWS AppSync Anda dapat membuat daftar sumber AWS AppSync APIs, lalu menggabungkan semua metadata yang terkait dengan sumber APIs termasuk skema, tipe, sumber data, resolver, dan fungsi, ke dalam API gabungan baru. AWS AppSync 

Selama penggabungan, ada kemungkinan konflik penggabungan akan terjadi karena ketidakkonsistenan dalam konten data API sumber seperti konflik penamaan tipe saat menggabungkan beberapa skema. Untuk kasus penggunaan sederhana di mana tidak ada definisi dalam APIs konflik sumber, tidak perlu memodifikasi skema API sumber. API Gabungan yang dihasilkan hanya mengimpor semua jenis, resolver, sumber data, dan fungsi dari sumber aslinya. AWS AppSync APIs Untuk kasus penggunaan yang kompleks di mana konflik muncul, users/teams harus menyelesaikan konflik melalui berbagai cara. AWS AppSync memberi pengguna beberapa alat dan contoh yang dapat mengurangi konflik penggabungan. 

Penggabungan berikutnya yang dikonfigurasi AWS AppSync akan menyebarkan perubahan yang dibuat di sumber APIs ke API Gabungan terkait.

## Gabungan APIs dan Federasi
<a name="merged-api-federation"></a>

Ada banyak solusi dan pola dalam komunitas GraphQL untuk menggabungkan skema GraphQL dan memungkinkan kolaborasi tim melalui grafik bersama. AWS AppSync Gabungan APIs mengadopsi pendekatan *waktu pembuatan* untuk komposisi skema, di mana sumber APIs digabungkan menjadi API Gabungan yang terpisah. Pendekatan alternatif adalah melapisi router *run time* di beberapa sumber APIs atau sub-grafik. Dalam pendekatan ini, router menerima permintaan, mereferensikan skema gabungan yang dipertahankannya sebagai metadata, membangun rencana permintaan, dan kemudian mendistribusikan elemen permintaan di seluruh sub-grafik/server yang mendasarinya. Tabel berikut membandingkan pendekatan build-time AWS AppSync Merged API dengan pendekatan run-time berbasis router untuk komposisi skema GraphQL:


|  |  |  | 
| --- |--- |--- |
| Fitur | AppSync API yang digabung | Solusi berbasis router | 
| Sub-grafik dikelola secara independen | Ya | Ya | 
| Sub-grafik dapat dialamatkan secara independen | Ya | Ya | 
| Komposisi skema otomatis | Ya | Ya | 
| Deteksi konflik otomatis | Ya | Ya | 
| Resolusi konflik melalui arahan skema | Ya | Ya | 
| Server sub-grafik yang didukung | AWS AppSync\$1 | Bervariasi | 
| Kompleksitas jaringan | API tunggal yang digabungkan berarti tidak ada lompatan jaringan tambahan. | Arsitektur multi-layer memerlukan perencanaan dan delegasi kueri, parsing sub-kueri dan serialisasi/deserialisasi, dan resolver referensi dalam sub-grafik untuk melakukan penggabungan. | 
| Dukungan observabilitas | Pemantauan, pencatatan, dan penelusuran bawaan. Server API Gabungan tunggal berarti debugging yang disederhanakan. | Build-your-own observabilitas di seluruh router dan semua server sub-grafik terkait. Debugging kompleks di seluruh sistem terdistribusi. | 
| Dukungan otorisasi | Dibangun dalam dukungan untuk beberapa mode otorisasi. | Build-your-own aturan otorisasi. | 
| Keamanan lintas akun | Dukungan bawaan untuk asosiasi akun lintas AWS cloud. | Build-your-own model keamanan. | 
| Dukungan langganan | Ya | Tidak | 

\$1 AWS AppSync Gabungan hanya APIs dapat dikaitkan dengan AWS AppSync sumber APIs. Jika Anda memerlukan dukungan untuk komposisi skema di seluruh AWS AppSync dan AWS AppSync non-sub-grafik, Anda dapat menghubungkan satu atau lebih GraphQL Merged ke dalam solusi berbasis AWS AppSync router and/or . APIs [Misalnya, lihat blog referensi untuk menambahkan AWS AppSync APIs sebagai sub-grafik menggunakan arsitektur berbasis router dengan Apollo Federation v2: Apollo GraphQL Federation with. AWS AppSync](https://aws.amazon.com/blogs/mobile/federation-appsync-subgraph/) 

**Topics**
+ [Gabungan APIs dan Federasi](#merged-api-federation)
+ [Resolusi konflik API yang digabungkan](#merged-api-conflict-resolution)
+ [Mengkonfigurasi skema](#configuring-schemas-merged-api)
+ [Mengkonfigurasi mode otorisasi](#configuring-authorization-merged-api)
+ [Mengkonfigurasi peran eksekusi](#execution-roles-merged-api)
+ [Mengkonfigurasi Cross-Account Merged menggunakan APIs AWS RAM](#cross-account-merged-api)
+ [Penggabungan](#merges)
+ [Dukungan tambahan untuk Gabungan APIs](#merge-api-additional-support)
+ [Batasan API yang digabungkan](#merged-api-limits)
+ [Pertimbangan API yang digabungkan](#merged-api-considerations)
+ [Membuat Gabungan APIs](#creating-merged-api)

## Resolusi konflik API yang digabungkan
<a name="merged-api-conflict-resolution"></a>

Jika terjadi konflik penggabungan, AWS AppSync berikan beberapa alat dan contoh kepada pengguna untuk membantu memecahkan masalah.

### Arahan skema API yang digabungkan
<a name="merged-api-schema-directive"></a>

 AWS AppSync telah memperkenalkan beberapa arahan GraphQL yang dapat digunakan untuk- mengurangi atau menyelesaikan konflik di seluruh sumber: APIs
+ *@canonical*: Arahan ini menetapkan prioritas tipe/bidang dengan nama dan data yang serupa. Jika dua atau lebih sumber APIs memiliki tipe atau bidang GraphQL yang sama, salah satu sumber dapat membuat anotasi jenis atau bidangnya *sebagai* kanonik, yang akan diprioritaskan selama penggabungan. APIs Konflik types/fields yang tidak dianotasi dengan arahan ini di sumber lain diabaikan saat APIs digabungkan. 
+ *@hidden*: Arahan ini merangkum pasti types/fields untuk menghapusnya dari proses penggabungan. Tim mungkin ingin menghapus atau menyembunyikan jenis atau operasi tertentu di API sumber sehingga hanya klien internal yang dapat mengakses data tertentu yang diketik. Dengan direktif ini dilampirkan, tipe atau bidang tidak digabungkan ke dalam API Gabungan. 
+ *@renamed*: Arahan ini mengubah nama types/fields untuk mengurangi konflik penamaan. Ada situasi di mana berbeda APIs memiliki jenis atau nama bidang yang sama. Namun, semuanya harus tersedia dalam skema gabungan. Cara sederhana untuk memasukkan semuanya ke dalam API Gabungan adalah dengan mengganti nama bidang menjadi sesuatu yang serupa tetapi berbeda. 

Untuk menunjukkan arahan skema utilitas yang disediakan, pertimbangkan contoh berikut:

Dalam contoh ini, mari kita asumsikan bahwa kita ingin menggabungkan dua sumber APIs. Kami diberi dua skema yang membuat dan mengambil posting (misalnya, bagian komentar atau posting media sosial). Dengan asumsi bahwa tipe dan bidangnya sangat mirip, ada kemungkinan besar konflik selama operasi penggabungan. Cuplikan di bawah ini menunjukkan jenis dan bidang setiap skema.

File pertama, yang disebut *Source1.graphQL,* adalah skema GraphQL yang memungkinkan pengguna untuk membuat menggunakan mutasi. `Posts` `putPost` Masing-masing `Post` berisi judul dan ID. ID digunakan untuk referensi`User`, atau informasi poster (email dan alamat), dan`Message`, atau muatan (konten). `User`Jenis ini dianotasi dengan tag *@canonical*.

```
# This snippet represents a file called Source1.graphql

type Mutation {
    putPost(id: ID!, title: String!): Post
}

type Post {
    id: ID!
    title: String!
}

type Message {
   id: ID!
   content: String
}

type User @canonical {
   id: ID!
   email: String!
   address: String!
}

type Query {
    singlePost(id: ID!): Post
    getMessage(id: ID!): Message
}
```

*File kedua, yang disebut *Source2.graphQL, adalah skema GraphQL* yang melakukan hal yang sangat mirip dengan Source1.graphQL.* Namun, perhatikan bahwa bidang masing-masing jenis berbeda. Saat menggabungkan kedua skema ini, akan ada konflik penggabungan karena perbedaan ini. 

Perhatikan juga bagaimana *Source2.graphQL* juga berisi beberapa arahan untuk mengurangi konflik ini. `Post`Tipe ini dianotasi dengan tag *@hidden* untuk mengaburkan dirinya sendiri selama operasi penggabungan. `Message`Tipe dianotasi dengan tag *@renamed* untuk memodifikasi nama tipe jika terjadi konflik penamaan dengan tipe lain`Message`. `ChatMessage`

```
# This snippet represents a file called Source2.graphql

type Post @hidden  {
    id: ID!
    title: String!
    internalSecret: String!
}

type Message @renamed(to: "ChatMessage") {
   id: ID!
   chatId: ID!
   from: User!
   to: User!
}

# Stub user so that we can link the canonical definition from Source1
type User {
   id: ID!
}

type Query {
    getPost(id: ID!): Post
    getMessage(id: ID!): Message @renamed(to: "getChatMessage")
}
```

Ketika penggabungan terjadi, hasilnya akan menghasilkan `MergedSchema.graphql` file:

```
# This snippet represents a file called MergedSchema.graphql

type Mutation {
    putPost(id: ID!, title: String!): Post
}

# Post from Source2 was hidden so only uses the Source1 definition. 
type Post {
    id: ID!
    title: String!
}

# Renamed from Message to resolve the conflict
type ChatMessage {
   id: ID!
   chatId: ID!
   from: User!
   to: User!
}

type Message {
   id: ID!
   content: String
}

# Canonical definition from Source1
type User {
   id: ID!
   email: String!
   address: String!
}

type Query {
    singlePost(id: ID!): Post
    getMessage(id: ID!): Message
    
    # Renamed from getMessage
    getChatMessage(id: ID!): ChatMessage
}
```

Beberapa hal terjadi dalam penggabungan:
+ `User`**Jenis dari *source1.graphQL diprioritaskan daripada `User` from Source2.graphQL* karena anotasi @canonical.**
+ `Message`Jenis dari *source1.graphQL* disertakan dalam penggabungan. Namun, `Message` from *Source2.graphQL* memiliki konflik penamaan. Karena anotasi *@renamed*, itu juga termasuk dalam penggabungan tetapi dengan nama alternatif. `ChatMessage`
+ `Post`*Jenis dari *source1.graphQL* disertakan, tetapi `Post` tipe dari Source2.graphQL tidak.* Biasanya, akan ada konflik pada tipe ini, tetapi karena `Post` tipe dari *Source2.graphQL* memiliki anotasi *@hidden*, datanya dikaburkan dan tidak termasuk dalam penggabungan. Hal ini mengakibatkan tidak ada konflik.
+ `Query`Jenis diperbarui untuk menyertakan konten dari kedua file. Namun, satu `GetMessage` kueri diganti namanya `GetChatMessage` karena arahan. Ini menyelesaikan konflik penamaan antara dua kueri dengan nama yang sama.

Ada juga kasus tidak ada arahan yang ditambahkan ke tipe yang bertentangan. Di sini, tipe gabungan akan mencakup penyatuan semua bidang dari semua definisi sumber dari jenis itu. Misalnya, perhatikan contoh berikut:

Skema ini, yang disebut *Source1.graphQL*, memungkinkan untuk membuat dan mengambil. `Posts` Konfigurasinya mirip dengan contoh sebelumnya, tetapi dengan informasi yang lebih sedikit.

```
# This snippet represents a file called Source1.graphql

type Mutation {
    putPost(id: ID!, title: String!): Post
}

type Post  {
    id: ID!
    title: String!
}

type Query {
    getPost(id: ID!): Post
}
```

Skema ini, yang disebut *Source2.graphQL*, memungkinkan untuk membuat dan mengambil `Reviews` (misalnya, rating film atau ulasan restoran). `Reviews`dikaitkan dengan `Post` nilai ID yang sama. Bersama-sama, mereka berisi judul, ID posting, dan pesan payload dari posting ulasan lengkap.

Saat bergabung, akan ada konflik antara kedua `Post` jenis tersebut. Karena tidak ada anotasi untuk mengatasi masalah ini, perilaku default adalah melakukan operasi gabungan pada tipe yang bertentangan.

```
# This snippet represents a file called Source2.graphql

type Mutation {
    putReview(id: ID!, postId: ID!, comment: String!): Review
}

type Post  {
    id: ID!
    reviews: [Review]
}

type Review {
   id: ID!
   postId: ID!
   comment: String!
}

type Query {
    getReview(id: ID!): Review
}
```

Ketika penggabungan terjadi, hasilnya akan menghasilkan `MergedSchema.graphql` file:

```
# This snippet represents a file called MergedSchema.graphql

type Mutation {
    putReview(id: ID!, postId: ID!, comment: String!): Review
    putPost(id: ID!, title: String!): Post
}

type Post  {
    id: ID!
    title: String!
    reviews: [Review]
}

type Review {
   id: ID!
   postId: ID!
   comment: String!
}

type Query {
    getPost(id: ID!): Post
    getReview(id: ID!): Review
}
```

Beberapa hal terjadi dalam penggabungan:
+ `Mutation`Tipe tidak menghadapi konflik dan digabung.
+ Bidang `Post` tipe digabungkan melalui operasi serikat pekerja. Perhatikan bagaimana penyatuan antara keduanya menghasilkan satu`id`, satu`title`, dan satu`reviews`.
+ `Review`Tipe tidak menghadapi konflik dan digabung.
+ `Query`Tipe tidak menghadapi konflik dan digabung.

### Mengelola resolver pada tipe bersama
<a name="resolvers-shared-types-merged-api"></a>

Dalam contoh di atas, pertimbangkan kasus di mana *Source1.graphQL* telah mengkonfigurasi resolver unit, `Query.getPost` yang menggunakan sumber data DynamoDB bernama. `PostDatasource` Resolver ini akan mengembalikan `id` dan dari `title` tipe. `Post` Sekarang, pertimbangkan *Source2.graphQL* telah mengonfigurasi resolver pipeline, yang menjalankan dua fungsi. `Post.reviews` `Function1`memiliki sumber `None` data yang dilampirkan untuk melakukan pemeriksaan otorisasi khusus. `Function2`memiliki sumber data DynamoDB yang dilampirkan untuk menanyakan tabel. `reviews`

```
query GetPostQuery {
    getPost(id: "1") {
        id,
        title,
        reviews
    }
}
```

Ketika kueri di atas dijalankan oleh klien ke titik akhir Merged API, AWS AppSync layanan pertama-tama menjalankan unit resolver for `Query.getPost` from`Source1`, yang memanggil `PostDatasource` dan mengembalikan data dari DynamoDB. Kemudian, ia menjalankan resolver `Post.reviews` pipeline di mana `Function1` melakukan logika otorisasi khusus dan `Function2` mengembalikan ulasan yang diberikan yang ditemukan di`id`. `$context.source` Layanan memproses permintaan sebagai satu GraphQL run, dan permintaan sederhana ini hanya akan memerlukan satu token permintaan.

### Mengelola konflik resolver pada tipe bersama
<a name="resolver-conflict-shared-type-merged-api"></a>

Pertimbangkan kasus berikut di mana kami juga menerapkan resolver untuk menyediakan beberapa bidang sekaligus di luar penyelesai bidang di. `Query.getPost` `Source2` *source1.graphQL* mungkin terlihat seperti ini:

```
# This snippet represents a file called Source1.graphql

type Post  {
    id: ID!
    title: String!
    date: AWSDateTime!
}

type Query {
    getPost(id: ID!): Post
}
```

*Source2.graphQL* mungkin terlihat seperti ini:

```
# This snippet represents a file called Source2.graphql

type Post  {
  id: ID!
  content: String!
  contentHash: String! 
  author: String! 
}

type Query {
    getPost(id: ID!): Post
}
```

Mencoba menggabungkan kedua skema ini akan menghasilkan kesalahan AWS AppSync penggabungan karena Gabungan APIs tidak mengizinkan beberapa resolver sumber dilampirkan ke bidang yang sama. Untuk mengatasi konflik ini, Anda dapat menerapkan pola penyelesai bidang yang memerlukan *Source2.graphQL* untuk menambahkan tipe terpisah yang akan menentukan bidang yang dimilikinya dari tipe tersebut. `Post` Dalam contoh berikut, kami menambahkan tipe yang disebut`PostInfo`, yang berisi bidang konten dan penulis yang akan diselesaikan oleh *Source2.graphQL*. *Source1.graphQL* akan mengimplementasikan resolver yang dilampirkan`Query.getPost`, sementara *Source2.graphQL* sekarang akan melampirkan resolver untuk memastikan bahwa semua data dapat berhasil diambil: `Post.postInfo`

```
type Post  {
  id: ID!
  postInfo: PostInfo
}

type PostInfo {
   content: String!
   contentHash: String!
   author: String!
}

type Query {
    getPost(id: ID!): Post
}
```

Sementara menyelesaikan konflik semacam itu membutuhkan skema API sumber untuk ditulis ulang dan, berpotensi, klien untuk mengubah kueri mereka, keuntungan dari pendekatan ini adalah bahwa kepemilikan resolver gabungan tetap jelas di seluruh tim sumber.

## Mengkonfigurasi skema
<a name="configuring-schemas-merged-api"></a>

Dua pihak bertanggung jawab untuk mengonfigurasi skema untuk membuat API Gabungan:
+ **Pemilik API yang digabungkan - Pemilik API** yang digabungkan harus mengonfigurasi logika otorisasi Gabungan API dan pengaturan lanjutan seperti pencatatan, penelusuran, caching, dan dukungan WAF.
+ **Pemilik API sumber terkait - Pemilik** API terkait harus mengonfigurasi skema, resolver, dan sumber data yang membentuk API Gabungan.

**Karena skema Gabungan API Anda dibuat dari skema sumber terkait Anda APIs, skema tersebut hanya dibaca.** Ini berarti perubahan skema harus dimulai di sumber Anda. APIs **Di AWS AppSync konsol, Anda dapat beralih antara skema Gabungan dan skema individual sumber yang APIs disertakan dalam API Gabungan menggunakan daftar drop-down di atas jendela Skema.**

## Mengkonfigurasi mode otorisasi
<a name="configuring-authorization-merged-api"></a>

Beberapa mode otorisasi tersedia untuk melindungi API Gabungan Anda. Untuk mempelajari lebih lanjut tentang mode otorisasi AWS AppSync, lihat [Otorisasi dan](https://docs.aws.amazon.com/appsync/latest/devguide/security-authz.html) otentikasi.

Mode otorisasi berikut tersedia untuk digunakan dengan APIs Gabungan:
+  **Kunci API**: Strategi otorisasi paling sederhana. Semua permintaan harus menyertakan kunci API di bawah header `x-api-key` permintaan. Kunci API yang kedaluwarsa disimpan selama 60 hari setelah tanggal kedaluwarsa. 
+  **AWS Identity and Access Management (IAM)****: Strategi otorisasi AWS IAM mengotorisasi semua permintaan yang ditandatangani sigv4.** 
+  Kumpulan **Pengguna Amazon Cognito: Otorisasi pengguna Anda melalui Kumpulan** Pengguna Amazon Cognito untuk mencapai kontrol yang lebih halus. 
+  **AWS Lambda Authorizers**: Fungsi tanpa server yang memungkinkan Anda untuk mengautentikasi dan mengotorisasi akses ke API Anda menggunakan logika kustom. AWS AppSync 
+ **OpenID Connect: Jenis** otorisasi ini memberlakukan token OpenID connect (OIDC) yang disediakan oleh layanan yang sesuai dengan OIDC. Aplikasi Anda dapat memanfaatkan pengguna dan hak istimewa yang ditentukan oleh penyedia OIDC Anda untuk mengontrol akses.

Mode otorisasi API Gabungan dikonfigurasi oleh pemilik API Gabungan. Pada saat operasi gabungan, API Gabungan harus menyertakan mode otorisasi utama yang dikonfigurasi pada API sumber baik sebagai mode otorisasi utamanya sendiri atau sebagai mode otorisasi sekunder. Jika tidak, itu akan tidak kompatibel, dan operasi penggabungan akan gagal dengan konflik. Saat menggunakan arahan multi-auth di sumber APIs, proses penggabungan dapat secara otomatis menggabungkan arahan ini ke titik akhir terpadu. Jika mode otorisasi utama dari API sumber tidak cocok dengan mode otorisasi utama API Gabungan, mode ini akan secara otomatis menambahkan arahan autentikasi ini untuk memastikan bahwa mode otorisasi untuk tipe di API sumber konsisten.

## Mengkonfigurasi peran eksekusi
<a name="execution-roles-merged-api"></a>

Saat membuat API Gabungan, Anda perlu menentukan peran layanan. Peran AWS layanan adalah peran AWS Identity and Access Management (IAM) and Access Management (IAM) yang digunakan oleh AWS layanan untuk melakukan tugas atas nama Anda.

Dalam konteks ini, API Gabungan Anda perlu menjalankan resolver yang mengakses data dari sumber data yang dikonfigurasi di sumber Anda. APIs Peran layanan yang diperlukan untuk ini adalah`mergedApiExecutionRole`, dan harus memiliki akses eksplisit untuk menjalankan permintaan pada sumber yang APIs disertakan dalam API gabungan Anda melalui izin `appsync:SourceGraphQL` IAM. Selama menjalankan permintaan GraphQL, AWS AppSync layanan akan mengambil peran layanan ini dan mengotorisasi peran untuk melakukan tindakan. `appsync:SourceGraphQL`

AWS AppSync mendukung mengizinkan atau menolak izin ini pada bidang tingkat atas tertentu dalam permintaan seperti cara kerja mode otorisasi IAM untuk IAM. APIs Untuk non-top-level bidang, AWS AppSync mengharuskan Anda untuk menentukan izin pada sumber API ARN itu sendiri. *Untuk membatasi akses ke non-top-level bidang tertentu di API Gabungan, sebaiknya terapkan logika kustom dalam Lambda Anda atau menyembunyikan bidang API sumber dari API Gabungan menggunakan direktif @hidden.* Jika Anda ingin mengizinkan peran menjalankan semua operasi data dalam API sumber, Anda dapat menambahkan kebijakan di bawah ini. Perhatikan bahwa entri sumber daya pertama memungkinkan akses ke semua bidang tingkat atas dan entri kedua mencakup resolver turunan yang mengotorisasi sumber daya API sumber itu sendiri: 

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
        "Effect": "Allow", 
        "Action": [ "appsync:SourceGraphQL"], 
        "Resource": [ 
            "arn:aws:appsync:us-west-2:123456789012:apis/YourSourceGraphQLApiId/*", 
            "arn:aws:appsync:us-west-2:123456789012:apis/YourSourceGraphQLApiId"] 
    }] 
}
```

------

Jika Anda ingin membatasi akses hanya ke bidang tingkat atas tertentu, Anda dapat menggunakan kebijakan seperti ini:

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
        "Effect": "Allow", 
        "Action": [ "appsync:SourceGraphQL"], 
        "Resource": [ 
            "arn:aws:appsync:us-west-2:123456789012:apis/YourSourceGraphQLApiId/types/Query/fields/<Field-1>",
            "arn:aws:appsync:us-west-2:123456789012:apis/YourSourceGraphQLApiId"] 
    }] 
}
```

------

Anda juga dapat menggunakan wizard pembuatan API AWS AppSync konsol untuk menghasilkan peran layanan agar API Gabungan dapat mengakses sumber daya yang dikonfigurasi di sumber APIs yang berada di akun yang sama dengan API gabungan Anda. Jika sumber Anda tidak APIs berada di akun yang sama dengan API gabungan Anda, Anda harus terlebih dahulu membagikan sumber daya menggunakan AWS Resource Access Manager (AWS RAM). 

## Mengkonfigurasi Cross-Account Merged menggunakan APIs AWS RAM
<a name="cross-account-merged-api"></a>

Saat membuat API Gabungan, Anda dapat secara opsional mengaitkan sumber APIs dari akun lain yang telah dibagikan melalui AWS Resource Access Manager ()AWS RAM. AWS RAM membantu Anda berbagi sumber daya dengan aman di seluruh AWS akun, dalam organisasi atau unit organisasi (OUs), dan dengan peran dan pengguna IAM.

AWS AppSync terintegrasi dengan AWS RAM untuk mendukung konfigurasi dan mengakses sumber APIs di beberapa akun dari satu API Gabungan. AWS RAM memungkinkan Anda membuat pembagian sumber daya, atau wadah sumber daya dan set izin yang akan dibagikan untuk masing-masing sumber daya. Anda dapat menambahkan AWS AppSync APIs ke pembagian sumber daya di AWS RAM. Dalam pembagian sumber daya, AWS AppSync berikan tiga set izin berbeda yang dapat dikaitkan dengan AWS AppSync API di RAM:

1. `AWSRAMPermissionAppSyncSourceApiOperationAccess`: Set izin default yang ditambahkan saat berbagi AWS AppSync API AWS RAM jika tidak ada izin lain yang ditentukan. Set izin ini digunakan untuk berbagi AWS AppSync API sumber dengan pemilik API Gabungan. Set izin ini mencakup izin untuk `appsync:AssociateMergedGraphqlApi` pada API sumber serta `appsync:SourceGraphQL` izin yang diperlukan untuk mengakses sumber daya API sumber saat runtime.

1. `AWSRAMPermissionAppSyncMergedApiOperationAccess`: Set izin ini harus dikonfigurasi saat berbagi API Gabungan dengan pemilik API sumber. Kumpulan izin ini akan memberi API sumber kemampuan untuk mengonfigurasi API Gabungan termasuk kemampuan untuk mengaitkan sumber apa pun yang APIs dimiliki oleh prinsipal target ke API Gabungan dan untuk membaca dan memperbarui asosiasi API sumber dari API Gabungan.

1. `AWSRAMPermissionAppSyncAllowSourceGraphQLAccess`: Set izin ini memungkinkan `appsync:SourceGraphQL` izin untuk digunakan dengan AWS AppSync API. Ini dimaksudkan untuk digunakan untuk berbagi API sumber dengan pemilik API Gabungan. Berbeda dengan izin default yang ditetapkan untuk akses operasi API sumber, set izin ini hanya menyertakan izin `appsync:SourceGraphQL` runtime. Jika pengguna memilih untuk membagikan akses operasi Gabungan API ke pemilik API sumber, mereka juga perlu membagikan izin ini dari API sumber kepada pemilik API Gabungan agar memiliki akses runtime melalui titik akhir API Gabungan.

AWS AppSync juga mendukung izin yang dikelola pelanggan. Jika salah satu izin AWS-managed yang disediakan tidak berfungsi, Anda dapat membuat izin yang dikelola pelanggan sendiri. Izin yang dikelola pelanggan adalah izin terkelola yang Anda buat dan pertahankan dengan menentukan secara tepat tindakan mana yang dapat dilakukan dalam kondisi mana dengan sumber daya yang digunakan bersama. AWS RAM AWS AppSync memungkinkan Anda memilih dari tindakan berikut saat membuat izin Anda sendiri:

1. `appsync:AssociateSourceGraphqlApi`

1. `appsync:AssociateMergedGraphqlApi`

1. `appsync:GetSourceApiAssociation`

1. `appsync:UpdateSourceApiAssociation`

1. `appsync:StartSchemaMerge`

1. `appsync:ListTypesByAssociation`

1. `appsync:SourceGraphQL`

Setelah Anda membagikan API sumber atau API Gabungan dengan benar AWS RAM dan, jika perlu, undangan berbagi sumber daya telah diterima, undangan tersebut akan terlihat di AWS AppSync konsol saat Anda membuat atau memperbarui asosiasi API sumber pada API Gabungan Anda. Anda juga dapat mencantumkan semua AWS AppSync APIs yang telah AWS RAM dibagikan menggunakan akun Anda terlepas dari izin yang ditetapkan dengan memanggil `ListGraphqlApis` operasi yang disediakan oleh AWS AppSync dan menggunakan filter `OTHER_ACCOUNTS` pemilik. 

**catatan**  
Berbagi melalui AWS RAM memerlukan pemanggil AWS RAM untuk memiliki izin untuk melakukan `appsync:PutResourcePolicy` tindakan pada API apa pun yang sedang dibagikan. 

## Penggabungan
<a name="merges"></a>

### Mengelola penggabungan
<a name="managing-merges"></a>

Gabungan APIs dimaksudkan untuk mendukung kolaborasi tim pada titik akhir terpadu AWS AppSync . Tim dapat secara mandiri mengembangkan APIs GraphQL sumber terisolasi mereka sendiri di backend sementara AWS AppSync layanan mengelola integrasi sumber daya ke dalam titik akhir API Gabungan tunggal untuk mengurangi gesekan dalam kolaborasi dan mengurangi waktu tunggu pengembangan.

### Penggabungan otomatis
<a name="auto-merge"></a>

Sumber APIs yang terkait dengan API AWS AppSync Gabungan Anda dapat dikonfigurasi untuk menggabungkan secara otomatis (penggabungan otomatis) ke dalam API Gabungan setelah perubahan apa pun dilakukan pada API sumber. Ini memastikan bahwa perubahan dari API sumber selalu disebarkan ke titik akhir API Gabungan di latar belakang. Setiap perubahan dalam skema API sumber akan diperbarui di API Gabungan selama tidak menimbulkan konflik gabungan dengan definisi yang ada di API Gabungan. Jika pembaruan di API sumber memperbarui resolver, sumber data, atau fungsi, sumber daya yang diimpor juga akan diperbarui.Ketika konflik baru diperkenalkan yang tidak dapat diselesaikan secara otomatis (diselesaikan secara otomatis), pembaruan skema API Gabungan ditolak karena konflik yang tidak didukung selama operasi penggabungan. Pesan kesalahan tersedia di konsol untuk setiap asosiasi API sumber yang memiliki status`MERGE_FAILED`. Anda juga dapat memeriksa pesan kesalahan dengan memanggil `GetSourceApiAssociation` operasi untuk asosiasi API sumber tertentu menggunakan AWS SDK atau menggunakan AWS CLI seperti:

```
aws appsync get-source-api-association --merged-api-identifier <Merged API ARN> --association-id <SourceApiAssociation id>
```

Ini akan menghasilkan hasil dalam format berikut:

```
{
    "sourceApiAssociation": {
        "associationId": "<association id>",
        "associationArn": "<association arn>",
        "sourceApiId": "<source api id>",
        "sourceApiArn": "<source api arn>",
        "mergedApiArn": "<merged api arn>",
        "mergedApiId": "<merged api id>",
        "sourceApiAssociationConfig": {
            "mergeType": "MANUAL_MERGE"
        },
        "sourceApiAssociationStatus": "MERGE_FAILED",
        "sourceApiAssociationStatusDetail": "Unable to resolve conflict on object with name title: Merging is not supported for fields with different types."
    }
}
```

### Penggabungan manual
<a name="manual-merges"></a>

Pengaturan default untuk API sumber adalah penggabungan manual. Untuk menggabungkan perubahan apa pun yang terjadi di sumber APIs sejak API Gabungan terakhir diperbarui, pemilik API sumber dapat memanggil penggabungan manual dari AWS AppSync konsol atau melalui `StartSchemaMerge` operasi yang tersedia di SDK AWS dan CLI. AWS 

## Dukungan tambahan untuk Gabungan APIs
<a name="merge-api-additional-support"></a>

### Mengkonfigurasi langganan
<a name="config-subscription"></a>

Tidak seperti pendekatan berbasis router untuk komposisi skema GraphQL, Merged AWS AppSync menyediakan dukungan bawaan untuk langganan GraphQL. APIs Semua operasi langganan yang ditentukan dalam sumber terkait Anda APIs akan secara otomatis bergabung dan berfungsi di API Gabungan Anda tanpa modifikasi. [Untuk mempelajari selengkapnya tentang cara AWS AppSync mendukung langganan melalui WebSockets koneksi tanpa server, lihat Data waktu nyata.](https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-real-time-data.html)

### Mengkonfigurasi observabilitas
<a name="config-observability"></a>

AWS AppSync [Gabungan APIs menyediakan pencatatan, pemantauan, dan metrik bawaan melalui Amazon. CloudWatch](https://docs.aws.amazon.com/appsync/latest/devguide/monitoring.html) AWS AppSync juga menyediakan dukungan bawaan untuk melacak via [AWS X-Ray](https://docs.aws.amazon.com/appsync/latest/devguide/x-ray-tracing.html). 

### Mengkonfigurasi domain kustom
<a name="config-custom-domain"></a>

AWS AppSync [Gabungan APIs menyediakan dukungan bawaan untuk menggunakan domain kustom dengan GraphQL dan titik akhir Real-time API Gabungan Anda.](https://docs.aws.amazon.com/appsync/latest/devguide/custom-domain-name.html) 

### Mengkonfigurasi caching
<a name="config-caching"></a>

AWS AppSync Digabungkan APIs memberikan dukungan bawaan untuk caching respons tingkat permintaan dan/atau tingkat resolver secara opsional serta kompresi respons. Untuk mempelajari lebih lanjut, lihat [Caching dan kompresi](https://docs.aws.amazon.com/appsync/latest/devguide/enabling-caching.html). 

### Mengkonfigurasi pribadi APIs
<a name="config-private-api"></a>

AWS AppSync [Gabungan APIs menyediakan dukungan bawaan untuk Private APIs yang membatasi akses ke GraphQL API Gabungan Anda dan titik akhir Real-time untuk lalu lintas yang berasal dari titik akhir VPC yang dapat Anda konfigurasi.](https://docs.aws.amazon.com/appsync/latest/devguide/using-private-apis.html) 

### Mengkonfigurasi aturan firewall
<a name="config-firewall"></a>

AWS AppSync Gabungan APIs menyediakan dukungan bawaan untuk AWS WAF, yang memungkinkan Anda untuk melindungi Anda APIs dengan mendefinisikan aturan [firewall aplikasi web](https://docs.aws.amazon.com/appsync/latest/devguide/WAF-Integration.html). 

### Mengkonfigurasi log audit
<a name="config-audit"></a>

AWS AppSync Gabungan APIs menyediakan dukungan bawaan untuk AWS CloudTrail, yang memungkinkan Anda [mengonfigurasi dan mengelola log audit](https://docs.aws.amazon.com/appsync/latest/devguide/cloudtrail-logging.html). 

## Batasan API yang digabungkan
<a name="merged-api-limits"></a>

Saat mengembangkan APIs Gabungan, perhatikan aturan berikut:

1. API Gabungan tidak dapat menjadi API sumber untuk API Gabungan lainnya.

1. API sumber tidak dapat dikaitkan dengan lebih dari satu API Gabungan.

1. Batas ukuran default untuk dokumen skema API Gabungan adalah 10 MB.

1. Jumlah default sumber APIs yang dapat dikaitkan dengan API Gabungan adalah 10. Namun, Anda dapat meminta peningkatan batas jika Anda membutuhkan lebih dari 10 sumber APIs di API Gabungan.

## Pertimbangan API yang digabungkan
<a name="merged-api-considerations"></a>

Saat merancang dan mengimplementasikan Merged APIs, pertimbangkan hal berikut:

Menggabungkan beberapa sumber APIs menjadi satu titik akhir dapat meningkatkan ukuran dan kompleksitas skema dan kueri GraphQL Anda. Saat skema gabungan Anda bertambah, kueri mungkin perlu melintasi beberapa resolver untuk memenuhi satu permintaan, yang dapat menambahkan latensi ke keseluruhan waktu permintaan Anda. Misalnya, kueri yang mengakses bidang dari beberapa sumber APIs mungkin AWS AppSync perlu mengeksekusi resolver dari setiap API sumber secara berurutan, dengan setiap resolver menambah total waktu respons.

Kami sangat menyarankan agar Anda menguji Gabungan Anda secara APIs menyeluruh selama pengembangan dan dalam kondisi beban yang realistis untuk memastikan mereka memenuhi persyaratan bisnis Anda. Berikan perhatian khusus pada:
+ Kedalaman dan kompleksitas skema gabungan Anda, terutama kueri yang mengakses bidang di beberapa sumber. APIs
+ Jumlah resolver yang harus mengeksekusi untuk memenuhi pola query umum.
+ Karakteristik kinerja sumber data dan resolver Anda di bawah beban yang diharapkan.
+ Dampak latensi jaringan saat mengakses sumber daya di berbagai sumber. APIs

Pertimbangkan untuk menerapkan pengoptimalan kinerja seperti caching, pengelompokan permintaan sumber data, dan merancang skema API sumber Anda untuk meminimalkan jumlah eksekusi resolver yang diperlukan untuk operasi umum.

## Membuat Gabungan APIs
<a name="creating-merged-api"></a>

**Untuk membuat API Gabungan di konsol**

1. Masuk ke Konsol Manajemen AWS dan buka [AWS AppSync konsol](https://console.aws.amazon.com/appsync/).

   1. Di **Dasbor**, pilih **Buat API**.

1. Pilih **API Gabungan**, lalu pilih **Berikutnya**.

1. Di halaman **Tentukan detail API**, masukkan informasi berikut: 

   1. Di bawah **Detail API**, masukkan informasi berikut:

      1. Tentukan **nama API** gabungan Anda. Bidang ini adalah cara untuk memberi label GraphQL API Anda untuk membedakannya dengan mudah dari GraphQL lainnya. APIs 

      1. Tentukan **detail Kontak**. Bidang ini bersifat opsional dan melampirkan nama atau grup ke GraphQL API. Ini tidak ditautkan ke atau dihasilkan oleh sumber daya lain dan berfungsi seperti bidang nama API. 

   1. Di bawah **peran Layanan**, Anda harus melampirkan peran eksekusi IAM ke API gabungan Anda sehingga AWS AppSync dapat mengimpor dan menggunakan sumber daya Anda dengan aman saat runtime. Anda dapat memilih untuk **membuat dan menggunakan peran layanan baru**, yang akan memungkinkan Anda untuk menentukan kebijakan dan sumber daya yang AWS AppSync akan digunakan. Anda juga dapat mengimpor peran IAM yang ada dengan memilih **Gunakan peran layanan yang ada**, lalu memilih peran dari daftar drop-down. 

   1. Di bawah **konfigurasi API Pribadi**, Anda dapat memilih untuk mengaktifkan fitur API pribadi. Perhatikan bahwa pilihan ini tidak dapat diubah setelah membuat API gabungan. Untuk informasi selengkapnya tentang pribadi APIs, lihat [Menggunakan AWS AppSync Pribadi APIs](https://docs.aws.amazon.com/appsync/latest/devguide/using-private-apis.html). 

      Pilih **Berikutnya** setelah Anda selesai. 

1. Selanjutnya, Anda harus menambahkan APIs GraphQL yang akan digunakan sebagai dasar untuk API gabungan Anda. Di APIs halaman **Pilih sumber**, masukkan informasi berikut: 

   1. Di tabel **APIs from your AWS account**, pilih **Add Source APIs**. Dalam daftar APIs GraphQL, setiap entri akan berisi data berikut:

      1. **Nama**: Bidang nama API GraphQL API**.** 

      1. **API ID: Nilai ID** unik GraphQL API.

      1. **Mode autentikasi primer: Mode** otorisasi default untuk GraphQL API. Untuk informasi selengkapnya tentang mode otorisasi AWS AppSync, lihat [Otorisasi dan](https://docs.aws.amazon.com/appsync/latest/devguide/security-authz.html) otentikasi. 

      1. **Mode autentikasi tambahan: Mode** otorisasi sekunder yang dikonfigurasi di GraphQL API.

      1. Pilih APIs yang akan Anda gunakan di API gabungan dengan memilih kotak centang di sebelah bidang **Nama** API. Setelah itu, pilih **Add Source APIs**. APIs GraphQL yang dipilih akan muncul di tabel **from AWS your APIs accounts**.

   1. Di tabel **APIs from other AWS accounts**, pilih **Add Source APIs**. APIs GraphQL dalam daftar ini berasal dari akun lain yang membagikan sumber daya mereka ke akun Anda AWS Resource Access Manager melalui ().AWS RAM Proses untuk memilih APIs GraphQL dalam tabel ini sama dengan proses di bagian sebelumnya. Untuk informasi selengkapnya tentang berbagi sumber daya AWS RAM, lihat [Apa itu AWS Resource Access Manager?](https://docs.aws.amazon.com/ram/latest/userguide/what-is.html) .

      Pilih **Berikutnya** setelah Anda selesai.

   1. Tambahkan mode autentikasi utama Anda. Lihat [Otorisasi dan otentikasi untuk informasi](https://docs.aws.amazon.com/appsync/latest/devguide/security-authz.html) selengkapnya. Pilih **Berikutnya**.

   1. Tinjau input Anda, lalu pilih **Buat API**.

# Membangun APIs GraphQL dengan introspeksi RDS
<a name="rds-introspection"></a>

AWS AppSync utilitas introspeksi dapat menemukan model dari tabel database dan mengusulkan tipe GraphQL. Wizard Create API AWS AppSync konsol dapat langsung menghasilkan API dari database Aurora MySQL atau PostgreSQL. Secara otomatis membuat jenis dan JavaScript resolver untuk membaca dan menulis data.

AWS AppSync menyediakan integrasi langsung dengan database Amazon Aurora melalui Amazon RDS Data API. Alih-alih memerlukan koneksi database persisten, Amazon RDS Data API menawarkan titik akhir HTTP aman yang AWS AppSync terhubung ke untuk menjalankan SQL pernyataan. Anda dapat menggunakan ini untuk membuat API database relasional untuk beban kerja MySQL dan PostgreSQL Anda di Aurora.

Membangun API untuk database relasional Anda dengan AWS AppSync memiliki beberapa keuntungan:
+ Database Anda tidak langsung terpapar ke klien, memisahkan titik akses dari database itu sendiri. 
+ Anda dapat membangun purpose-built yang APIs disesuaikan dengan kebutuhan aplikasi yang berbeda, menghilangkan kebutuhan akan logika bisnis khusus di frontend. Ini sejalan dengan pola Backend-For-Frontend (BFF). 
+ Otorisasi dan kontrol akses dapat diimplementasikan pada AWS AppSync lapisan menggunakan berbagai mode otorisasi untuk mengontrol akses. Tidak ada sumber daya komputasi tambahan yang diperlukan untuk terhubung ke database, seperti hosting server web atau koneksi proxy. 
+ Kemampuan real-time dapat ditambahkan melalui langganan, dengan mutasi data yang dilakukan AppSync secara otomatis didorong ke klien yang terhubung. 
+ Klien dapat terhubung ke API melalui HTTPS menggunakan port umum seperti 443.

AWS AppSync membuat membangun APIs dari database relasional yang ada menjadi mudah. Utilitas introspeksi dapat menemukan model dari tabel database dan mengusulkan tipe GraphQL. Wizard *Create API AWS AppSync * konsol dapat langsung menghasilkan API dari database Aurora MySQL atau PostgreSQL. Secara otomatis membuat jenis dan JavaScript resolver untuk membaca dan menulis data. 

AWS AppSync menyediakan JavaScript utilitas terintegrasi untuk menyederhanakan penulisan pernyataan SQL dalam resolver. Anda dapat menggunakan AWS AppSync templat `sql` tag untuk pernyataan statis dengan nilai dinamis, atau utilitas `rds` modul untuk membangun pernyataan secara terprogram. Lihat [referensi fungsi resolver untuk sumber data RDS](https://docs.aws.amazon.com//appsync/latest/devguide/resolver-reference-rds-js.html) dan [modul bawaan](https://docs.aws.amazon.com//appsync/latest/devguide/built-in-modules-js.html#built-in-rds-modules) untuk informasi selengkapnya. 

## Menggunakan fitur introspeksi (konsol)
<a name="using-introspection-console"></a>

Untuk tutorial terperinci dan panduan memulai, lihat [Tutorial: Aurora PostgreSQL](https://docs.aws.amazon.com//appsync/latest/devguide/aurora-serverless-tutorial-js.html) Tanpa Server dengan API Data. 

 AWS AppSync Konsol memungkinkan Anda membuat AWS AppSync GraphQL API dari database Aurora yang ada yang dikonfigurasi dengan Data API hanya dalam beberapa menit. Ini dengan cepat menghasilkan skema operasional berdasarkan konfigurasi database Anda. Anda dapat menggunakan API apa adanya atau membangunnya untuk menambahkan fitur. 

1. Masuk ke Konsol Manajemen AWS dan buka [AppSynckonsol](https://console.aws.amazon.com/appsync/).

   1. Di **Dashboard**, pilih **Create API**.

1. **Di bawah **opsi API**, pilih ** APIsGraphQL****, Mulai dengan klaster Amazon Aurora, lalu** Berikutnya.**

   1. Masukkan **nama API**. Ini akan digunakan sebagai pengidentifikasi untuk API di konsol.

   1. Untuk **detail kontak**, Anda dapat memasukkan titik kontak untuk mengidentifikasi manajer API. Ini adalah bidang opsional.

   1. Di bawah **konfigurasi API Pribadi**, Anda dapat mengaktifkan fitur API pribadi. API pribadi hanya dapat diakses dari titik akhir VPC (VPCE) yang dikonfigurasi. Untuk informasi selengkapnya, lihat [Pribadi APIs](https://docs.aws.amazon.com//appsync/latest/devguide/using-private-apis.html).

      Kami tidak menyarankan mengaktifkan fitur ini untuk contoh ini. Pilih **Berikutnya** setelah meninjau input Anda.

1. Di halaman **Database**, pilih **Pilih database**.

   1. Anda harus memilih database Anda dari cluster Anda. Langkah pertama adalah memilih **Wilayah** di mana cluster Anda berada.

   1. Pilih **cluster Aurora** dari daftar drop-down. Perhatikan bahwa Anda harus telah membuat dan [mengaktifkan](https://docs.aws.amazon.com//AmazonRDS/latest/AuroraUserGuide/data-api.html#data-api.enabling) API data yang sesuai sebelum menggunakan sumber daya.

   1. Selanjutnya, Anda harus menambahkan kredensil untuk database Anda ke layanan. Ini terutama dilakukan dengan menggunakan AWS Secrets Manager. Pilih **Wilayah** di mana rahasia Anda ada. Untuk informasi selengkapnya tentang cara mengambil informasi rahasia, lihat [Menemukan rahasia](https://docs.aws.amazon.com//secretsmanager/latest/userguide/manage_search-secret.html) atau [Mengambil](https://docs.aws.amazon.com//secretsmanager/latest/userguide/retrieving-secrets.html) rahasia.

   1. Tambahkan rahasia Anda dari daftar drop-down. Perhatikan bahwa pengguna harus memiliki [izin membaca](https://docs.aws.amazon.com//AmazonRDS/latest/UserGuide/security_iam_id-based-policy-examples.html#security_iam_id-based-policy-examples-console) untuk database Anda.

1. Pilih **Impor**.

   AWS AppSync akan mulai introspeksi database Anda, menemukan tabel, kolom, kunci utama, dan indeks. Ini memeriksa apakah tabel yang ditemukan dapat didukung dalam GraphQL API. Perhatikan bahwa untuk mendukung pembuatan baris baru, tabel memerlukan kunci utama, yang dapat menggunakan beberapa kolom. AWS AppSync memetakan kolom tabel untuk mengetik bidang sebagai berikut:     
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/appsync/latest/devguide/rds-introspection.html)

1. Setelah penemuan tabel selesai, bagian **Database** akan diisi dengan informasi Anda. Di bagian **tabel Database** baru, data dari tabel mungkin sudah diisi dan dikonversi menjadi tipe untuk skema Anda. Jika Anda tidak melihat beberapa data yang diperlukan, Anda dapat memeriksanya dengan memilih **Tambahkan tabel**, mengklik kotak centang untuk jenis tersebut di modal yang muncul, lalu memilih **Tambah**. 

   Untuk menghapus tipe dari bagian **tabel Database**, klik kotak centang di sebelah jenis yang ingin Anda hapus, lalu pilih **Hapus**. Jenis yang dihapus akan ditempatkan di modal **Tambahkan tabel** jika Anda ingin menambahkannya lagi nanti.

   Perhatikan bahwa AWS AppSync menggunakan nama tabel sebagai nama tipe, tetapi Anda dapat mengganti nama mereka - misalnya, mengubah nama tabel jamak seperti *movies* nama tipe. *Movie* Untuk mengganti nama tipe di bagian **tabel Database**, klik kotak centang dari jenis yang ingin Anda ganti nama, lalu klik ikon *pensil di kolom* **Type** name.

   Untuk melihat pratinjau konten skema berdasarkan pilihan Anda, pilih skema **pratinjau**. Perhatikan bahwa skema ini tidak dapat kosong, jadi Anda harus memiliki setidaknya satu tabel yang dikonversi menjadi tipe. Juga, skema ini tidak boleh melebihi 1 MB dalam ukuran.

   1. Di bawah **Peran layanan**, pilih apakah akan membuat peran layanan baru khusus untuk impor ini atau menggunakan peran yang sudah ada.

1. Pilih **Berikutnya**.

1. Selanjutnya, pilih apakah akan membuat API hanya-baca (hanya kueri) atau API untuk membaca dan menulis data (dengan kueri dan mutasi). Yang terakhir ini juga mendukung langganan real-time yang dipicu oleh mutasi. 

1. Pilih **Berikutnya**.

1. Tinjau pilihan Anda dan kemudian pilih **Buat API**. AWS AppSync akan membuat API dan melampirkan resolver ke kueri dan mutasi. API yang dihasilkan beroperasi penuh dan dapat diperpanjang sesuai kebutuhan. 

## Menggunakan fitur introspeksi (API)
<a name="using-introspection-api"></a>

Anda dapat menggunakan API `StartDataSourceIntrospection` introspeksi untuk menemukan model dalam database Anda secara terprogram. Untuk detail selengkapnya tentang perintah, lihat menggunakan [https://docs.aws.amazon.com//appsync/latest/APIReference/API_StartDataSourceIntrospection.html](https://docs.aws.amazon.com//appsync/latest/APIReference/API_StartDataSourceIntrospection.html)API. 

Untuk menggunakan`StartDataSourceIntrospection`, berikan Aurora cluster Amazon Resource Name (ARN), nama database, dan ARN rahasia Anda. AWS Secrets Manager Perintah memulai proses introspeksi. Anda dapat mengambil hasilnya dengan `GetDataSourceIntrospection` perintah. Anda dapat menentukan apakah perintah harus mengembalikan string Storage Definition Language (SDL) untuk model yang ditemukan. Ini berguna untuk menghasilkan definisi skema SDL langsung dari model yang ditemukan.

 Misalnya, jika Anda memiliki pernyataan bahasa definisi Data (DDL) berikut untuk `Todos` tabel sederhana:

```
create table if not exists public.todos  
(  
id serial constraint todos_pk primary key,  
description text,  
due timestamp,  
"createdAt" timestamp default now()  
);
```

Anda memulai introspeksi dengan yang berikut ini.

```
aws appsync start-data-source-introspection \ 
  --rds-data-api-config resourceArn=<cluster-arn>,secretArn=<secret-arn>,databaseName=database
```

Selanjutnya, gunakan `GetDataSourceIntrospection` perintah untuk mengambil hasilnya.

```
aws appsync get-data-source-introspection \
  --introspection-id a1234567-8910-abcd-efgh-identifier \
  --include-models-sdl
```

Ini mengembalikan hasil sebagai berikut.

```
{
    "introspectionId": "a1234567-8910-abcd-efgh-identifier",
    "introspectionStatus": "SUCCESS",
    "introspectionStatusDetail": null,
    "introspectionResult": {
        "models": [
            {
                "name": "todos",
                "fields": [
                    {
                        "name": "description",
                        "type": {
                            "kind": "Scalar",
                            "name": "String",
                            "type": null,
                            "values": null
                        },
                        "length": 0
                    },
                    {
                        "name": "due",
                        "type": {
                            "kind": "Scalar",
                            "name": "AWSDateTime",
                            "type": null,
                            "values": null
                        },
                        "length": 0
                    },
                    {
                        "name": "id",
                        "type": {
                            "kind": "NonNull",
                            "name": null,
                            "type": {
                                "kind": "Scalar",
                                "name": "Int",
                                "type": null,
                                "values": null
                            },
                            "values": null
                        },
                        "length": 0
                    },
                    {
                        "name": "createdAt",
                        "type": {
                            "kind": "Scalar",
                            "name": "AWSDateTime",
                            "type": null,
                            "values": null
                        },
                        "length": 0
                    }
                ],
                "primaryKey": {
                    "name": "PRIMARY_KEY",
                    "fields": [
                        "id"
                    ]
                },
                "indexes": [],
                "sdl": "type todos\n{\ndescription: String\n\ndue: AWSDateTime\n\nid: Int!\n\ncreatedAt: AW
SDateTime\n}\n"
            }
        ],
        "nextToken": null
    }
}
```