

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

# Akses terprogram ke Amazon EC2
<a name="ec2-api-intro"></a>

Anda dapat membuat dan mengelola EC2 sumber daya Amazon Anda menggunakan Konsol Manajemen AWS atau antarmuka terprogram. Untuk informasi tentang menggunakan EC2 konsol Amazon, lihat [Panduan EC2 Pengguna Amazon](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/).

**Cara kerjanya**
+ [Titik EC2 akhir Amazon](ec2-endpoints.md)
+ [Konsistensi akhirnya](eventual-consistency.md)
+ [Idempotensi](ec2-api-idempotency.md)
+ [Minta pelambatan](ec2-api-throttling.md)
+ [Paginasi](ec2-api-pagination.md)

**Antarmuka terprogram**
+ [AWS Command Line Interface (AWS CLI)](ec2-aws-cli.md)
+ [AWS CloudFormation](ec2-cloudformation.md)
+ [AWS SDKs](sdk-general-information-section.md)
+ [API tingkat rendah](ec2-low-level-api.md)

**Memulai**
+ [Contoh kode](service_code_examples.md)
+ [Konsol-ke-Kode](console-to-code.md)

**Pemantauan**
+ [AWS CloudTrail](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitor-with-cloudtrail.html)
+ [Memantau permintaan](monitor.md)

# Titik akhir layanan Amazon EC2
<a name="ec2-endpoints"></a>

