PCS での Slurm REST API AWS を使用した認証 - AWS PCS

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

PCS での Slurm REST API AWS を使用した認証

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

前提条件

Slurm REST API で認証する前に、以下を確認してください。

  • クラスター設定: Slurm 25.05 以降と REST API が有効になっている AWS PCS クラスター。

  • AWS アクセス許可: JWT 署名キーの AWS Secrets Manager へのアクセス。

  • ユーザー情報: クラスターアカウントのユーザー名、POSIX ユーザー ID、および 1 つ以上の POSIX グループ IDs。

  • ネットワークアクセス: ポート 6820 を許可するセキュリティグループとのクラスターの VPC 内の接続。

手順

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

AWS マネジメントコンソール
  1. https://console.aws.amazon.com/pcs/ で AWS PCS コンソールを開きます。

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

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

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

  5. 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" } ]
  2. API コールを行うには、適切にフォーマットされた HTTP リクエストを に送信します。 http://<privateIpAddress>:<port>/

JWT 署名キーを取得するには
  1. https://console.aws.amazon.com/pcs/ で AWS PCS コンソールを開きます。

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

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

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

  5. を使用して 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のリスト

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

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

注記

sun クレームの代わりに、次のいずれかを指定できます。

  • username

  • userclaimfield の を介して定義するカスタムフィールド名 AuthAltParameters Slurm custom settings

  • id クレーム内のnameフィールド

API リクエストを認証するには
  1. 次のいずれかの方法を使用して、JWT トークンを HTTP リクエストに含めます。

    • ベアラートークンAuthorization: Bearer <jwt>ヘッダーの追加

    • Slurm ヘッダーX-SLURM-USER-TOKEN: <jwt>ヘッダーの追加

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

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

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

JWT 生成の例

PCS AWS クラスター JWT 署名キーを取得し、ローカルファイルとして保存します。aws-regionsecret-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...