

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS PCS での Slurm REST API を使用した認証
<a name="slurm-rest-api-authenticate"></a>

 AWS PCS の Slurm REST API は、JSON ウェブトークン (JWT) 認証を使用して、クラスターリソースへの安全なアクセスを確保します。 AWS PCS は AWS Secrets Manager に保存されているマネージド署名キーを提供します。これは、特定のユーザー ID クレームを含む JWT トークンを生成するために使用されます。

## 前提条件
<a name="slurm-rest-api-authenticate-prerequisites"></a>

Slurm REST API で認証する前に、以下を確認してください。
+ **クラスター設定**: Slurm 25.05 以降と REST API が有効になっている AWS PCS クラスター。
+ **AWS アクセス許可**: JWT 署名キーの AWS Secrets Manager へのアクセス。
+ **ユーザー情報**: クラスターアカウントのユーザー名、POSIX ユーザー ID、および 1 つ以上の POSIX グループ IDs。
+ **ネットワークアクセス**: ポート 6820 を許可するセキュリティグループとのクラスターの VPC 内の接続。

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

**Slurm REST API エンドポイントアドレスを取得するには**

------
#### [ AWS マネジメントコンソール ]

1. [https://console.aws.amazon.com/pcs/](https://console.aws.amazon.com/pcs/) で AWS PCS コンソールを開きます。

1. リストからクラスターを選択します。

1. クラスター設定の詳細で、**エンドポイント**セクションを見つけます。

1. **Slurm REST API (slurmrestd)** のプライベート IP アドレスとポートを書き留めます。

1. API コールを行うには、適切にフォーマットされた HTTP リクエストをこのアドレスに送信します。

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

1. でクラスターのステータスをクエリします`aws pcs get-cluster`。レスポンスの `endpoints`フィールドで`SLURMRESTD`エンドポイントを探します。以下がその例です。

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

1. API コールを行うには、適切にフォーマットされた HTTP リクエストを に送信します。 `http://<privateIpAddress>:<port>/`

------

**JWT 署名キーを取得するには**

1. [https://console.aws.amazon.com/pcs/](https://console.aws.amazon.com/pcs/) で AWS PCS コンソールを開きます。

1. リストからクラスターを選択します。

1. クラスター設定の詳細で、ス**ケジューラ認証**セクションを見つけます。

1. **JSON ウェブトークン (JWT) キー**の ARN とバージョンを書き留めます。

1. を使用して Secrets Manager から署名キー AWS CLI を取得します。

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

**JWT トークンを生成するには**

1. 次の必須クレームを使用して JWT を作成します。
   + `exp` – JWT の 1970 年以降の有効期限の秒単位
   + `iat` – 1970 年以降の現在の秒単位の時刻
   + `sun` – 認証のユーザー名
   + `uid` – POSIX ユーザー ID
   + `gid` – POSIX グループ ID
   + `id` – 追加の POSIX ID プロパティ
     + `gecos` – ユーザーコメントフィールド。多くの場合、人間が読める名前を保存するために使用されます。
     + `dir` – ユーザーのホームディレクトリ
     + `shell` – ユーザーのデフォルトシェル
     + `gids` – ユーザーが属する追加の POSIX グループ IDsのリスト

1. Secrets Manager から取得した署名キーを使用して JWT に署名します。

1. トークンの適切な有効期限を設定します。

**注記**  
`sun` クレームの代わりに、次のいずれかを指定できます。  
`username`
`userclaimfield` の を介して定義するカスタムフィールド名 `AuthAltParameters Slurm custom settings`
`id` クレーム内の`name`フィールド

**API リクエストを認証するには**

1. 次のいずれかの方法を使用して、JWT トークンを HTTP リクエストに含めます。
   + **ベアラートークン** – `Authorization: Bearer <jwt>`ヘッダーの追加
   + **Slurm ヘッダー** – `X-SLURM-USER-TOKEN: <jwt>`ヘッダーの追加

1. REST API エンドポイントに HTTP リクエストを行います。

   curl と `Authorized: Bearer`ヘッダーを使用して `/ping` API にアクセスする例を次に示します。

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

## JWT 生成の例
<a name="slurm-rest-api-authenticate-example"></a>

PCS AWS クラスター JWT 署名キーを取得し、ローカルファイルとして保存します。**aws-region**、**secret-arn**、シー**クレットバージョンの**値を、クラスターに適した値に置き換えます。

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

この Python の例は、署名キーを使用して 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)
```

スクリプトは JWT を画面に出力します。

```
abcdefgtjwttoken...
```