

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

# Mengautentikasi dengan Slurm REST API di PCS AWS
<a name="slurm-rest-api-authenticate"></a>

Slurm REST API di AWS PCS menggunakan otentikasi JSON Web Token (JWT) untuk memastikan akses aman ke sumber daya cluster Anda. AWS PCS menyediakan kunci penandatanganan terkelola yang disimpan di AWS Secrets Manager, yang Anda gunakan untuk menghasilkan token JWT yang berisi klaim identitas pengguna tertentu.

## Prasyarat
<a name="slurm-rest-api-authenticate-prerequisites"></a>

Sebelum mengautentikasi dengan Slurm REST API, pastikan Anda memiliki:
+ **Konfigurasi cluster**: Cluster AWS PCS dengan Slurm 25.05\$1 dan REST API diaktifkan.
+ **Izin AWS**: Akses ke AWS Secrets Manager untuk kunci penandatanganan JWT.
+ **Informasi pengguna**: Nama pengguna, ID pengguna POSIX, dan satu atau lebih grup POSIX IDs untuk akun cluster Anda.
+ **Akses jaringan**: Konektivitas dalam VPC cluster Anda dengan grup keamanan yang memungkinkan port 6820.

## Prosedur
<a name="slurm-rest-api-authenticate-procedure"></a>

**Untuk mengambil alamat titik akhir Slurm REST API**

------
#### [ Konsol Manajemen AWS ]

1. Buka konsol AWS PCS di [https://console.aws.amazon.com/pcs/](https://console.aws.amazon.com/pcs/).

1. Pilih klaster Anda dari daftar.

1. Dalam detail konfigurasi cluster, cari bagian **Endpoints**.

1. Perhatikan alamat IP pribadi dan port untuk **Slurm REST API (slurmrestd**).

1. Anda dapat melakukan panggilan API dengan mengirimkan permintaan HTTP yang diformat dengan benar ke alamat ini.

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

1. Kueri status klaster Anda dengan`aws pcs get-cluster`. Cari `SLURMRESTD` titik akhir di `endpoints` bidang dalam respons. Inilah contohnya:

   ```
   "endpoints": [
         {
             "type": "SLURMCTLD",
             "privateIpAddress": "192.0.2.1",
             "port": "6817"
         },
         {
             "type": "SLURMRESTD",
             "privateIpAddress": "192.0.2.1",
             "port": "6820"
         }
     ]
   ```

1. Anda dapat melakukan panggilan API dengan mengirimkan permintaan HTTP yang diformat dengan benar `http://<privateIpAddress>:<port>/`

------

**Untuk mengambil kunci penandatanganan JWT**

1. Buka konsol AWS PCS di [https://console.aws.amazon.com/pcs/](https://console.aws.amazon.com/pcs/).

1. Pilih klaster Anda dari daftar.

1. Dalam detail konfigurasi cluster, cari bagian **Authentication Scheduler**.

1. Perhatikan **ARN dan versi kunci JSON Web Token (JWT)**.

1. Gunakan tombol AWS CLI untuk mengambil kunci penandatanganan dari Secrets Manager:

   ```
   aws secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:region:account:secret:name --version-id version
   ```

**Untuk menghasilkan token JWT**

1. Buat JWT dengan klaim wajib berikut:
   + `exp`— Waktu kedaluwarsa dalam hitungan detik sejak 1970 untuk JWT
   + `iat`— Waktu saat ini dalam hitungan detik sejak 1970
   + `sun`— Nama pengguna untuk otentikasi
   + `uid`— ID pengguna POSIX
   + `gid`— ID grup POSIX
   + `id`— Properti identitas POSIX tambahan
     + `gecos`— Kolom komentar pengguna, sering digunakan untuk menyimpan nama yang dapat dibaca manusia
     + `dir`— Direktori home pengguna
     + `shell`— Shell default pengguna
     + `gids`— Daftar grup POSIX tambahan IDs tempat pengguna berada

1. Tanda tangani JWT menggunakan kunci penandatanganan yang diambil dari Secrets Manager.

1. Tetapkan waktu kedaluwarsa yang sesuai untuk token.

**catatan**  
Sebagai alternatif untuk `sun` klaim, Anda dapat memberikan salah satu dari yang berikut:  
`username`
Nama bidang kustom yang Anda tentukan melalui `userclaimfield` di `AuthAltParameters Slurm custom settings`
`name`Bidang dalam `id` klaim

**Untuk mengautentikasi permintaan API**

1. Sertakan token JWT dalam permintaan HTTP Anda menggunakan salah satu metode berikut:
   + **Token pembawa** - Tambahkan header `Authorization: Bearer <jwt>`
   + **Slurm header - Tambahkan header** `X-SLURM-USER-TOKEN: <jwt>`

1. Buat permintaan HTTP ke titik akhir REST API:

   Berikut adalah contoh mengakses `/ping` API menggunakan curl dan header. `Authorized: Bearer`

   ```
   curl -X GET -H "Authorization: Bearer <jwt>" \
         http://<privateIpAddress>:6820/slurm/v0.0.43/ping
   ```

## Contoh generasi JWT
<a name="slurm-rest-api-authenticate-example"></a>

Ambil kunci penandatanganan JWT cluster AWS PCS dan simpan sebagai file lokal. Ganti nilai untuk **aws-region****, secret-arn,** **dan versi rahasia** dengan nilai yang sesuai untuk klaster Anda.

```
#!/bin/bash
SECRET_KEY=$(aws secretsmanager get-secret-value \
  --region aws-region \
  --secret-id secret-arn \
  --version-stage secret-version \
  --query 'SecretString' \
  --output text)
echo "$SECRET_KEY" | base64 --decode > jwt.key
```

Contoh Python ini menggambarkan cara menggunakan kunci penandatanganan untuk menghasilkan token JWT:

```
#!/usr/bin/env python3

import sys
import os
import pprint
import json
import time
from datetime import datetime, timedelta, timezone
from jwt import JWT
from jwt.jwa import HS256
from jwt.jwk import jwk_from_dict
from jwt.utils import b64decode,b64encode
if len(sys.argv) != 3:
    sys.exit("Usage: gen_jwt.py [jwt_key_file] [expiration_time_seconds]")
SIGNING_KEY = sys.argv[1]
EXPIRATION_TIME = int(sys.argv[2])
with open(SIGNING_KEY, "rb") as f:
    priv_key = f.read()
signing_key = jwk_from_dict({
    'kty': 'oct',
    'k': b64encode(priv_key)
})
message = {
    "exp": int(time.time() + EXPIRATION_TIME),
    "iat": int(time.time()),
    "sun": "ec2-user",
    "uid": 1000,
    "gid": 1000,
    "id": {
        "gecos": "EC2 User",
        "dir": "/home/ec2-user",
        "gids": [1000],
        "shell": "/bin/bash"
    }
}
a = JWT()
compact_jws = a.encode(message, signing_key, alg='HS256')
print(compact_jws)
```

Skrip akan mencetak JWT ke layar.

```
abcdefgtjwttoken...
```