Dataproc 개인 클러스터 인증

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

고려사항

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

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

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

  • Dataproc 개인 클러스터 인증은 현재 Dataproc 워크플로를 지원하지 않습니다.

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

  • 전파된 사용자 인증 정보는 사용자 인증 정보 액세스 경계를 통해 권한이 축소됩니다. 기본 액세스 경계는 클러스터가 포함된 동일 프로젝트에서 소유한 Cloud Storage 버킷의 Cloud Storage 객체 읽기 및 쓰기로 제한됩니다. enable_an_interactive_session을 사용할 때 기본이 아닌 액세스 경계를 정의할 수 있습니다.

목표

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

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

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

시작하기 전에

프로젝트 만들기

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. Dataproc API 사용 설정

    API 사용 설정

  5. Google Cloud CLI를 설치합니다.
  6. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

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

    프로젝트 선택기로 이동

  8. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  9. Dataproc API 사용 설정

    API 사용 설정

  10. Google Cloud CLI를 설치합니다.
  11. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init

환경 구성

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

Cloud Shell

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

로컬 터미널

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

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

  1. gcloud에서 활성 계정의 이메일 주소를 찾습니다.

    gcloud auth list --filter=status=ACTIVE --format="value(account)"
    

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

    gcloud dataproc clusters create cluster-name \
        --properties=dataproc:dataproc.personal-auth.user=your-email-address \
        --enable-component-gateway \
        --optional-components=ANACONDA,JUPYTER,ZEPPELIN \
        --region=region
    

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

    gcloud dataproc clusters enable-personal-auth-session \
        --region=region \
        cluster-name
    

    샘플 결과:

    Injecting initial credentials into the cluster cluster-name...done.
    Periodically refreshing credentials for cluster cluster-name. This will continue running until the command is interrupted...
    

    1. 권한이 축소된 액세스 경계 예시: 다음 예시에서는 권한이 축소된 기본 사용자 인증 정보 액세스 경계보다 더 제한적인 개인 인증 세션을 사용 설정합니다. Dataproc 클러스터의 스테이징 버킷에 대한 액세스를 제한합니다(자세한 내용은 사용자 인증 정보 액세스 경계를 사용하여 권한 축소 참조).
gcloud dataproc clusters enable-personal-auth-session \
    --project=PROJECT_ID \
    --region=REGION \
    --access-boundary=<(echo -n "{ \
  \"access_boundary\": { \
    \"accessBoundaryRules\": [{ \
      \"availableResource\": \"//storage.googleapis.com/projects/_/buckets/$(gcloud dataproc clusters describe --project=PROJECT_ID --region=REGION CLUSTER_NAME --format="value(config.configBucket)")\", \
      \"availablePermissions\": [ \
        \"inRole:roles/storage.objectViewer\", \
        \"inRole:roles/storage.objectCreator\", \
        \"inRole:roles/storage.objectAdmin\", \
        \"inRole:roles/storage.legacyBucketReader\" \
      ] \
    }] \
  } \
}") \
   CLUSTER_NAME
  1. 명령어를 계속 실행하고 새 Cloud Shell 탭 또는 터미널 세션으로 전환합니다. 클라이언트는 명령어가 실행 중일 때 사용자 인증 정보를 새로고침합니다.

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

다음 예시에서는 권한이 축소된 사용자 인증 정보 액세스 경계가 있는 클러스터를 만듭니다.

클러스터에서 Jupyter에 액세스

gcloud

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

    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"
      }
      ]
      

Console

  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. Jupyter 터미널에서 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-name/rose.txt
      
      [
      {
      "email": "$USER",
      "entity": "user-$USER",
      "role": "OWNER"
      }
      ]
      

Jupyter에서 PySpark 작업 실행

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

    text_file = sc.textFile("gs://bucket-name/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 파일을 읽을 수 있습니다.

    또한 Cloud Storage 버킷 감사 로그를 확인하여 작업이 해당 ID로 Cloud Storage에 액세스하는지 확인할 수 있습니다(자세한 내용은 Cloud Storage에서 Cloud 감사 로그 사용 참조).

삭제

  1. Dataproc 클러스터를 삭제합니다.
    gcloud dataproc clusters delete cluster-name --region=region