

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

# Bekerja dengan metadata instans Amazon EC2
<a name="examples-ec2-IMDS"></a>

Klien Java SDK untuk Layanan Metadata Instans Amazon EC2 (klien metadata) memungkinkan aplikasi Anda mengakses metadata pada instans EC2 lokal mereka. Klien metadata bekerja dengan instance lokal [IMDSv2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html)(Instance Metadata Service v2) dan menggunakan permintaan berorientasi sesi. 

Dua kelas klien tersedia di SDK. Sinkron `[Ec2MetadataClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/imds/Ec2MetadataClient.html)` adalah untuk memblokir operasi, dan untuk kasus penggunaan asinkron, non-pemblokiran. [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/imds/Ec2MetadataAsyncClient.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/imds/Ec2MetadataAsyncClient.html) 

## Memulai
<a name="examples-ec2-IMDS-getstarted"></a>

Untuk menggunakan klien metadata, tambahkan artefak `imds` Maven ke proyek Anda. Anda juga memerlukan kelas untuk `[SdkHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/SdkHttpClient.html)` (atau `[SdkAsyncHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/async/SdkAsyncHttpClient.html)` untuk varian asinkron) pada classpath. 

Berikut Maven XMLmenunjukkan cuplikan dependensi untuk menggunakan sinkron [UrlConnectionHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/urlconnection/UrlConnectionHttpClient.html)bersama dengan ketergantungan untuk klien metadata.

```
<dependencyManagement>
   <dependencies>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>bom</artifactId>
            <version>VERSION</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>imds</artifactId>
    </dependency>
    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>url-connection-client</artifactId>
    </dependency>
    <!-- other dependencies --> 
</dependencies>
```

