

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 PAM 身分驗證
<a name="emr-jupyterhub-pam-users"></a>

在 Amazon EMR 的 JupyterHub 中建立 PAM 使用者的程序有兩個步驟。第一個步驟是將使用者新增到在主節點 `jupyterhub` 容器中執行的作業系統，並為每個使用者新增對應的使用者主目錄。第二個步驟是將這些作業系統使用者新增為 JupyterHub 使用者 – 這項程序在 JupyterHub 中稱為列入允許清單。在新增 JupyterHub 使用者後，他們可以連接到 JupyterHub URL 並提供他們的作業系統登入資料以進行存取。

當使用者登入時，JupyterHub 會為該使用者開啟筆記本伺服器執行個體，此執行個體儲存在該使用者的主節點主目錄，即 `/var/lib/jupyter/home/username`。如果筆記本伺服器執行個體不存在，JupyterHub 會在使用者的主目錄中產生筆記本執行個體。以下章節將示範如何個別將使用者新增到作業系統和 JupyterHub，接著是新增多個使用者的早期 bash 指令碼。

## 將作業系統使用者新增至容器
<a name="emr-jupyterhub-system-user"></a>

下列的範例會先在容器中使用 [useradd](https://linux.die.net/man/8/useradd) 指令，來新增一位使用者 diego，然後為該名使用者建立主目錄。第二個指令使用 [chpasswd](https://linux.die.net/man/8/chpasswd) 來為此使用者建立 diego 的密碼。當使用 SSH 連接時，命令在主節點命令列上執行。您也可以使用步驟執行這些命令，如 [提交步驟以進行管理](emr-jupyterhub-administer.md#emr-jupyterhub-administer-steps) 所述。

```
sudo docker exec jupyterhub useradd -m -s /bin/bash -N diego
sudo docker exec jupyterhub bash -c "echo diego:diego | chpasswd"
```

## 新增 JupyterHub 使用者
<a name="emr-jupyterhub-jupyterhub-user"></a>

您可以使用 JupyterHub 中的 **Admin (管理員)** 面板或 REST API，來新增使用者和管理員，或是只新增使用者。

**若要使用 JupyterHub 中的管理面板來新增使用者和管理員**

1. 使用 SSH 連線到主節點，並以具有管理者許可的身分登入 https://*MasterNodeDNS*:9443。

1. 選擇 **Control Panel (控制面板)**、**Admin (管理員)**。

1. 選擇 **User (使用者)**、**Add Users (新增使用者)**，或選擇 **Admin (管理員)**、**Add Admins (新增管理員)**。

**使用 REST API 新增使用者**

1. 使用 SSH 連接到主節點並使用下列主節點的命令，或將該命令做為步驟執行。

1. 取得管理字符以發出 API 請求，並將下列步驟中的 *AdminToken (AdminToken)* 換成該字符。

1. 使用下列的指令，將 *UserName (使用者名稱)* 換成在容器中建立的作業系統使用者。

   ```
   curl -XPOST -H "Authorization: token AdminToken" "https://$(hostname):9443/hub/api/users/UserName
   ```

**注意**  
在您首次登入 JupyterHub Web 介面時，系統會自動將您新增為 JupyterHub 非管理員使用者。

## 範例：新增多個使用者的 Bash 指令碼
<a name="emr-jupyterhub-script-multuser"></a>

以下的範例 bash 指令碼，和此章節之前欲建立多個 JupyterHub 使用者的步驟環環相扣。此指令碼可以直接在主節點上執行，也可以上傳至 Amazon S3，然後作為步驟執行。

該指令碼首先會建立一系列的使用者名稱，並使用 `jupyterhub token` 命令來建立預設管理員 jovyan 的 API 字符。然後，它會為每個使用者在 `jupyterhub` 容器中建立作業系統使用者，並個別指派等同於他們使用者名稱的初始密碼。最後，它會呼叫 REST API 操作以在 JupyterHub 建立每個使用者。它會傳遞之前在指令碼中產生的字符，並導入 REST 回應至 `jq` 以更輕鬆地檢視。

```
# Bulk add users to container and JupyterHub with temp password of username
set -x
USERS=(shirley diego ana richard li john mary anaya)
TOKEN=$(sudo docker exec jupyterhub /opt/conda/bin/jupyterhub token jovyan | tail -1)
for i in "${USERS[@]}"; 
do 
   sudo docker exec jupyterhub useradd -m -s /bin/bash -N $i
   sudo docker exec jupyterhub bash -c "echo $i:$i | chpasswd"
   curl -XPOST --silent -k https://$(hostname):9443/hub/api/users/$i \
 -H "Authorization: token $TOKEN" | jq
done
```

將此指令碼儲存至的 Amazon S3 中的位置，例如 `s3://amzn-s3-demo-bucket/createjupyterusers.sh`。然後，您可以使用 `script-runner.jar` 以將其做為步驟執行。

### 範例：在建立叢集 (AWS CLI) 時執行此指令碼
<a name="emr-jupyterhub-multuser-createcluster"></a>

**注意**  
包含 Linux 行接續字元 (\$1) 是為了提高可讀性。它們可以在 Linux 命令中移除或使用。對於 Windows，請將其移除或取代為插入符號 (^)。

```
aws emr create-cluster --name="MyJupyterHubCluster" --release-label emr-5.36.2 \
--applications Name=JupyterHub --log-uri s3://amzn-s3-demo-bucket/MyJupyterClusterLogs \
--use-default-roles --instance-type m5.xlarge --instance-count 2 --ec2-attributes KeyName=MyKeyPair \
--steps Type=CUSTOM_JAR,Name=CustomJAR,ActionOnFailure=CONTINUE,\
Jar=s3://region.elasticmapreduce/libs/script-runner/script-runner.jar,Args=["s3://amzn-s3-demo-bucket/createjupyterusers.sh"]
```

### 在現有叢集 (AWS CLI) 執行此指令碼
<a name="emr-jupyterhub-multuser-runningcluster"></a>

**注意**  
包含 Linux 行接續字元 (\$1) 是為了提高可讀性。它們可以在 Linux 命令中移除或使用。對於 Windows，請將其移除或取代為插入符號 (^)。

```
aws emr add-steps --cluster-id j-XXXXXXXX --steps Type=CUSTOM_JAR,\
Name=CustomJAR,ActionOnFailure=CONTINUE,\
Jar=s3://region.elasticmapreduce/libs/script-runner/script-runner.jar,Args=["s3://amzn-s3-demo-bucket/createjupyterusers.sh"]
```