Dataproc 個人用クラスタ認証

Dataproc クラスタを作成するときに Dataproc 個人用クラスタ認証を有効にすると、クラスタ上のインタラクティブなワークロードをユーザー ID として安全に実行できるようになります。つまり、Cloud Storage などの他の Google Cloud リソースとのやり取りは、クラスタのサービス アカウントではなくユーザー自身として認証されます。

考慮事項

  • 個人用クラスタ認証を有効にしてクラスタを作成すると、クラスタは ユーザーのID でのみ使用できるようになります。他のユーザーは、クラスタでジョブを実行したり、クラスタ上のコンポーネント ゲートウェイのエンドポイントにアクセスしたりできなくなります。

  • 個人用クラスタ認証が有効になっているクラスタでは、SSH アクセスと Compute Engine の機能(クラスタ内のすべての VM の起動スクリプトなど)が使えなくなります。

  • 個人用クラスタ認証が有効になっているクラスタでは、クラスタ内で安全な通信を行うために Kerberos が自動的に有効になり、クラスタ上に構成されます。ただし、クラスタのすべての Kerberos ID は、同じユーザーとして Google Cloud リソースとやり取りします。

  • Dataproc 個人用クラスタ認証は現在、Dataproc ワークフローをサポートしていません。

  • Dataproc 個人y法クラスタ認証は、個人(人間の)ユーザーが実行するインタラクティブ ジョブのみを対象としています。長時間実行されるジョブとオペレーションでは、適切なサービス アカウント 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. ローカル ブラウザに URL をコピーして、Jupyter UI を起動します。
  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 Audit Logsをご覧ください)。

クリーンアップ

  1. Dataproc クラスタを削除します。
    gcloud dataproc clusters delete cluster-name --region=region