Cari [repositori pusat Maven](https://central.sonatype.com/artifact/software.amazon.awssdk/bom) untuk versi artefak terbaru. `bom`

Untuk menggunakan klien HTTP asinkron, ganti cuplikan ketergantungan untuk artefak. `url-connection-client` Misalnya, cuplikan berikut membawa implementasi. [NettyNioAsyncHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/nio/netty/NettyNioAsyncHttpClient.html)

```
    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>netty-nio-client</artifactId>
    </dependency>
```

## Gunakan klien metadata
<a name="examples-ec2-IMDS-use"></a>

### Membuat instance klien metadata
<a name="examples-ec2-IMDS-use-create"></a>

Anda dapat membuat instance sinkron `Ec2MetadataClient` ketika hanya satu implementasi `SdkHttpClient` antarmuka yang ada di classpath. Untuk melakukannya, panggil `Ec2MetadataClient#create()` metode statis seperti yang ditunjukkan pada cuplikan berikut. 

```
Ec2MetadataClient client = Ec2MetadataClient.create(); // 'Ec2MetadataAsyncClient#create' is the asynchronous version.
```

Jika aplikasi Anda memiliki beberapa implementasi `SdkHttpAsyncClient` antarmuka `SdkHttpClient` atau, Anda harus menentukan implementasi untuk klien metadata untuk digunakan seperti yang ditunjukkan di bagian. [Klien HTTP yang dapat dikonfigurasi](#examples-ec2-IMDS-features-http) 

**catatan**  
Untuk sebagian besar klien layanan, seperti Amazon S3, SDK for Java secara otomatis menambahkan implementasi antarmuka atau. `SdkHttpClient` `SdkHttpAsyncClient` Jika klien metadata Anda menggunakan implementasi yang sama, maka `Ec2MetadataClient#create()` akan berfungsi. Jika Anda memerlukan implementasi yang berbeda, Anda harus menentukannya saat Anda membuat klien metadata.

### Kirim permintaan
<a name="examples-ec2-IMDS-use-req"></a>

[Untuk mengambil metadata instance, buat instance `EC2MetadataClient` class dan panggil `get` method dengan parameter path yang menentukan kategori metadata instance.](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-categories.html)

Contoh berikut mencetak nilai yang terkait dengan `ami-id` kunci ke konsol.

```
Ec2MetadataClient client = Ec2MetadataClient.create();
Ec2MetadataResponse response = client.get("/latest/meta-data/ami-id");
System.out.println(response.asString());
client.close(); // Closes the internal resources used by the Ec2MetadataClient class.
```

Jika jalur tidak valid, `get` metode melempar pengecualian. 

Gunakan kembali instance klien yang sama untuk beberapa permintaan, tetapi panggil `close` klien ketika tidak lagi diperlukan untuk melepaskan sumber daya. Setelah metode close dipanggil, instance klien tidak dapat digunakan lagi.

### Mengurai tanggapan
<a name="examples-ec2-IMDS-use-pares"></a>

Metadata instans EC2 dapat menjadi output dalam format yang berbeda. Teks biasa dan JSON adalah format yang paling umum digunakan. Klien metadata menawarkan cara untuk bekerja dengan format tersebut. 

Seperti contoh berikut menunjukkan, menggunakan `asString` metode untuk mendapatkan data sebagai string Java. Anda juga dapat menggunakan `asList` metode ini untuk memisahkan respons teks biasa yang mengembalikan beberapa baris. 

```
Ec2MetadataClient client = Ec2MetadataClient.create();
Ec2MetadataResponse response = client.get("/latest/meta-data/");
String fullResponse = response.asString();
List<String> splits = response.asList();
```

Jika respon dalam JSON, gunakan `Ec2MetadataResponse#asDocument` metode untuk mengurai respon JSON ke dalam contoh [Dokumen](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/document/Document.html) seperti yang ditunjukkan dalam cuplikan kode berikut.

```
Document fullResponse = response.asDocument();
```

Pengecualian akan dilemparkan jika format metadata tidak ada di JSON. Jika respons berhasil diuraikan, Anda dapat menggunakan [API dokumen](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/document/package-summary.html) untuk memeriksa respons secara lebih rinci. Lihat [bagan kategori metadata instance untuk mempelajari kategori](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-categories.html) metadata mana yang memberikan respons berformat JSON.

## Konfigurasikan klien metadata
<a name="examples-ec2-IMDS-config"></a>

### Percobaan ulang
<a name="examples-ec2-IMDS-config-retries"></a>

Anda dapat mengonfigurasi klien metadata dengan mekanisme coba lagi. Jika Anda melakukannya, maka klien dapat secara otomatis mencoba kembali permintaan yang gagal karena alasan yang tidak terduga. Secara default, klien mencoba ulang tiga kali pada permintaan yang gagal dengan waktu backoff eksponensial di antara upaya.

Jika kasus penggunaan Anda memerlukan mekanisme coba lagi yang berbeda, Anda dapat menyesuaikan klien menggunakan `retryPolicy` metode pada pembuatnya. Misalnya, contoh berikut menunjukkan klien sinkron yang dikonfigurasi dengan penundaan tetap dua detik antara upaya dan lima upaya coba lagi.

```
BackoffStrategy fixedBackoffStrategy = FixedDelayBackoffStrategy.create(Duration.ofSeconds(2));
Ec2MetadataClient client =
    Ec2MetadataClient.builder()
                     .retryPolicy(retryPolicyBuilder -> retryPolicyBuilder.numRetries(5)
                                                                           .backoffStrategy(fixedBackoffStrategy))
                     .build();
```

Ada beberapa [BackoffStrategies](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/retry/backoff/package-summary.html)yang dapat Anda gunakan dengan klien metadata.

Anda juga dapat menonaktifkan mekanisme coba lagi sepenuhnya, seperti yang ditunjukkan cuplikan berikut.

```
Ec2MetadataClient client =
    Ec2MetadataClient.builder()
                    .retryPolicy(Ec2MetadataRetryPolicy.none())
                    .build();
```

Menggunakan `Ec2MetadataRetryPolicy#none()` menonaktifkan kebijakan coba ulang default sehingga klien metadata tidak mencoba lagi.

### Versi IP
<a name="examples-ec2-IMDS-config-ipversion"></a>

Secara default, klien metadata menggunakan titik IPV4 akhir di. `http://169.254.169.254` Untuk mengubah klien untuk menggunakan IPV6 versi, gunakan salah satu `endpointMode` atau `endpoint` metode pembangun. Hasil pengecualian jika kedua metode dipanggil pada pembangun.

Contoh berikut menunjukkan kedua IPV6 opsi.

```
Ec2MetadataClient client =
    Ec2MetadataClient.builder()
                     .endpointMode(EndpointMode.IPV6)
                     .build();
```

```
Ec2MetadataClient client =
    Ec2MetadataClient.builder()
                     .endpoint(URI.create("http://[fd00:ec2::254]"))
                     .build();
```

## Fitur utama
<a name="examples-ec2-IMDS-features"></a>

### Klien asinkron
<a name="examples-ec2-IMDS-features-async"></a>

Untuk menggunakan versi klien yang tidak memblokir, buat instance kelas. `Ec2MetadataAsyncClient` Kode dalam contoh berikut membuat klien asinkron dengan pengaturan default dan menggunakan `get` metode untuk mengambil nilai untuk kunci. `ami-id`

```
Ec2MetadataAsyncClient asyncClient = Ec2MetadataAsyncClient.create();
CompletableFuture<Ec2MetadataResponse> response = asyncClient.get("/latest/meta-data/ami-id");
```

Yang `java.util.concurrent.CompletableFuture` dikembalikan oleh `get` metode selesai ketika respon kembali. Contoh berikut mencetak `ami-id` metadata ke konsol.

```
response.thenAccept(metadata -> System.out.println(metadata.asString()));
```

### Klien HTTP yang dapat dikonfigurasi
<a name="examples-ec2-IMDS-features-http"></a>

Builder untuk setiap klien metadata memiliki `httpClient` metode yang dapat Anda gunakan untuk menyediakan klien HTTP yang disesuaikan. 

Contoh berikut menunjukkan kode untuk `UrlConnectionHttpClient` contoh kustom.

```
SdkHttpClient httpClient =
    UrlConnectionHttpClient.builder()
                           .socketTimeout(Duration.ofMinutes(5))
                           .proxyConfiguration(proxy -> proxy.endpoint(URI.create("http://proxy.example.net:8888"))))
                           .build();
Ec2MetadataClient metaDataClient =
    Ec2MetadataClient.builder()
                     .httpClient(httpClient)
                     .build();
// Use the metaDataClient instance.
metaDataClient.close();   // Close the instance when no longer needed.
```

Contoh berikut menunjukkan kode untuk `NettyNioAsyncHttpClient` instance kustom dengan klien metadata asinkron.

```
SdkAsyncHttpClient httpAsyncClient = 
    NettyNioAsyncHttpClient.builder()
                           .connectionTimeout(Duration.ofMinutes(5))
                           .maxConcurrency(100)
                           .build();
Ec2MetadataAsyncClient asyncMetaDataClient =
    Ec2MetadataAsyncClient.builder()
                          .httpClient(httpAsyncClient)
                          .build();
// Use the asyncMetaDataClient instance.
asyncMetaDataClient.close();   // Close the instance when no longer needed.
```

[Konfigurasikan klien HTTP di AWS SDK for Java 2.x](http-configuration.md)Topik dalam panduan ini memberikan rincian tentang cara mengkonfigurasi klien HTTP yang tersedia di SDK for Java.

### Caching token
<a name="examples-ec2-IMDS-features-token"></a>

Karena klien metadata menggunakan IMDSv2, semua permintaan dikaitkan dengan sesi. Sesi ditentukan oleh token yang memiliki kedaluwarsa, yang dikelola klien metadata untuk Anda. Setiap permintaan metadata secara otomatis menggunakan kembali token hingga kedaluwarsa. 

Secara default, token berlangsung selama enam jam (21.600 detik). Kami menyarankan Anda untuk mempertahankan time-to-live nilai default, kecuali kasus penggunaan khusus Anda memerlukan konfigurasi lanjutan. 

Jika diperlukan, konfigurasikan durasinya dengan menggunakan metode `tokenTtl` builder. Misalnya, kode dalam cuplikan berikut membuat klien dengan durasi sesi lima menit. 

```
Ec2MetadataClient client =
    Ec2MetadataClient.builder()
                     .tokenTtl(Duration.ofMinutes(5))
                     .build();
```

Jika Anda menghilangkan pemanggilan `tokenTtl` metode pada builder, durasi default 21.600 digunakan sebagai gantinya. 