Endpoint adalah URL yang berfungsi sebagai titik masuk untuk layanan AWS web. Amazon EC2 mendukung jenis titik akhir berikut:
+ [IPv4 titik akhir](#ipv4)
+ [Titik akhir tumpukan ganda](#ipv6) (mendukung keduanya dan) IPv4 IPv6
+ [Titik akhir FIPS](https://docs.aws.amazon.com/general/latest/gr/rande.html#FIPS-endpoints)

Saat Anda membuat permintaan, Anda dapat menentukan titik akhir yang akan digunakan. Jika Anda tidak menentukan titik akhir, IPv4 titik akhir digunakan secara default. Untuk menggunakan tipe titik akhir yang berbeda, Anda harus menentukannya dalam permintaan Anda. Untuk contoh cara melakukannya, lihat [Menentukan titik akhir](#examples). Untuk tabel titik akhir yang tersedia, lihat[Titik akhir layanan menurut Wilayah](#service-endpoints).

## IPv4 titik akhir
<a name="ipv4"></a>

IPv4 endpoint hanya mendukung IPv4 lalu lintas. IPv4 titik akhir tersedia untuk semua Wilayah.

Jika Anda menentukan titik akhir umum, `ec2.amazonaws.com`, kami menggunakan titik akhir untuk `us-east-1`. Untuk menggunakan Wilayah yang berbeda, tentukan titik akhir yang terkait. Misalnya, jika Anda menentukan `ec2.us-east-2.amazonaws.com` sebagai titik akhir, kami mengarahkan permintaan Anda ke titik `us-east-2` akhir. 

IPv4 nama endpoint menggunakan konvensi penamaan berikut: 
+ `service.region.amazonaws.com`

Misalnya, nama IPv4 endpoint untuk `eu-west-1` Region adalah`ec2.eu-west-1.amazonaws.com`.

## Titik akhir tumpukan ganda (IPv4 dan IPv6)
<a name="ipv6"></a>

Titik akhir dual-stack mendukung keduanya IPv4 dan lalu lintas. IPv6 Saat Anda membuat permintaan ke titik akhir dual-stack, URL endpoint akan diselesaikan ke alamat IPv6 atau IPv4 alamat, tergantung pada protokol yang digunakan oleh jaringan dan klien Anda.

Amazon EC2 hanya mendukung titik akhir dual-stack regional, yang berarti Anda harus menentukan Wilayah sebagai bagian dari nama titik akhir. Nama titik akhir tumpukan ganda menggunakan konvensi penamaan berikut:
+ `ec2.region.api.aws`

Misalnya, nama titik akhir tumpukan ganda untuk Wilayah `eu-west-1` adalah `ec2.eu-west-1.api.aws`.

## Titik akhir layanan menurut Wilayah
<a name="service-endpoints"></a>

Berikut ini adalah titik akhir layanan untuk Amazon EC2. Untuk informasi selengkapnya tentang Wilayah, lihat [Wilayah dan Zona Ketersediaan](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html) di *Panduan Pengguna Amazon EC2*.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/ec2/latest/devguide/ec2-endpoints.html)

## Menentukan titik akhir
<a name="examples"></a>

Bagian ini memberikan beberapa contoh cara menentukan titik akhir saat membuat permintaan.

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

Contoh berikut menunjukkan cara menentukan titik akhir untuk `us-east-2` Wilayah menggunakan. AWS CLI
+ **Tumpukan ganda**

  ```
  aws ec2 describe-regions --region us-east-2 --endpoint-url https://ec2.us-east-2.api.aws
  ```
+ **IPv4**

  ```
  aws ec2 describe-regions --region us-east-2 --endpoint-url https://ec2.us-east-2.amazonaws.com
  ```

------
#### [ AWS SDK for Java 2.x ]

Contoh berikut menunjukkan cara menentukan titik akhir untuk `us-east-2` Wilayah menggunakan. AWS SDK for Java 2.x
+ **Tumpukan ganda**

  ```
  Ec2Client client = Ec2Client.builder()
      .region(Region.US_EAST_2)
      .endpointOverride(URI.create("https://ec2.us-east-2.api.aws"))
      .build();
  ```
+ **IPv4**

  ```
  Ec2Client client = Ec2Client.builder()
      .region(Region.US_EAST_2)
      .endpointOverride(URI.create("https://ec2.us-east-2.amazonaws.com"))
      .build();
  ```

------
#### [ AWS SDK untuk Java 1.x ]

Contoh berikut menunjukkan cara menentukan titik akhir untuk `eu-west-1` Wilayah menggunakan AWS SDK untuk Java 1.x.
+ **Tumpukan ganda**

  ```
  AmazonEC2 s3 = AmazonEC2ClientBuilder.standard()
       .withEndpointConfiguration(new EndpointConfiguration(
            "https://ec2.eu-west-1.api.aws",
            "eu-west-1"))
       .build();
  ```
+ **IPv4**

  ```
  AmazonEC2 s3 = AmazonEC2ClientBuilder.standard()
       .withEndpointConfiguration(new EndpointConfiguration(
            "https://ec2.eu-west-1.amazonaws.com",
            "eu-west-1"))
       .build();
  ```

------
#### [ AWS SDK for Go ]

Contoh berikut menunjukkan cara menentukan titik akhir untuk `us-east-1` Wilayah menggunakan. AWS SDK untuk Go
+ **Tumpukan ganda**

  ```
  sess := session.Must(session.NewSession())
  svc := ec2.New(sess, &aws.Config{
      Region: aws.String(endpoints.UsEast1RegionID),
      Endpoint: aws.String("https://ec2.us-east-1.api.aws")
  })
  ```
+ **IPv4**

  ```
  sess := session.Must(session.NewSession())
  svc := ec2.New(sess, &aws.Config{
      Region: aws.String(endpoints.UsEast1RegionID),
      Endpoint: aws.String("https://ec2.us-east-1.amazonaws.com")
  })
  ```

------

# Konsistensi akhirnya di Amazon API EC2
<a name="eventual-consistency"></a>

Amazon EC2 API mengikuti model konsistensi akhirnya, karena sifat terdistribusi dari sistem yang mendukung API. Ini berarti bahwa hasil dari perintah API yang Anda jalankan yang memengaruhi EC2 sumber daya Amazon Anda mungkin tidak langsung terlihat oleh semua perintah berikutnya yang Anda jalankan. Anda harus mengingat hal ini saat menjalankan perintah API yang segera mengikuti perintah API sebelumnya.

Konsistensi akhirnya dapat memengaruhi cara Anda mengelola sumber daya Anda. Misalnya, jika Anda menjalankan perintah untuk membuat sumber daya, pada akhirnya akan terlihat oleh perintah lain. Ini berarti bahwa jika Anda menjalankan perintah untuk memodifikasi atau mendeskripsikan sumber daya yang baru saja Anda buat, ID-nya mungkin tidak disebarkan ke seluruh sistem, dan Anda akan mendapatkan kesalahan yang merespons bahwa sumber daya tidak ada.

Untuk mengelola konsistensi akhirnya, Anda dapat melakukan hal berikut:
+ Konfirmasikan status sumber daya sebelum Anda menjalankan perintah untuk memodifikasinya. Jalankan `Describe` perintah yang sesuai menggunakan algoritma backoff eksponensial untuk memastikan bahwa Anda memberikan cukup waktu untuk perintah sebelumnya untuk menyebar melalui sistem. Untuk melakukan ini, jalankan `Describe` perintah berulang kali, dimulai dengan beberapa detik waktu tunggu, dan tingkatkan secara bertahap hingga beberapa menit waktu tunggu. 
+ Tambahkan waktu tunggu antara perintah berikutnya, bahkan jika `Describe` perintah mengembalikan respons yang akurat. Terapkan algoritma backoff eksponensial dimulai dengan beberapa detik waktu tunggu, dan tingkatkan secara bertahap hingga beberapa menit waktu tunggu.

**Contoh kesalahan konsistensi akhirnya**  
Berikut ini adalah contoh kode kesalahan yang mungkin Anda temui sebagai akibat dari konsistensi akhirnya.
+ `InvalidInstanceID.NotFound`

  Jika Anda berhasil menjalankan `RunInstances` perintah, dan kemudian segera menjalankan perintah lain menggunakan ID instance yang disediakan dalam respons`RunInstances`, itu mungkin mengembalikan `InvalidInstanceID.NotFound` kesalahan. Ini tidak berarti instance tidak ada. 

  Beberapa perintah spesifik yang mungkin terpengaruh adalah:
  + `DescribeInstances`: Untuk mengonfirmasi keadaan sebenarnya dari instance, jalankan perintah ini menggunakan algoritma backoff eksponensial.
  + `TerminateInstances`: Untuk mengonfirmasi status instance, pertama jalankan `DescribeInstances` perintah menggunakan algoritma backoff eksponensial.
**penting**  
Jika Anda mendapatkan `InvalidInstanceID.NotFound` kesalahan setelah menjalankan`TerminateInstances`, ini tidak berarti bahwa instance tersebut akan atau akan dihentikan. Instance Anda masih bisa berjalan. Inilah sebabnya mengapa penting untuk terlebih dahulu mengkonfirmasi status instance menggunakan`DescribeInstances`.
+ `InvalidGroup.NotFound`

  Jika Anda berhasil menjalankan `CreateSecurityGroup` perintah, dan kemudian segera menjalankan perintah lain menggunakan ID grup keamanan yang disediakan dalam respons`CreateSecurityGroup`, itu mungkin mengembalikan `InvalidGroup.NotFound` kesalahan. Untuk mengonfirmasi status grup keamanan, jalankan `DescribeSecurityGroups` perintah menggunakan algoritma backoff eksponensial.
+ `InstanceLimitExceeded`

  Anda telah meminta lebih banyak instance daripada yang diizinkan batas instans saat ini untuk jenis instans yang ditentukan. Anda dapat mencapai batas ini secara tidak terduga jika Anda meluncurkan dan menghentikan instance dengan cepat, karena instance yang dihentikan dihitung terhadap batas instans Anda untuk sementara waktu setelah dihentikan.

# Memastikan idempotensi dalam permintaan API Amazon EC2
<a name="ec2-api-idempotency"></a>

Saat Anda membuat permintaan API yang bermutasi, permintaan biasanya menampilkan hasil sebelum alur kerja asinkron operasi selesai. Operasi mungkin juga habis atau mengalami masalah server lain sebelum selesai, meskipun permintaan telah mengembalikan hasilnya. Hal ini dapat membuat sulit untuk menentukan apakah permintaan berhasil atau tidak, dan dapat menyebabkan beberapa percobaan ulang untuk memastikan bahwa operasi selesai dengan sukses. Namun, jika permintaan asli dan percobaan ulang berikutnya berhasil, operasi selesai beberapa kali. Ini berarti Anda dapat membuat lebih banyak sumber daya daripada yang Anda inginkan.

*Idempotency* memastikan bahwa permintaan API selesai tidak lebih dari satu kali. Dengan permintaan idempoten, jika permintaan asli berhasil diselesaikan, percobaan ulang berikutnya berhasil diselesaikan tanpa melakukan tindakan lebih lanjut. Namun, hasilnya mungkin berisi informasi yang diperbarui, seperti status pembuatan saat ini.

**Topics**
+ [

## Idempotensi di Amazon EC2
](#client-tokens)
+ [

## RunInstances idempotensi
](#run-instances-idempotency)
+ [

## Contoh
](#Run_Instance_Idempotency_CLI)
+ [

## Coba lagi rekomendasi untuk permintaan idempoten
](#recommended-actions)

## Idempotensi di Amazon EC2
<a name="client-tokens"></a>

Tindakan API berikut adalah idempoten secara default, dan tidak memerlukan konfigurasi tambahan. AWS CLI Perintah yang sesuai juga mendukung idempotensi secara default.

**Idempoten secara default**
+ AssociateAddress
+ CreateVpnConnection
+ DisassociateAddress
+ ReplaceNetworkAclAssociation
+ TerminateInstances

*Tindakan API berikut secara opsional mendukung idempotensi menggunakan token klien.* AWS CLI Perintah yang sesuai juga mendukung idempotensi menggunakan token klien. Token klien adalah string unik dan peka huruf besar/kecil hingga 64 karakter ASCII. Untuk membuat permintaan API idempoten menggunakan salah satu tindakan ini, tentukan token klien dalam permintaan. Anda tidak boleh menggunakan kembali token klien yang sama untuk permintaan API lainnya. Jika Anda mencoba lagi permintaan yang berhasil diselesaikan menggunakan token klien yang sama dan parameter yang sama, percobaan ulang berhasil tanpa melakukan tindakan lebih lanjut. Jika Anda mencoba kembali permintaan yang berhasil menggunakan token klien yang sama, tetapi satu atau beberapa parameter berbeda, selain Wilayah atau Zona Ketersediaan, percobaan ulang gagal dengan kesalahan`IdempotentParameterMismatch`.

**Idempoten menggunakan token klien**
+ AllocateHosts
+ AllocateIpamPoolCidr
+ AssociateClientVpnTargetNetwork
+ AssociateIpamResourceDiscovery
+ AttachVerifiedAccessTrustProvider
+ AuthorizeClientVpnIngress
+ CopyFpgaImage
+ CopyImage
+ CreateCapacityReservation
+ CreateCapacityReservationFleet
+ CreateClientVpnEndpoint
+ CreateClientVpnRoute
+ CreateEgressOnlyInternetGateway
+ CreateFleet
+ CreateFlowLogs
+ CreateFpgaImage
+ CreateInstanceConnectEndpoint
+ CreateIpam
+ CreateIpamPool
+ CreateIpamResourceDiscovery
+ CreateIpamScope
+ CreateLaunchTemplate
+ CreateLaunchTemplateVersion
+ CreateManagedPrefixList
+ CreateNatGateway
+ CreateNetworkAcl
+ CreateNetworkInsightsAccessScope
+ CreateNetworkInsightsPath
+ CreateNetworkInterface
+ CreateReplaceRootVolumeTask
+ CreateReservedInstancesListing
+ CreateRouteTable
+ CreateTrafficMirrorFilter
+ CreateTrafficMirrorFilterRule
+ CreateTrafficMirrorSession
+ CreateTrafficMirrorTarget
+ CreateVerifiedAccessEndpoint
+ CreateVerifiedAccessGroup
+ CreateVerifiedAccessInstance
+ CreateVerifiedAccessTrustProvider
+ CreateVolume
+ CreateVpcEndpoint
+ CreateVpcEndpointConnectionNotification
+ CreateVpcEndpointServiceConfiguration
+ DeleteVerifiedAccessEndpoint
+ DeleteVerifiedAccessGroup
+ DeleteVerifiedAccessInstance
+ DeleteVerifiedAccessTrustProvider
+ DetachVerifiedAccessTrustProvider
+ ExportImage
+ ImportImage
+ ImportSnapshot
+ ModifyInstanceCreditSpecification
+ ModifyLaunchTemplate
+ ModifyReservedInstances
+ ModifyVerifiedAccessEndpoint
+ ModifyVerifiedAccessEndpointPolicy
+ ModifyVerifiedAccessGroup
+ ModifyVerifiedAccessGroupPolicy
+ ModifyVerifiedAccessInstance
+ ModifyVerifiedAccessInstanceLoggingConfiguration
+ ModifyVerifiedAccessTrustProvider
+ ProvisionIpamPoolCidr
+ PurchaseHostReservation
+ RequestSpotFleet
+ RequestSpotInstances
+ RunInstances
+ StartNetworkInsightsAccessScopeAnalysis
+ StartNetworkInsightsAnalysis

**Jenis idempotensi**
+ Regional — Permintaan bersifat idempoten di setiap Wilayah. Namun, Anda dapat menggunakan permintaan yang sama, termasuk token klien yang sama, di Wilayah yang berbeda.
+ Zonal — Permintaan bersifat idempoten di setiap Availability Zone di suatu Wilayah. Misalnya, jika Anda menentukan token klien yang sama dalam dua panggilan ke **AllocateHosts** Wilayah yang sama, panggilan berhasil jika mereka menentukan nilai yang berbeda untuk **AvailabilityZone** parameter.

## RunInstances idempotensi
<a name="run-instances-idempotency"></a>

Tindakan [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html)API menggunakan idempotensi Regional dan zona.

Jenis idempotensi yang digunakan bergantung pada cara Anda menentukan Availability Zone dalam permintaan RunInstances API Anda. Permintaan menggunakan **idempotensi zonal dalam kasus** berikut:
+ Jika Anda secara eksplisit menentukan Availability Zone menggunakan **AvailabilityZone**parameter dalam tipe data **Penempatan**
+ Jika Anda secara implisit menentukan Availability Zone menggunakan parameter **SubnetId**

**Jika Anda tidak secara eksplisit atau implisit menentukan Availability Zone, permintaan tersebut menggunakan idempotensi Regional.**

### Idempotensi zona
<a name="zonal-idempotency"></a>

Idempotensi zona memastikan bahwa permintaan RunInstances API idempoten di setiap Availability Zone di Region. Ini memastikan bahwa permintaan dengan token klien yang sama hanya dapat diselesaikan sekali dalam setiap Availability Zone di Region. Namun, token klien yang sama dapat digunakan untuk meluncurkan instance di Availability Zone lainnya di Region.

Misalnya, jika Anda mengirim permintaan idempoten untuk meluncurkan instance di `us-east-1a` Availability Zone, dan kemudian menggunakan token klien yang sama dalam permintaan di `us-east-1b` Availability Zone, kami meluncurkan instance di masing-masing Availability Zone tersebut. Jika satu atau beberapa parameter berbeda, percobaan ulang berikutnya dengan token klien yang sama di Availability Zones tersebut berhasil kembali tanpa melakukan tindakan lebih lanjut atau gagal dengan `IdempotentParameterMismatch` kesalahan.

### Idempotensi regional
<a name="regional-idempotency"></a>

Idempotensi regional memastikan bahwa permintaan RunInstances API idempoten di Wilayah. Ini memastikan bahwa permintaan dengan token klien yang sama hanya dapat diselesaikan sekali dalam Wilayah. Namun, permintaan yang sama persis, dengan token klien yang sama, dapat digunakan untuk meluncurkan instance di Wilayah yang berbeda.

Misalnya, jika Anda mengirim permintaan idempoten untuk meluncurkan instance di `us-east-1` Wilayah, dan kemudian menggunakan token klien yang sama dalam permintaan di `eu-west-1` Wilayah, kami meluncurkan instance di masing-masing Wilayah tersebut. Jika satu atau lebih parameter berbeda, percobaan ulang berikutnya dengan token klien yang sama di Wilayah tersebut berhasil kembali tanpa melakukan tindakan lebih lanjut atau gagal dengan `IdempotentParameterMismatch` kesalahan.

**Tip**  
Jika salah satu Availability Zone di Region yang diminta tidak tersedia, RunInstances permintaan yang menggunakan idempotensi regional bisa gagal. Untuk memanfaatkan fitur Availability Zone yang ditawarkan oleh AWS infrastruktur, sebaiknya gunakan idempotensi zona saat meluncurkan instance. RunInstances permintaan yang menggunakan idempotensi zona dan menargetkan Availability Zone yang tersedia berhasil meskipun Availability Zone lain di Wilayah yang diminta tidak tersedia.

## Contoh
<a name="Run_Instance_Idempotency_CLI"></a>

### AWS CLI contoh perintah
<a name="cli-example"></a>

Untuk membuat AWS CLI perintah idempoten, tambahkan opsi. `--client-token` 

**Contoh 1: Idempotensi**  
Perintah [allocate-hosts](https://docs.aws.amazon.com/cli/latest/reference/ec2/allocate-hosts.html) berikut menggunakan idempotency karena menyertakan token klien.

```
aws ec2 allocate-hosts  --instance-type m5.large  --availability-zone eu-west-1a  --auto-placement on  --quantity 1 --client-token 550e8400-e29b-41d4-a716-446655440000
```

**Contoh 2: run-instance idempotensi regional**  
Perintah [run-instance](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html) berikut menggunakan idempotensi regional karena menyertakan token klien tetapi tidak secara eksplisit atau implisit menentukan Availability Zone.

```
aws ec2 run-instances --image-id ami-b232d0db --count 1 --key-name my-key-pair --client-token 550e8400-e29b-41d4-a716-446655440000
```

**Contoh 3: run-instance idempotensi zona**  
Perintah [run-instance](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html) berikut menggunakan idempotensi zonal karena menyertakan token klien dan Availability Zone yang ditentukan secara eksplisit.

```
aws ec2 run-instances  --placement "AvailabilityZone=us-east-1a" --image-id ami-b232d0db --count 1 --key-name my-key-pair --client-token 550e8400-e29b-41d4-a716-446655440000
```

### Contoh permintaan API
<a name="api-example"></a>

Untuk membuat permintaan API idempoten, tambahkan parameter. `ClientToken`

**Contoh 1: Idempotensi**  
Permintaan [AllocateHosts](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AllocateHosts.html)API berikut menggunakan idempotensi karena menyertakan token klien.

```
https://ec2.amazonaws.com/?Action=AllocateHosts
&AvailabilityZone=us-east-1b
&InstanceType=m5.large
&Quantity=1
&AutoPlacement=off
&ClientToken=550e8400-e29b-41d4-a716-446655440000
&AUTHPARAMS
```

**Contoh 2: RunInstances idempotensi regional**  
Permintaan [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html)API berikut menggunakan idempotensi regional karena menyertakan token klien tetapi tidak secara eksplisit atau implisit menentukan Availability Zone.

```
https://ec2.amazonaws.com/?Action=RunInstances
&ImageId=ami-3ac33653
&MaxCount=1
&MinCount=1
&KeyName=my-key-pair
&ClientToken=550e8400-e29b-41d4-a716-446655440000
&AUTHPARAMS
```

**Contoh 3: RunInstances idempotensi zonal**  
Permintaan [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html)API berikut menggunakan idempotensi zona karena menyertakan token klien dan Availability Zone yang ditentukan secara eksplisit.

```
https://ec2.amazonaws.com/?Action=RunInstances
&Placement.AvailabilityZone=us-east-1d
&ImageId=ami-3ac33653
&MaxCount=1
&MinCount=1
&KeyName=my-key-pair
&ClientToken=550e8400-e29b-41d4-a716-446655440000
&AUTHPARAMS
```

## Coba lagi rekomendasi untuk permintaan idempoten
<a name="recommended-actions"></a>

Tabel berikut menunjukkan beberapa tanggapan umum yang mungkin Anda dapatkan untuk permintaan API idempoten, dan memberikan rekomendasi coba ulang.


| Respons | Rekomendasi | Komentar | 
| --- | --- | --- | 
|  200 (OK)  |  Jangan coba lagi  |  Permintaan asli berhasil diselesaikan. Setiap percobaan ulang berikutnya berhasil kembali.  | 
|  Kode respons 400 seri (kesalahan [klien](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/errors-overview.html#CommonErrors))  |  Jangan coba lagi  |  Ada masalah dengan permintaan, dari antara yang berikut:  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/ec2/latest/devguide/ec2-api-idempotency.html) Jika permintaan melibatkan sumber daya yang sedang dalam proses mengubah status, mencoba kembali permintaan mungkin berhasil.  | 
|  Kode respons 500 seri (kesalahan [server](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/errors-overview.html#api-error-codes-table-server))  |  Coba lagi  |  Kesalahan ini disebabkan oleh masalah AWS sisi server dan umumnya bersifat sementara. Ulangi permintaan dengan strategi backoff yang sesuai.  | 

# Minta pembatasan untuk Amazon API EC2
<a name="ec2-api-throttling"></a>

Amazon EC2 membatasi permintaan EC2 API untuk setiap AWS akun per wilayah. Kami melakukan ini untuk membantu kinerja layanan, dan untuk memastikan penggunaan yang adil untuk semua EC2 pelanggan Amazon. Throttling memastikan bahwa permintaan ke Amazon EC2 API tidak melebihi batas permintaan API maksimum yang diizinkan. Permintaan API tunduk pada batas permintaan apakah permintaan tersebut berasal dari:
+ Aplikasi pihak ketiga
+ Alat baris perintah
+  EC2 Konsol Amazon

Jika Anda melebihi batas pembatasan API, Anda mendapatkan kode `RequestLimitExceeded` kesalahan.

**Topics**
+ [

## Bagaimana throttling diterapkan
](#throttling-how)
+ [Minta batas token](#throttling-limits-rate-based)
+ [Batas token sumber daya](#throttling-limits-cost-based)
+ [

## Pantau pelambatan API
](#throttling-monitor)
+ [

## Mencoba lagi dan backoff eksponensial
](#api-backoff)
+ [

## Minta kenaikan batas
](#throttling-increase)

## Bagaimana throttling diterapkan
<a name="throttling-how"></a>

Amazon EC2 menggunakan [algoritma token bucket](https://en.wikipedia.org/wiki/Token_bucket) untuk mengimplementasikan pelambatan API. Dengan algoritme ini, akun Anda memiliki *bucket* yang memegang sejumlah tertentu *token*. Jumlah token dalam bucket mewakili batas throttling Anda pada detik tertentu.

Amazon EC2 mengimplementasikan dua jenis pelambatan API:

**Topics**
+ [

### Pembatasan laju permintaan
](#throttling-rate-based)
+ [

### Pembatasan tingkat sumber daya
](#throttling-cost-based)

### Pembatasan laju permintaan
<a name="throttling-rate-based"></a>

Dengan pembatasan tingkat permintaan, setiap API dievaluasi secara individual, dan Anda dibatasi pada jumlah permintaan yang Anda buat berdasarkan per-API. Setiap permintaan yang Anda buat menghapus satu token dari bucket API. Misalnya, ukuran bucket token untuk`DescribeHosts`, aksi API yang *tidak bermutasi*, adalah 100 token. Anda dapat membuat hingga 100 `DescribeHosts` permintaan dalam satu detik. Jika Anda melebihi 100 permintaan dalam satu detik, Anda akan dibatasi pada API tersebut dan permintaan yang tersisa dalam detik tersebut gagal, namun permintaan untuk API lain tidak terpengaruh.

Bucket secara otomatis diisi ulang pada tingkat yang ditetapkan. Jika bucket berada di bawah kapasitas maksimumnya, sejumlah token ditambahkan kembali setiap detik hingga mencapai kapasitas maksimumnya. Jika ember penuh saat token isi ulang tiba, mereka dibuang. Bucket tidak dapat menampung lebih dari jumlah token maksimumnya. Misalnya, ukuran bucket untuk`DescribeHosts`, aksi API *non-mutasi*, adalah 100 token dan tingkat isi ulang adalah 20 token per detik. Jika Anda membuat 100 `DescribeHosts` permintaan dalam satu detik, bucket dikurangi menjadi nol (0) token. Bucket kemudian diisi ulang dengan 20 token setiap detik, hingga mencapai kapasitas maksimum 100 token. Ini berarti bahwa ember kosong mencapai kapasitas maksimumnya setelah 5 detik jika tidak ada permintaan yang dibuat selama waktu itu.

Anda tidak perlu menunggu bucket benar-benar penuh sebelum Anda dapat membuat permintaan API. Anda dapat menggunakan token isi ulang saat ditambahkan ke ember. Jika Anda segera menggunakan token isi ulang, ember tidak mencapai kapasitas maksimumnya. Misalnya, ukuran bucket untuk`DescribeHosts`, aksi API *non-mutasi*, adalah 100 token dan tingkat isi ulang adalah 20 token per detik. Jika Anda menghabiskan bucket dengan membuat 100 permintaan API dalam satu detik, Anda dapat terus membuat 20 permintaan API per detik dengan menggunakan token isi ulang saat ditambahkan ke bucket. Bucket dapat diisi ulang hingga kapasitas maksimum hanya jika Anda membuat kurang dari 20 permintaan API per detik.

Untuk informasi selengkapnya, lihat [Minta ukuran bucket token dan tarif isi ulang](#throttling-limits-rate-based).

### Pembatasan tingkat sumber daya
<a name="throttling-cost-based"></a>

Beberapa tindakan API, seperti `RunInstances` dan`TerminateInstances`, seperti yang dijelaskan dalam tabel berikut, menggunakan pembatasan laju sumber daya selain pembatasan tingkat permintaan. Tindakan API ini memiliki bucket token sumber daya terpisah yang habis berdasarkan jumlah sumber daya yang dipengaruhi oleh permintaan. Seperti bucket token permintaan, bucket token sumber daya memiliki bucket maksimum yang memungkinkan Anda melakukan burst, dan tingkat isi ulang yang memungkinkan Anda mempertahankan tingkat permintaan yang stabil selama diperlukan. Jika Anda melebihi batas bucket tertentu untuk API, termasuk saat bucket belum diisi ulang untuk mendukung permintaan API berikutnya, tindakan API akan terbatas meskipun Anda belum mencapai batas throttle API total.

Misalnya, ukuran bucket token sumber daya untuk `RunInstances` adalah 1000 token, dan tingkat isi ulang adalah dua token per detik. Oleh karena itu, Anda dapat segera meluncurkan 1000 instans, menggunakan sejumlah permintaan API, seperti satu permintaan untuk 1000 instans atau empat permintaan untuk 250 instans. Setelah bucket token sumber daya kosong, Anda dapat meluncurkan hingga dua instance setiap detik, menggunakan salah satu permintaan untuk dua instance atau dua permintaan untuk satu instance.

Untuk informasi selengkapnya, lihat [Ukuran bucket token sumber daya dan tarif isi ulang](#throttling-limits-cost-based).

## Minta ukuran bucket token dan tarif isi ulang
<a name="throttling-limits-rate-based"></a>

Untuk tujuan pembatasan tingkat permintaan, tindakan API dikelompokkan ke dalam kategori berikut:
+ Tindakan **non-mutasi — Tindakan** API yang mengambil data tentang sumber daya. Kategori ini umumnya mencakup semua`Describe*`,`List*`,`Search*`, dan tindakan `Get*` API, seperti`DescribeRouteTables`,`SearchTransitGatewayRoutes`, dan`GetIpamPoolCidrs`. Tindakan API ini biasanya memiliki batas pembatasan API tertinggi.
+ [Tindakan **non-mutasi tanpa filter dan tanpa paginasi — Subset spesifik dari tindakan** API non-mutasi yang, ketika diminta tanpa menentukan [pagination](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-pagination.html) atau filter, menggunakan token dari bucket token yang lebih kecil.](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/Using_Filtering.html#Filtering_Resources_CLI) Disarankan agar Anda menggunakan pagination dan filtering sehingga token dikurangkan dari bucket token standar (lebih besar).
+ **Tindakan mutasi — Tindakan** API yang membuat, memodifikasi, atau menghapus sumber daya. Kategori ini umumnya mencakup semua tindakan API yang tidak dikategorikan sebagai *tindakan non-mutasi*, seperti`AllocateHosts`,, dan. `ModifyHosts` `CreateCapacityReservation` Tindakan ini memiliki batas pelambatan yang lebih rendah daripada tindakan API yang tidak bermutasi.
+ **Tindakan intensif sumber daya — Mutasi tindakan** API yang memakan waktu paling banyak dan menghabiskan sebagian besar sumber daya untuk diselesaikan. Tindakan ini memiliki batas pelambatan yang lebih rendah daripada tindakan *mutasi*. Mereka dibatasi secara terpisah dari tindakan *mutasi* lainnya.
+ Tindakan **non-mutasi konsol — Tindakan** API non-mutasi yang diminta dari konsol Amazon. EC2 Tindakan API ini dibatasi secara terpisah dari tindakan API non-mutasi lainnya.
+ **Tindakan yang tidak dikategorikan** — Ini adalah tindakan API yang menerima ukuran bucket token dan tarif isi ulang mereka sendiri, meskipun menurut definisi mereka cocok dalam salah satu kategori lainnya.


| Kategori aksi API | Tindakan | Kapasitas maksimum bucket | Tingkat isi ulang ember | 
| --- | --- | --- | --- | 
| Tindakan yang tidak bermutasi |  Tindakan`Describe*`, `List*``Search*`,, dan `Get*` API yang tidak termasuk dalam kategori lain.  | 100 | 20 | 
| Tindakan non-mutasi tanpa filter dan tanpa paginasi |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/ec2/latest/devguide/ec2-api-throttling.html)  | 50 | 10 | 
| Tindakan bermutasi | *Semua tindakan API yang bermutasi yang bukan merupakan tindakan *intensif sumber daya* atau tindakan Uncategorized.* | 50 | 5 | 
| Tindakan intensif sumber daya |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/ec2/latest/devguide/ec2-api-throttling.html)  | 50 | 5 | 
| Tindakan konsol yang tidak bermutasi |  Tindakan`Describe*`, `List*``Search*`,, dan `Get*` API, yang dipanggil oleh EC2 konsol Amazon, tetapi tidak termasuk dalam kategori lain.  | 100 | 10 | <a name="uncategorized"></a>


| Tindakan yang tidak dikategorikan | Kapasitas maksimum bucket | Tingkat isi ulang ember | 
| --- | --- | --- | 
| AcceptVpcEndpointConnections | 10 | 1 | 
| AdvertiseByoipCidr | 1 | 0,1 | 
| AssignIpv6Addresses | 100 | 5 | 
| AssignPrivateIpAddresses | 100 | 5 | 
| AssignPrivateNatGatewayAddress | 10 | 1 | 
| AssociateCapacityReservationBillingOwner | 1 | 0,5 | 
| AssociateEnclaveCertificateIamRole | 10 | 1 | 
| AssociateIamInstanceProfile | 100 | 5 | 
| AssociateNatGatewayAddress | 10 | 1 | 
| AttachVerifiedAccessTrustProvider | 10 | 2 | 
| AuthorizeClientVpnIngress | 5 | 2 | 
| CancelDeclarativePoliciesReport | 1 | 1 | 
| CopyImage | 100 | 1 | 
| CreateClientVpnRoute | 5 | 2 | 
| CreateCoipCidr | 5 | 1 | 
| CreateCoipPool | 5 | 1 | 
| CreateDefaultSubnet | 1 | 1 | 
| CreateDefaultVpc | 1 | 1 | 
| CreateLaunchTemplateVersion | 100 | 5 | 
| CreateNatGateway | 10 | 1 | 
| CreateNetworkInterface | 100 | 5 | 
| CreateRestoreImageTask | 50 | 0,1 | 
| CreateSnapshot | 100 | 5 | 
| CreateSnapshots | 100 | 5 | 
| CreateSpotDatafeedSubscription | 50 | 3 | 
| CreateStoreImageTask | 50 | 0,1 | 
| CreateSubnetCidrReservation | 5 | 1 | 
| CreateTags | 100 | 10 | 
| CreateVerifiedAccessEndpoint | 20 | 4 | 
| CreateVerifiedAccessGroup | 10 | 2 | 
| CreateVerifiedAccessInstance | 10 | 2 | 
| CreateVerifiedAccessTrustProvider | 10 | 2 | 
| CreateVolume | 100 | 5 | 
| CreateVpcEndpoint | 4 | 0,3 | 
| CreateVpcEndpointServiceConfiguration | 10 | 1 | 
| DeleteClientVpnRoute | 5 | 2 | 
| DeleteCoipCidr | 5 | 1 | 
| DeleteCoipPool | 5 | 1 | 
| DeleteCoipPoolPermission | 5 | 1 | 
| DeleteNatGateway | 10 | 1 | 
| DeleteNetworkInterface | 100 | 5 | 
| DeleteSnapshot | 100 | 5 | 
| DeleteSpotDatafeedSubscription | 50 | 3 | 
| DeleteSubnetCidrReservation | 5 | 1 | 
| DeleteQueuedReservedInstances | 5 | 5 | 
| DeleteTags | 100 | 10 | 
| DeleteVerifiedAccessEndpoint | 20 | 4 | 
| DeleteVerifiedAccessGroup | 10 | 2 | 
| DeleteVerifiedAccessInstance | 10 | 2 | 
| DeleteVerifiedAccessTrustProvider | 10 | 2 | 
| DeleteVolume | 100 | 5 | 
| DeleteVpcEndpoints | 4 | 0,3 | 
| DeleteVpcEndpointServiceConfigurations | 10 | 1 | 
| DeprovisionByoipCidr | 1 | 0,1 | 
| DeregisterImage | 100 | 5 | 
| DescribeAggregateIdFormat | 10 | 10 | 
| DescribeByoipCidrs | 1 | 0,5 | 
| DescribeCapacityBlockExtensionOfferings | 10 | 0,15 | 
| DescribeCapacityBlockOfferings | 10 | 0,15 | 
| DescribeDeclarativePoliciesReports | 5 | 5 | 
| DescribeHostReservations | 5 | 2 | 
| DescribeHostReservationOfferings | 5 | 2 | 
| DescribeIdentityIdFormat | 10 | 10 | 
| DescribeIdFormat | 10 | 10 | 
| DescribeInstanceTopology | 1 | 1 | 
| DescribeMovingAddresses | 1 | 1 | 
| DescribePrincipalIdFormat | 10 | 10 | 
| DescribeReservedInstancesOfferings | 10 | 10 | 
| DescribeSecurityGroupReferences | 20 | 5 | 
| DescribeSpotDatafeedSubscription | 100 | 13 | 
| DescribeSpotFleetInstances | 100 | 5 | 
| DescribeSpotFleetRequestHistory | 100 | 5 | 
| DescribeSpotFleetRequests | 50 | 3 | 
| DescribeStaleSecurityGroups | 20 | 5 | 
| DescribeStoreImageTasks | 50 | 0,5 | 
| DescribeVerifiedAccessInstanceLoggingConfigurations | 10 | 2 | 
| DetachVerifiedAccessTrustProvider | 10 | 2 | 
| DisableFastLaunch | 5 | 2 | 
| DisableImageBlockPublicAccess | 1 | 0,1 | 
| DisableSnapshotBlockPublicAccess | 1 | 0,1 | 
| DisassociateCapacityReservationBillingOwner | 1 | 0,5 | 
| DisassociateEnclaveCertificateIamRole | 10 | 1 | 
| DisassociateIamInstanceProfile | 100 | 5 | 
| DisassociateNatGatewayAddress | 10 | 1 | 
| EnableFastLaunch | 5 | 2 | 
| EnableImageBlockPublicAccess | 1 | 0,1 | 
| EnableSnapshotBlockPublicAccess | 1 | 0,1 | 
| GetAssociatedEnclaveCertificateIamRoles | 10 | 1 | 
| GetDeclarativePoliciesReportSummary | 5 | 5 | 
| GetHostReservationPurchasePreview | 5 | 2 | 
| ModifyImageAttribute | 100 | 5 | 
| ModifyInstanceMetadataDefaults | 2 | 2 | 
| ModifyInstanceMetadataOptions | 100 | 5 | 
| ModifyLaunchTemplate | 100 | 5 | 
| ModifyNetworkInterfaceAttribute | 100 | 5 | 
| ModifySnapshotAttribute | 100 | 5 | 
| ModifyVerifiedAccessEndpoint | 20 | 4 | 
| ModifyVerifiedAccessEndpointPolicy | 20 | 4 | 
| ModifyVerifiedAccessGroup | 10 | 2 | 
| ModifyVerifiedAccessGroupPolicy | 20 | 4 | 
| ModifyVerifiedAccessInstance | 10 | 2 | 
| ModifyVerifiedAccessInstanceLoggingConfiguration | 10 | 2 | 
| ModifyVerifiedAccessTrustProvider | 10 | 2 | 
| ModifyVpcEndpoint | 4 | 0,3 | 
| ModifyVpcEndpointServiceConfiguration | 10 | 1 | 
| MoveAddressToVpc | 1 | 1 | 
| ProvisionByoipCidr | 1 | 0,1 | 
| PurchaseCapacityBlock | 10 | 0,15 | 
| PurchaseCapacityBlockExtension | 10 | 0,15 | 
| PurchaseHostReservation | 5 | 2 | 
| PurchaseReservedInstancesOffering | 5 | 5 | 
| RejectVpcEndpointConnections | 10 | 1 | 
| RestoreAddressToClassic | 1 | 1 | 
| RevokeClientVpnIngress | 5 | 2 | 
| RunInstances | 5 | 2 | 
| StartDeclarativePoliciesReport | 1 | 1 | 
| StartInstances | 5 | 2 | 
| TerminateInstances | 100 | 5 | 
| UnassignPrivateIpAddresses | 100 | 5 | 
| UnassignPrivateNatGatewayAddress | 10 | 1 | 
| WithdrawByoipCidr | 1 | 0,1 | 

## Ukuran bucket token sumber daya dan tarif isi ulang
<a name="throttling-limits-cost-based"></a>

Tabel berikut mencantumkan ukuran bucket token resource dan laju isi ulang untuk tindakan API yang menggunakan pembatasan laju sumber daya.


| Tindakan API | Kapasitas maksimum bucket | Tingkat isi ulang ember | 
| --- | --- | --- | 
| RunInstances | 1000 | 2 | 
| TerminateInstances | 1000 | 20 | 
| StartInstances | 1000 | 2 | 
| StopInstances | 1000 | 20 | 

## Pantau pelambatan API
<a name="throttling-monitor"></a>

Anda dapat menggunakan Amazon CloudWatch untuk memantau permintaan EC2 API Amazon Anda dan untuk mengumpulkan dan melacak metrik seputar pembatasan API. Anda juga dapat membuat alarm untuk memperingatkan Anda ketika Anda hampir mencapai batas pelambatan API. Untuk informasi selengkapnya, lihat [Pantau permintaan EC2 API Amazon menggunakan Amazon CloudWatchPantau permintaan API menggunakan CloudWatch](monitor.md).

## Mencoba lagi dan backoff eksponensial
<a name="api-backoff"></a>

Aplikasi Anda mungkin perlu mencoba kembali permintaan API. Contoh:
+ Untuk memeriksa pembaruan dalam status sumber daya
+ Untuk menghitung sejumlah besar sumber daya (misalnya, semua volume Anda)
+ Untuk mencoba lagi permintaan setelah gagal dengan kesalahan server (5xx) atau kesalahan pelambatan

Namun, untuk kesalahan klien (4xx), Anda harus merevisi permintaan untuk memperbaiki masalah sebelum mencoba permintaan lagi.

**Perubahan status sumber daya**  
Sebelum Anda memulai polling untuk memeriksa pembaruan status, berikan waktu permintaan untuk berpotensi selesai. Misalnya, tunggu beberapa menit sebelum memeriksa apakah instans Anda aktif. Saat Anda memulai polling, gunakan interval tidur yang sesuai di antara permintaan berturut-turut untuk menurunkan tingkat permintaan API. Untuk hasil terbaik, gunakan interval tidur yang meningkat atau variabel.

Atau, Anda dapat menggunakan Amazon EventBridge untuk memberi tahu Anda tentang status beberapa sumber daya. Misalnya, Anda dapat menggunakan acara **Pemberitahuan Perubahan Status EC2 Instans** untuk memberi tahu Anda tentang perubahan status untuk sebuah instance. Untuk informasi selengkapnya, lihat [Mengotomatiskan Amazon EC2 menggunakan EventBridge](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/automating_with_eventbridge.html).

**Percobaan ulang**  
Saat Anda perlu melakukan polling atau mencoba ulang permintaan API, sebaiknya gunakan algoritme backoff eksponensial untuk menghitung interval tidur antara permintaan API. Ide di balik backoff eksponensial adalah menggunakan waktu tunggu yang semakin lama antara percobaan ulang untuk respons kesalahan yang berurutan. Anda harus menerapkan interval penundaan maksimum, serta jumlah percobaan ulang maksimum. Anda juga dapat menggunakan jitter (penundaan acak) untuk mencegah tabrakan berturut-turut. Untuk informasi selengkapnya, lihat [Timeout, percobaan ulang, dan backoff](https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/) dengan jitter.

Setiap AWS SDK mengimplementasikan logika coba ulang otomatis. Untuk informasi selengkapnya, lihat [Coba lagi perilaku](https://docs.aws.amazon.com/sdkref/latest/guide/feature-retry-behavior.html) di *Panduan Referensi Alat AWS SDKs dan Alat*.

## Minta kenaikan batas
<a name="throttling-increase"></a>

Anda dapat meminta peningkatan batas pembatasan API untuk Anda. Akun AWS

**Rekomendasi**
+ Minta paling banyak tiga kali batas Anda yang ada dalam satu permintaan.
+ Prioritaskan peningkatan tarif isi ulang bucket sebelum meningkatkan kapasitas maksimum bucket.
+ Jika laju isi ulang bucket yang diminta akan melebihi kapasitas maksimum bucket, tingkatkan kapasitas maksimum bucket secara bersamaan.
+ Menyediakan semua tindakan API yang memerlukan peningkatan. Batas diterapkan pada tindakan API individual, bukan kategori tindakan API.
+ Ada batas tingkat permintaan dan tingkat sumber daya untuk tindakan API berikut:`RunInstances`,`StartInstances`,`StopInstances`, dan`TerminateInstances`. Pastikan untuk menunjukkan batas mana yang harus ditingkatkan

**Untuk meminta akses ke fitur ini**

1. [AWS Dukungan Pusat](https://console.aws.amazon.com/support/home#/) Terbuka.

1. Pilih **Buat kasus**.

1. Pilih **Akun dan penagihan**.

1. Untuk **Layanan**, pilih **Info Umum dan Memulai**.

1. Untuk **Kategori**, pilih **Menggunakan AWS & Layanan**.

1. Pilih **Langkah selanjutnya: Informasi tambahan**.

1. Untuk **Subjek**, masukkan**Request an increase in my Amazon EC2 API throttling limits**.

1. Untuk **Deskripsi**, salin templat berikut dan berikan informasi yang diperlukan.

   ```
   Please increase the API throttling limits for my account. 
   Related page: https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-throttling.html
   Description: Brief notes about your use case. If available, include the IDs
       of a few Amazon EC2 requests that were throttled.
   Time window: One-hour window when peak throttling or usage occurred.
   region_1 request rate increases:
       action: new_bucket_maximum_capacity
       action: new_bucket_refill_rate
       action: new_bucket_maximum_capacity|new_bucket_refill_rate
   region_1 resource rate increases:
       action: new_bucket_maximum_capacity
       action: new_bucket_refill_rate
       action: new_bucket_maximum_capacity|new_bucket_refill_rate
   region_2 request rate increases:
       action: new_bucket_maximum_capacity
       action: new_bucket_refill_rate
       action: new_bucket_maximum_capacity|new_bucket_refill_rate
   region_2 resource rate increases:
       action: new_bucket_maximum_capacity
       action: new_bucket_refill_rate
       action: new_bucket_maximum_capacity|new_bucket_refill_rate
   ```

1. Pilih **Langkah selanjutnya: Selesaikan sekarang atau hubungi kami**.

1. Pada tab **Hubungi kami**, pilih bahasa kontak pilihan Anda dan metode kontak.

1. Pilih **Kirim**.

# Pagination di Amazon API EC2
<a name="ec2-api-pagination"></a>

Kami menyarankan Anda menggunakan pagination saat memanggil tindakan describe yang berpotensi mengembalikan sejumlah besar hasil, seperti`DescribeInstances`. Menggunakan pagination membatasi jumlah item yang dikembalikan oleh panggilan deskripsikan dan waktu yang dibutuhkan untuk panggilan kembali. Jika Anda memiliki sejumlah besar sumber daya, panggilan tanpa paginasi mungkin dibatasi dan dapat habis waktu. Oleh karena itu, latensi keseluruhan lebih baik dengan panggilan paginasi daripada dengan panggilan tanpa paginasi karena panggilan berhalaman berhasil secara konsisten.

Untuk informasi selengkapnya, lihat [Pagination](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination) di *Referensi Amazon EC2 API*.

## Praktik terbaik
<a name="pagination-best-practices"></a>

Jika memungkinkan, tentukan daftar sumber daya IDs dalam panggilan deskripsikan Anda. Ini adalah cara tercepat untuk menggambarkan sejumlah besar sumber daya. Perhatikan bahwa Anda tidak boleh menentukan lebih dari 1.000 IDs dalam satu panggilan. Berikut adalah contohnya.

```
private List<Reservation> describeMyInstances(List<String> ids){
    if (ids == null || ids.isEmpty()) {
        return ImmutableList.of();
    }
        
    final DescribeInstancesRequest request = new DescribeInstancesRequest()
            .withInstanceIds(ids);

    return ec2.describeInstances(request).getReservations();
}
```

Jika Anda tidak dapat menentukan sumber daya IDs dalam panggilan deskripsikan, kami sangat menyarankan untuk menggunakan pagination. Berikut adalah contohnya.

```
private List<Reservation> describeMyInstances(final Collection<Filter> filters){
    final DescribeInstancesRequest request = new DescribeInstancesRequest()
            .withFilters(filters)
            .withMaxResults(1000);

    List<Reservation> reservations = new ArrayList<>();
    String nextToken = null;
    do {
        request.setNextToken(nextToken);
        final DescribeInstancesResult response = ec2.describeInstances(request);
        reservations.addAll(response.getReservations());
        nextToken = response.getNextToken();
    } while (nextToken != null);

    return reservations;
}
```

Jika Anda perlu mencoba lagi panggilan paginasi, gunakan back-off [eksponensial](ec2-api-throttling.md#api-backoff) dengan jitter.

## Masalah umum
<a name="pagination-common-issues"></a>

Berikut ini adalah contoh kode yang secara tidak sengaja membuat panggilan tanpa paginasi.

**Example Contoh masalah: Melewati daftar sumber daya yang kosong IDs**  
Kode berikut menggunakan daftar IDs. Namun, jika daftar kosong, hasilnya adalah panggilan tanpa paginasi.  

```
private List<Reservation> describeMyInstances(List<String> ids){
    final DescribeInstancesRequest request = new DescribeInstancesRequest()
            .withInstanceIds(ids);

    return ec2.describeInstances(request).getReservations();
}
```
Untuk memperbaiki masalah ini, pastikan daftar tidak kosong sebelum melakukan panggilan deskripsikan.  

```
private List<Reservation> describeMyInstances(List<String> ids){
    if (ids == null || ids.isEmpty()) {
        return ImmutableList.of();
        // OR
        return Lists.newArrayList();
        // OR
        return new ArrayList<>();
    }
        
    final DescribeInstancesRequest request = new DescribeInstancesRequest()
            .withInstanceIds(ids);

    return ec2.describeInstances(request).getReservations();
}
```

**Example Contoh masalah: Tidak menyetel MaxResults**  
Kode berikut memeriksa dan menggunakan`nextToken`, tetapi tidak diatur`MaxResults`.  

```
private List<Reservation> describeMyInstances(final Collection<Filter> filters){
    final DescribeInstancesRequest request = new DescribeInstancesRequest()
            .withFilters(filters);

    List<Reservation> reservations = new ArrayList<>();
    String nextToken = null;
    do {
        request.setNextToken(nextToken);
        final DescribeInstancesResult response = ec2.describeInstances(request);
        reservations.addAll(response.getReservations());
        nextToken = response.getNextToken();
    } while (nextToken != null);

    return reservations;
}
```
Untuk memperbaiki masalah ini, tambahkan `withMaxResults` sebagai berikut.  

```
private List<Reservation> describeMyInstances(final Collection<Filter> filters){
    final DescribeInstancesRequest request = new DescribeInstancesRequest()
            .withFilters(filters)
            .withMaxResults(1000);

    List<Reservation> reservations = new ArrayList<>();
    String nextToken = null;
    do {
        request.setNextToken(nextToken);
        final DescribeInstancesResult response = ec2.describeInstances(request);
        reservations.addAll(response.getReservations());
        nextToken = response.getNextToken();
    } while (nextToken != null);

    return reservations;
}
```