

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Autenticação com a API REST do Slurm no PCS AWS
<a name="slurm-rest-api-authenticate"></a>

A API REST do Slurm no AWS PCS usa a autenticação JSON Web Token (JWT) para garantir acesso seguro aos recursos do cluster. AWS O PCS fornece uma chave de assinatura gerenciada armazenada no AWS Secrets Manager, que você usa para gerar tokens JWT contendo declarações de identidade de usuário específicas.

## Pré-requisitos
<a name="slurm-rest-api-authenticate-prerequisites"></a>

Antes de se autenticar com a API REST do Slurm, verifique se você tem:
+ **Configuração de cluster**: cluster AWS PCS com Slurm 25.05\$1 e API REST habilitada.
+ **Permissões da AWS**: acesso ao AWS Secrets Manager para a chave de assinatura do JWT.
+ **Informações do usuário**: nome de usuário, ID de usuário POSIX e um ou mais grupos POSIX IDs para sua conta de cluster.
+ **Acesso à rede**: conectividade na VPC do seu cluster com o grupo de segurança que permite a porta 6820.

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

**Para recuperar o endereço do endpoint da API Slurm REST**

------
#### [ Console de gerenciamento da AWS ]

1. Abra o console AWS PCS em [https://console.aws.amazon.com/pcs/](https://console.aws.amazon.com/pcs/).

1. Escolha seu cluster na lista.

1. Nos detalhes da configuração do cluster, localize a seção **Endpoints**.

1. Observe o endereço IP privado e a porta da **API REST do Slurm (slurmrestd**).

1. Você pode fazer chamadas de API enviando solicitações HTTP formatadas corretamente para esse endereço.

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

1. Consulte o status do seu cluster com`aws pcs get-cluster`. Procure o `SLURMRESTD` endpoint no `endpoints` campo na resposta. Exemplo:

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

1. Você pode fazer chamadas de API enviando solicitações HTTP formatadas corretamente para `http://<privateIpAddress>:<port>/`

------

**Para recuperar a chave de assinatura do JWT**

1. Abra o console AWS PCS em [https://console.aws.amazon.com/pcs/](https://console.aws.amazon.com/pcs/).

1. Escolha seu cluster na lista.

1. Nos detalhes da configuração do cluster, localize a seção **Autenticação do Agendador**.

1. Observe o **ARN e a versão da chave JSON Web Token (JWT)**.

1. Use o AWS CLI para recuperar a chave de assinatura do Secrets Manager:

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

**Para gerar um token JWT**

1. Crie um JWT com as seguintes reivindicações obrigatórias:
   + `exp`— Tempo de expiração em segundos desde 1970 para o JWT
   + `iat`— Tempo atual em segundos desde 1970
   + `sun`— O nome de usuário para autenticação
   + `uid`— O ID de usuário POSIX
   + `gid`— O ID do grupo POSIX
   + `id`— Propriedades adicionais de identidade POSIX
     + `gecos`— Campo de comentário do usuário, geralmente usado para armazenar um nome legível por humanos
     + `dir`— Diretório inicial do usuário
     + `shell`— Shell padrão do usuário
     + `gids`— Lista de grupos POSIX adicionais em IDs que o usuário está

1. Assine o JWT usando a chave de assinatura recuperada do Secrets Manager.

1. Defina um prazo de expiração apropriado para o token.

**nota**  
Como alternativa à `sun` reivindicação, você pode fornecer qualquer um dos seguintes:  
`username`
Um nome de campo personalizado que você define por `userclaimfield` meio do `AuthAltParameters Slurm custom settings`
Um `name` campo dentro da `id` reivindicação

**Para autenticar solicitações de API**

1. Inclua o token JWT em suas solicitações HTTP usando um destes métodos:
   + **Token do portador** — Adicionar `Authorization: Bearer <jwt>` cabeçalho
   + Cabeçalho **do Slurm — Adicionar cabeçalho** `X-SLURM-USER-TOKEN: <jwt>`

1. Faça solicitações HTTP para o endpoint da API REST:

   Aqui está um exemplo de como acessar a `/ping` API usando curl e o `Authorized: Bearer` cabeçalho.

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

## Exemplo de geração de JWT
<a name="slurm-rest-api-authenticate-example"></a>

Obtenha a chave de assinatura JWT do cluster AWS PCS e armazene-a como um arquivo local. Substitua os valores de **aws-region****,** secret-arn **e secret** version por valores apropriados para seu cluster.

```
#!/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
```

Este exemplo em Python ilustra como usar a chave de assinatura para gerar um 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)
```

O script imprimirá um JWT na tela.

```
abcdefgtjwttoken...
```