Dataproc 개인 클러스터 인증

Dataproc 클러스터를 만들 때 Dataproc 개인 클러스터 인증을 사용 설정하여 클러스터의 대화형 워크로드를 최종 사용자 ID로 안전하게 실행할 수 있습니다. 즉, Cloud Storage와 같은 다른 Google Cloud 리소스와의 상호작용은 클러스터 서비스 계정이 아닌 사용자 본인으로 인증됩니다.

고려사항

  • 개인 클러스터 인증이 사용 설정된 클러스터를 만들면 클러스터는 사용자의 ID로만 사용할 수 있습니다. 다른 사용자는 클러스터에서 작업을 실행하거나 클러스터의 구성요소 게이트웨이 엔드포인트에 액세스할 수 없습니다.

  • 개인 클러스터 인증이 사용 설정된 클러스터는 클러스터의 모든 VM에서 시작 스크립트 등의 Compute Engine 기능과 SSH 액세스를 차단합니다.

  • 개인 클러스터 인증이 사용 설정된 클러스터는 클러스터 내 보안 통신을 위해 클러스터에서 Kerberos를 자동으로 사용 설정하고 구성합니다. 그러나 클러스터의 모든 Kerberos ID는 동일한 최종 사용자로 Google Cloud 리소스와 상호작용합니다.

  • Dataproc 개인 클러스터 인증은 현재 Dataproc 워크플로를 지원하지 않으며 Dataproc Jobs API를 통해 제출된 작업은 계속해서 기본 '드라이버' 프로그램의 서비스 계정으로 인증됩니다. 하지만 작업자 작업에서 실행되는 코드는 최종 사용자 ID로 인증됩니다.

  • Dataproc 개인 클러스터 인증은 개별(사람) 사용자가 실행하는 대화형 작업에만 사용됩니다. 장기 실행 작업은 적절한 서비스 계정 ID를 구성하고 사용해야 합니다.

목표

  • Dataproc 개인 클러스터 인증이 사용 설정된 Dataproc 클러스터를 만듭니다.

  • 클러스터에 사용자 인증 정보 전파를 시작합니다.

  • 클러스터에서 Jupyter 메모장을 사용하여 사용자 인증 정보로 인증하는 Spark 작업을 실행합니다.

시작하기 전에

프로젝트 만들기

  1. Google 계정으로 로그인합니다.

    아직 계정이 없으면 새 계정을 등록하세요.

  2. Cloud Console의 프로젝트 선택기 페이지에서 Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기 페이지로 이동

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  4. Dataproc API를 사용 설정합니다.

    API 사용 설정

  5. Cloud SDK 설치 및 초기화

환경 구성

Cloud Shell 또는 로컬 터미널에서 환경을 구성합니다.

Cloud Shell

  1. Cloud Shell 세션을 시작합니다.

  2. Dataproc 개인 인증 클라이언트 도우미를 설치합니다.

    wget -O gcloud_dataproc_personal_cluster.py https://storage.googleapis.com/cloud-dataproc/tools/gcloud_dataproc_personal_cluster.py
    
    chmod +x gcloud_dataproc_personal_cluster.py
    

로컬 터미널

  1. Python 3.6 이상, google-authrequests Python 라이브러리를 설치합니다.

    sudo apt-get install python3-pip
    
    pip3 install google-auth
    
    pip3 install requests
    

  2. gcloud auth login을 실행하여 유효한 사용자 인증 정보를 가져옵니다.

  3. Dataproc 개인 인증 클라이언트 도우미를 설치합니다.

    wget -O gcloud_dataproc_personal_cluster.py https://storage.googleapis.com/cloud-dataproc/tools/gcloud_dataproc_personal_cluster.py
    
    chmod +x gcloud_dataproc_personal_cluster.py
    

클러스터를 만들고 대화형 세션 사용 설정

  1. 클러스터를 만듭니다.

    ./gcloud_dataproc_personal_cluster.py create  cluster-name \
        --optional-components=ANACONDA,JUPYTER,ZEPPELIN \
        --region=region
    

  2. Google Cloud 리소스와 상호작용할 때 개인 사용자 인증 정보를 사용할 수 있도록 클러스터의 사용자 인증 정보 전파 세션을 사용 설정합니다.

./gcloud_dataproc_personal_cluster.py enable-session \
    --region=region \
    cluster-name

다음과 비슷한 출력이 표시됩니다.

Enabling session...
Found instance IDs: ['3967997218955957976', '3369851129530390232', '8339066009681630936']
Applying organization-level boundary with org id 172397083938
Refreshing token for instance_uuid 3967997218955957976...
Refreshing token for instance_uuid 3369851129530390232...
Refreshing token for instance_uuid 8339066009681630936...
  1. 명령어를 계속 실행하고 새 Cloud Shell 탭 또는 터미널 세션으로 전환합니다. 클라이언트는 명령어가 실행 중일 때 사용자 인증 정보를 새로고침합니다.

  2. 세션을 종료하려면 Ctrl-C를 입력합니다.

