

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Jupyter Notebook 사용자 및 관리자 추가
<a name="emr-jupyterhub-user-access"></a>

두 가지 방법 중 하나를 사용하면 사용자가 JupyterHub에 인증하여 노트북을 생성할 수 있으며, 선택적으로 JupyterHub를 관리할 수도 있습니다. 가장 쉬운 방법은 JupyterHub의 플러그형 인증 모듈(PAM)을 사용하는 것입니다. 또한 Amazon EMR에 설치된 JupyterHub는 [JupyterHub용 LDAP 인증자 플러그인](https://github.com/jupyterhub/ldapauthenticator/)을 지원하여 Microsoft Active Directory 서버와 같은 LDAP 서버로부터 사용자 ID를 가져옵니다. 각 인증 방법을 사용하여 사용자를 추가하는 방법에 대한 지침과 예제는 본 섹션에서 제공됩니다.

Amazon EMR의 JupyterHub에는 관리자 권한이 있는 기본 사용자가 있습니다. 사용자 이름은 `jovyan`이고, 암호는 `jupyter`입니다. 이 사용자를 관리자 권한이 있는 다른 사용자로 바꾸는 것이 매우 권장됩니다. 클러스터를 생성할 때 단계를 사용하거나 클러스터를 실행할 때 마스터 노드에 연결하여 그렇게 할 수 있습니다.

**Topics**
+ [PAM 인증 사용](emr-jupyterhub-pam-users.md)
+ [LDAP 인증 사용](emr-jupyterhub-ldap-users.md)
+ [사용자 위장](emr-jupyterhub-user-impersonation.md)

# 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에서 사용자의 홈 디렉터리에 노트북 인스턴스를 만듭니다. 다음 섹션에서는 여러 사용자를 추가하는 기초적인 bash 스크립트를 따라 운영 체제 및 JupyterHub에 사용자를 개별적으로 추가하는 방법을 보여줍니다.

## 컨테이너에 운영 체제 사용자 추가
<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의 Admin 패널을 사용하면 사용자 및 관리자를 추가하는 방법**

1. SSH를 사용하여 마스터 노드에 연결하고 관리자 권한이 있는 ID를 사용하여 https://*MasterNodeDNS*:9443에 로그인합니다.

1. **제어판**, **Admin**을 선택합니다.

1. **사용자**, **사용자 추가**를 선택하거나 **Admin**, **Add Admins(Admin 추가)**를 선택합니다.

**REST API를 사용하여 사용자를 추가하려면**

1. SSH를 사용하여 마스터 노드에 연결하고 마스터 노드에서 다음 명령을 사용하거나 하나의 단계로 명령을 실행합니다.

1. API 요청을 만들 관리자 토큰을 획득하고 다음 단계의 *AdminToken*을 해당 토큰으로 바꿉니다.

1. 다음 명령을 사용하되, *UserName*을 컨테이너 내에서 생성된 운영 체제 사용자로 바꿉니다.

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

**참고**  
JupyterHub 웹 인터페이스에 처음 로그인하면 자동으로 관리자가 아닌 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"]
```

# LDAP 인증 사용
<a name="emr-jupyterhub-ldap-users"></a>

LDAP(Lightweight Directory Access Protocol)는 Active Directory 또는 OpenLDAP 서버와 같은 LDAP 호환 디렉터리 서비스 공급자에 저장된 사용자 및 컴퓨터와 같은 리소스에 해당하는 객체를 쿼리 및 수정하기 위한 애플리케이션 프로토콜입니다. Amazon EMR에서 JupyterHub와 함께 [JupyterHub용 LDAP 인증자 플러그인](https://github.com/jupyterhub/ldapauthenticator/)을 사용하여 사용자 인증에 LDAP를 사용할 수 있습니다. 이 플러그인은 LDAP 사용자용 로그인 세션을 처리하고 사용자 정보를 Jupyter에 제공합니다. 이렇게 하면 사용자가 LDAP 호환 서버에 저장된 자신의 ID에 대한 자격 증명을 사용하여 JupyterHub 및 노트북에 연결할 수 있습니다.

이 섹션의 단계에서는 다음 단계를 통해 JupyterHub용 LDAP 인증자 플러그인을 사용하여 LDAP를 설정 및 활성화하는 방법을 안내합니다. 마스터 노드 명령줄에 연결되어 있는 동안 단계를 수행해야 합니다. 자세한 내용은 [프라이머리 노드 및 노트북 서버에 연결](emr-jupyterhub-connect.md) 단원을 참조하십시오.

1. 호스트 IP 주소, 포트, 바인딩 이름 등과 같은 LDAP 서버에 대한 정보를 사용하여 LDAP 구성 파일을 생성합니다.

1. JupyterHub용 LDAP 인증자 플러그인을 활성화하도록 `/etc/jupyter/conf/jupyterhub_config.py`를 수정합니다.

1. `jupyterhub` 컨테이너 내에서 LDAP를 구성하는 스크립트를 생성하고 실행합니다.

1. 사용자용 LDAP를 조회한 다음, 해당 사용자를 위해 컨테이너 내에 홈 디렉터리를 생성합니다. JupyterHub를 사용하려면 노트북을 호스팅하는 홈 디렉터리가 있어야 합니다.

1. JupyterHub를 다시 시작하는 스크립트 실행

**중요**  
LDAP를 설정하기 전에, 네트워크 인프라를 테스트하여 LDAP 서버 및 클러스터 마스터 노드가 필요 시 통신할 수 있도록 합니다. TLS는 일반적으로 일반 TCP 연결을 통해 포트 389를 사용합니다. LDAP 연결에서 SSL을 사용하는 경우 SSL용 잘 알려진 TCP 포트는 636입니다.

## LDAP 구성 파일 생성
<a name="emr-jupyterhub-ldap-config"></a>

아래 예에서는 다음 자리 표시자 구성 값을 사용합니다. 이를 자신의 구현 상황에 맞는 파라미터로 바꿉니다.
+ LDAP 서버는 버전 3을 실행하고 있으며 포트 389에서 사용할 수 있습니다. 이 포트는 LDAP용 표준 비SSL 포트입니다.
+ 기본 고유 이름(DN)은 `dc=example, dc=org`입니다.

텍스트 편집기를 사용하여 다음과 유사한 내용으로 [ldap.conf](http://manpages.ubuntu.com/manpages/bionic/man5/ldap.conf.5.html) 파일을 생성합니다. LDAP 구현 상황에 적절한 값을 사용합니다. *host*를 LDAP 서버의 IP 주소 또는 확인 가능한 호스트 이름으로 바꿉니다.

```
base dc=example,dc=org
uri ldap://host
ldap_version 3
binddn cn=admin,dc=example,dc=org
bindpw admin
```

## JupyterHub용 LDAP 인증자 플러그인 활성화
<a name="emr-jupyterhub-ldap-plugin"></a>

텍스트 편집기를 사용하여 `/etc/jupyter/conf/jupyterhub_config.py` 파일을 수정하고 다음과 유사하게 [ldapauthenticator](https://github.com/jupyterhub/ldapauthenticator) 속성을 추가합니다. *host*를 LDAP 서버의 IP 주소 또는 확인 가능한 호스트 이름으로 바꿉니다. 이 예에서는 사용자 객체가 *people*이라는 조직 단위(OU) 내에 있으며 `ldap.conf`를 사용하여 앞에서 설정한 고유 이름 구성 요소를 사용한다고 가정합니다.

```
c.JupyterHub.authenticator_class = 'ldapauthenticator.LDAPAuthenticator'
c.LDAPAuthenticator.use_ssl = False
c.LDAPAuthenticator.server_address = 'host' 
c.LDAPAuthenticator.bind_dn_template = 'cn={username},ou=people,dc=example,dc=org'
```

## 컨테이너 내에서 LDAP 구성
<a name="emr-jupyterhub-ldap-container"></a>

텍스트 편집기를 사용하여 다음 콘텐츠가 포함된 bash 스크립트를 생성합니다.

```
#!/bin/bash

# Uncomment the following lines to install LDAP client libraries only if
# using Amazon EMR release version 5.14.0. Later versions install libraries by default.
# sudo docker exec jupyterhub bash -c "sudo apt-get update"
# sudo docker exec jupyterhub bash -c "sudo apt-get -y install libnss-ldap libpam-ldap ldap-utils nscd"
 
# Copy ldap.conf
sudo docker cp ldap.conf jupyterhub:/etc/ldap/
sudo docker exec jupyterhub bash -c "cat /etc/ldap/ldap.conf"
 
# configure nss switch
sudo docker exec jupyterhub bash -c "sed -i 's/\(^passwd.*\)/\1 ldap/g' /etc/nsswitch.conf"
sudo docker exec jupyterhub bash -c "sed -i 's/\(^group.*\)/\1 ldap/g' /etc/nsswitch.conf"
sudo docker exec jupyterhub bash -c "sed -i 's/\(^shadow.*\)/\1 ldap/g' /etc/nsswitch.conf"
sudo docker exec jupyterhub bash -c "cat /etc/nsswitch.conf"
 
# configure PAM to create home directories
sudo docker exec jupyterhub bash -c "echo 'session required        pam_mkhomedir.so skel=/etc/skel umask=077' >> /etc/pam.d/common-session"
sudo docker exec jupyterhub bash -c "cat /etc/pam.d/common-session"
 
# restart nscd service
sudo docker exec jupyterhub bash -c "sudo service nscd restart"
 
# Test
sudo docker exec jupyterhub bash -c "getent passwd"

# Install ldap plugin
sudo docker exec jupyterhub bash -c "pip install jupyterhub-ldapauthenticator"
```

스크립트를 마스터 노드에 저장한 다음 이를 마스터 노드 명령줄에서 실행합니다. 예를 들어, `configure_ldap_client.sh`라고 저장한 스크립트를 사용하여 파일을 실행 파일로 만듭니다.

```
chmod +x configure_ldap_client.sh
```

그런 다음 스크립트를 실행합니다.

```
./configure_ldap_client.sh
```

## Active Directory에 속성 추가
<a name="emr-jupyterhub-ldap-adproperties"></a>

데이터베이스에서 각 사용자를 찾고 적절한 항목을 만들려면, JupyterHub 도커 컨테이너에 Active Directory의 해당 사용자 객체에 대한 다음 UNIX 속성이 필요합니다. 자세한 내용은 [Clarification regarding the status of identity management for Unix (IDMU) and NIS server role in Windows Server 2016 technical preview and beyond](https://blogs.technet.microsoft.com/activedirectoryua/2016/02/09/identity-management-for-unix-idmu-is-deprecated-in-windows-server/) 기사의 *How do I continue to edit the GID/UID RFC 2307 attributes now that the Unix Attributes Plug-in is no longer available for the Active Directory Users and Computers MMC snap-in?* 섹션을 참조하세요.
+ `homeDirectory`

  사용자 홈 디렉터리의 위치이며 보통 `/home/username`입니다.
+ `gidNumber`

  다른 사용자가 아직 사용하지 않은 60000보다 큰 값입니다. 사용 중인 GID는 `etc/passwd` 파일에서 확인하세요.
+ `uidNumber`

  다른 그룹이 아직 사용하지 않은 60000보다 큰 값입니다. 사용 중인 UID는 `etc/group` 파일에서 확인하세요.
+ `uid`

  *username*과 같습니다.

## 사용자 홈 디렉터리 생성
<a name="emr-jupyterhub-ldap-directories"></a>

JupyterHub에서는 LDAP 사용자를 인증하고 인스턴스 데이터를 저장하기 위해 컨테이너 내에 홈 디렉터리가 있어야 합니다. 다음 예는 LDAP 디렉터리에 있는 두 명의 사용자 *shirley*와 *diego*를 보여줍니다.

첫 번째 단계는 다음 예에 표시된 대로 [ldapsearch](http://manpages.ubuntu.com/manpages/xenial/man1/ldapsearch.1.html)를 사용하여 각 사용자의 사용자 ID 및 그룹 ID 정보를 LDAP 서버에 조회하는 것입니다. 이때 *host*는 LDAP 서버의 IP 주소 또는 확인 가능한 호스트 이름으로 바꿉니다.

```
ldapsearch -x -H ldap://host \
 -D "cn=admin,dc=example,dc=org" \
 -w admin \
 -b "ou=people,dc=example,dc=org" \
 -s sub \
 "(objectclass=*)" uidNumber gidNumber
```

`ldapsearch`명령은 *shirley*와 *diego* 사용자를 위해 다음과 유사하게 표시되는 LDIF 형식 응답을 반환합니다.

```
# extended LDIF

# LDAPv3
# base <ou=people,dc=example,dc=org> with scope subtree
# filter: (objectclass=*)
# requesting: uidNumber gidNumber sn 

# people, example.org
dn: ou=people,dc=example,dc=org

# diego, people, example.org
dn: cn=diego,ou=people,dc=example,dc=org
sn: B
uidNumber: 1001
gidNumber: 100

# shirley, people, example.org
dn: cn=shirley,ou=people,dc=example,dc=org
sn: A
uidNumber: 1002
gidNumber: 100

# search result
search: 2
result: 0 Success

# numResponses: 4
# numEntries: 3
```

응답에서 획득한 정보로 컨테이너 내 명령을 실행하여 각 사용자의 일반 이름(`cn`)용 홈 디렉터리를 생성합니다. `uidNumber` 및 `gidNumber`를 사용하여 해당 사용자에 대한 홈 디렉터리용 소유권을 수정합니다. 다음 예시 명령은 사용자 *shirley*에 대해 이 작업을 수행합니다.

```
sudo docker container exec jupyterhub bash -c "mkdir /home/shirley"
sudo docker container exec jupyterhub bash -c "chown -R $uidNumber /home/shirley"
sudo docker container exec jupyterhub bash -c "sudo chgrp -R $gidNumber /home/shirley"
```

**참고**  
JupyterHub의 LDAP 인증자는 로컬 사용자 생성을 지원하지 않습니다. 자세한 내용은 [LDAP authenticator configuration note on local user creation](https://github.com/jupyterhub/ldapauthenticator#configuration-note-on-local-user-creation)을 참조하세요.  
로컬 사용자를 수동으로 생성하려면 다음 명령을 사용합니다.  

```
sudo docker exec jupyterhub bash -c "echo 'shirley:x:$uidNumber:$gidNumber::/home/shirley:/bin/bash' >> /etc/passwd"
```

## Jupyterhub 컨테이너 다시 시작
<a name="emr-jupyterhub-ldap-restart"></a>

`jupyterhub` 컨테이너를 다시 시작하려면 다음 명령을 실행합니다.

```
sudo docker stop jupyterhub
sudo docker start jupyterhub
```

# 사용자 위장
<a name="emr-jupyterhub-user-impersonation"></a>

Jupyter Notebook 내에서 실행되는 Spark 작업은 Amazon EMR에서 실행되는 동안 여러 애플리케이션을 통과합니다. 예를 들어 사용자가 Jupyter 내에서 실행하는 PySpark3 코드를 Sparkmagic이 수신하며, 이 Sparkmagic은 수신한 PySpark3 코드를 HTTP POST 요청을 사용하여 Livy로 제출합니다. 이때 Livy는 YARN을 사용해 클러스터에서 실행할 Spark 작업을 생성합니다.

기본적으로 이런 방식으로 제출된 YARN 작업은 최초로 작업을 시작한 사용자와 상관없이 사용자 `livy`로서 실행됩니다. *사용자 가장*을 설정함으로써 노트북 사용자의 사용자 ID 또한 YARN 작업과 관련된 사용자가 되도록 설정할 수 있습니다. 작업을 사용자 `shirley`와 연결된 `diego` 및 `livy` 모두로 시작한다기보다는, 각 사용자가 시작하는 작업이 각각 `shirley` 및 `diego`와 연결되는 것입니다. 이렇게 하면 Jupyter 사용량을 감사하고 조직 내에서 애플리케이션을 관리할 수 있습니다.

이러한 구성은 Sparkmagic의 Livy에 대한 호출이 인증되지 않는 경우에만 지원됩니다. 하둡 애플리케이션과 Livy 사이에 인증 또는 프록시 설정 계층을 제공하는 애플리케이션(Apache Knox Gateway 등)은 지원되지 않습니다. 이 섹션의 사용자 가장을 구성하는 단계는 JupyterHub와 Livy가 동일한 마스터 노드에서 실행되는 것을 가정했습니다. 애플리케이션에 별도의 클러스터가 있는 경우 Livy 마스터 노드에 HDFS 디렉터리가 생성되도록 [3단계: 사용자를 위한 HDFS 홈 디렉터리 생성](#Step3-UserImpersonation)을 수정할 필요가 있습니다.

**Topics**
+ [1단계: Livy 구성](#Step1-UserImpersonation)
+ [2단계: 사용자 추가](#Step2-UserImpersonation)
+ [3단계: 사용자를 위한 HDFS 홈 디렉터리 생성](#Step3-UserImpersonation)

## 1단계: Livy 구성
<a name="Step1-UserImpersonation"></a>

다음 예와 같이 클러스터를 생성하여 Livy 사용자 가장을 활성화할 때 `livy-conf` 및 `core-site` 구성 분류를 사용합니다. 구성 분류를 JSON으로 저장한 다음 클러스터를 생성할 때 참조하거나 구성 분류 인라인을 지정합니다. 자세한 내용은 [애플리케이션 구성](emr-configure-apps.md) 단원을 참조하십시오.

```
[
  {
    "Classification": "livy-conf",
    "Properties": {
      "livy.impersonation.enabled": "true"
    }
  },
  {
    "Classification": "core-site",
    "Properties": {
      "hadoop.proxyuser.livy.groups": "*",
      "hadoop.proxyuser.livy.hosts": "*"
    }
  }
]
```

## 2단계: 사용자 추가
<a name="Step2-UserImpersonation"></a>

PAM 또는 LDAP를 사용하여 JupyterHub 사용자를 추가합니다. 자세한 내용은 [PAM 인증 사용](emr-jupyterhub-pam-users.md) 및 [LDAP 인증 사용](emr-jupyterhub-ldap-users.md) 섹션을 참조하세요.

## 3단계: 사용자를 위한 HDFS 홈 디렉터리 생성
<a name="Step3-UserImpersonation"></a>

마스터 노드에 연결하여 사용자를 생성했습니다. 아직 마스터 노드에 연결된 상태에서 아래 콘텐츠를 복사하여 스크립트 파일에 저장합니다. 스크립트는 마스터 노드의 각 JupyterHub 사용자에게 HDFS 홈 디렉터리를 생성합니다. 스크립트는 사용자가 기본 관리자 사용자 ID, *jovyan*을 사용하는 것으로 가정합니다.

```
#!/bin/bash

CURL="curl --silent -k"
HOST=$(curl -s http://169.254.169.254/latest/meta-data/local-hostname)

admin_token() {
    local user=jovyan
    local pwd=jupyter
    local token=$($CURL https://$HOST:9443/hub/api/authorizations/token \
        -d "{\"username\":\"$user\", \"password\":\"$pwd\"}" | jq ".token")
    if [[ $token != null ]]; then
        token=$(echo $token | sed 's/"//g')
    else
        echo "Unable to get Jupyter API Token."
        exit 1
    fi
    echo $token
}

# Get Jupyter Admin token
token=$(admin_token)

# Get list of Jupyter users
users=$(curl -XGET -s -k https://$HOST:9443/hub/api/users \
 -H "Authorization: token $token" | jq '.[].name' | sed 's/"//g')

# Create HDFS home dir 
for user in ${users[@]}; 
do
 echo "Create hdfs home dir for $user"
 hadoop fs -mkdir /user/$user
 hadoop fs -chmod 777 /user/$user
done
```