클러스터에서 Jupyter에 액세스

gcloud 명령어

  1. 클러스터 세부정보 가져오기
    gcloud dataproc clusters describe cluster-name
    

    Jupyter 웹 인터페이스 URL은 클러스터 세부정보에 나열됩니다.

    ...
    JupyterLab: https://UUID-dot-us-central1.dataproc.googleusercontent.com/jupyter/lab/
    ...
    
  2. Jupyter UI를 시작하려면 로컬 브라우저에 URL을 복사합니다.
  3. 개인 클러스터 인증이 성공했는지 확인합니다.
    1. Jupyter 터미널을 시작합니다.
    2. gcloud auth list를 실행합니다.
    3. 사용자 이름이 유일한 활성 계정인지 확인합니다.
  4. Jupyter 터미널에서 Jupyter를 사용 설정하여 Kerberos를 인증하고 Spark 작업을 제출합니다.
    kinit -kt /etc/security/keytab/dataproc.service.keytab dataproc/$(hostname -f)
    
    1. klist를 실행하여 Jupyter가 유효한 TGT를 받았는지 확인합니다.
  5. Juypter 터미널에서 gsutil을 사용하여 프로젝트의 Cloud Storage 버킷에 rose.txt 파일을 만듭니다.
    echo "A rose by any other name would smell as sweet" > /tmp/rose.txt
    

    gsutil cp /tmp/rose.txt gs://bucket-name/rose.txt
    
    1. 사용자 계정만 파일을 읽거나 쓸 수 있도록 파일을 비공개로 표시합니다. Jupyter는 Cloud Storage와 상호작용할 때 개인 사용자 인증 정보를 사용합니다.
      gsutil acl set private gs://bucket-name/rose.txt
      
    2. 비공개 액세스를 확인합니다.
      gsutil acl get gs://$BUCKET/rose.txt
      

      [
      {
      "email": "$USER",
      "entity": "user-$USER",
      "role": "OWNER"
      }
      ]
      

콘솔

  1. 구성요소 게이트웨이 Jupyter 링크를 클릭하여 Jupyter UI를 시작합니다.
  2. 개인 클러스터 인증이 성공했는지 확인합니다.
    1. Jupyter 터미널을 시작합니다.
    2. gcloud auth list를 실행합니다.
    3. 사용자 이름이 유일한 활성 계정인지 확인합니다.
  3. Jupyter 터미널에서 Jupyter를 사용 설정하여 Kerberos를 인증하고 Spark 작업을 제출합니다.
    kinit -kt /etc/security/keytab/dataproc.service.keytab dataproc/$(hostname -f)
    
    1. klist를 실행하여 Jupyter가 유효한 TGT를 받았는지 확인합니다.
  4. Juypter 터미널에서 gsutil을 사용하여 프로젝트의 Cloud Storage 버킷에 rose.txt 파일을 만듭니다.
    echo "A rose by any other name would smell as sweet" > /tmp/rose.txt
    

    gsutil cp /tmp/rose.txt gs://bucket-name/rose.txt
    
    1. 사용자 계정만 파일을 읽거나 쓸 수 있도록 파일을 비공개로 표시합니다. Jupyter는 Cloud Storage와 상호작용할 때 개인 사용자 인증 정보를 사용합니다.
      gsutil acl set private gs://bucket-name/rose.txt
      
    2. 비공개 액세스를 확인합니다.
      gsutil acl get gs://$BUCKET/rose.txt
      
      [
      {
      "email": "$USER",
      "entity": "user-$USER",
      "role": "OWNER"
      }
      ]
      

Jupyter에서 PySpark 작업 실행

  1. 폴더로 이동한 다음 PySpark 메모장을 만듭니다.
  2. 위에서 만든 rose.txt 파일을 대상으로 기본 워드카운트 작업을 실행합니다.

    text_file = sc.textFile("gs://$BUCKET/rose.txt")
    counts = text_file.flatMap(lambda line: line.split(" ")) \
             .map(lambda word: (word, 1)) \
             .reduceByKey(lambda a, b: a + b)
    print(counts.collect())
    

    Spark는 사용자 인증 정보로 실행되기 때문에 Cloud Storage에서 rose.txt 파일을 읽을 수 있습니다.

    'GCS 버킷' 감사 로그에서 작업이 ID로 Cloud Storage에 액세스하고 있는지 확인할 수도 있습니다.

삭제

  1. 대화형 세션을 종료합니다.

    ./gcloud_dataproc_personal_cluster.py disable-session \
        --region=region cluster-name
    

  2. Dataproc 클러스터를 삭제합니다.

    gcloud dataproc clusters delete cluster-name --region=region