

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# EKS での Amazon EMR 上のインタラクティブワークロードの実行
<a name="connect-emr-studio"></a>

*インタラクティブエンドポイント*は、Amazon EMR Studio を EKS での Amazon EMR に接続するゲートウェイです。これにより、インタラクティブワークロードを実行できます。EMR Studio でインタラクティブエンドポイントを使用すると、[Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/) や [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/gettingstartedguide/) などのデータストアにあるデータセットを使用してインタラクティブな分析を実行できます。

**ユースケース**
+ EMR スタジオ IDE エクスペリエンスを使用して ETL スクリプトを作成します。IDE はオンプレミスデータを取り込み、変換後に Amazon S3 に保存し、後で分析できるようにします。
+ ノートブックを使用してデータセットを調べ、データセットの異常を検出するように機械学習モデルをトレーニングします。
+ ビジネスダッシュボードなどの分析アプリケーションの日次レポートを生成するスクリプトを作成します。

**Topics**
+ [インタラクティブエンドポイントの概要](how-it-works.md)
+ [EKS での Amazon EMR でインタラクティブエンドポイントを作成するための前提条件](prereqs-for-studio.md)
+ [仮想クラスターのインタラクティブエンドポイントを作成する](create-managed-endpoint.md)
+ [インタラクティブエンドポイントの設定](managed-endpoint-parameters.md)
+ [インタラクティブエンドポイントのモニタリング](managed-endpoints-customer-metrics.md)
+ [セルフホスト型 Jupyter Notebook を使用する](managed-endpoints-self-hosted.md)
+ [CLI コマンドを使用したインタラクティブエンドポイントに関する情報の取得](other-operations.md)

# インタラクティブエンドポイントの概要
<a name="how-it-works"></a>

*インタラクティブエンドポイント*は、Amazon EMR Studio などのインタラクティブクライアントが EKS クラスター上の Amazon EMR に接続してインタラクティブワークロードを実行できるようにします。インタラクティブエンドポイントは、インタラクティブクライアントが必要とするリモートカーネルライフサイクル管理機能を提供する Jupyter Enterprise Gateway によって支えられています。*カーネル*は、Jupyter ベースの Amazon EMR Studio クライアントと相互作用してインタラクティブワークロードを実行する言語固有のプロセスです。

インタラクティブエンドポイントは、次のカーネルをサポートします。
+ Python 3
+ Kubernetes での PySpark
+ Scala を使用した Apache Spark

**注記**  
EKS での Amazon EMR の料金は、インタラクティブエンドポイントとカーネルに適用されます。詳細については、「[Amazon EMR on EKS pricing](https://aws.amazon.com/emr/pricing/#Amazon_EMR_on_Amazon_EKS)」のページを参照してください。

EMR Studio を EKS での Amazon EMR に接続するには、以下のエンティティが必要です。
+ **EKS での Amazon EMR 仮想クラスター** — *仮想クラスター*は、Amazon EMR を登録する際に使用する Kubernetes 名前空間です。Amazon EMR では、仮想クラスターを使用してジョブを実行し、エンドポイントをホストします。複数の仮想クラスターを同じ物理クラスターでバックアップできます。ただし、各仮想クラスターは Amazon EKS クラスター上の 1 つの名前空間にマッピングされます。仮想クラスターでは、請求に適用されるアクティブなリソースや、サービスの外部でライフサイクル管理を必要とするアクティブなリソースは作成されません。
+ **EKS での Amazon EMR のインタラクティブエンドポイント** — *インタラクティブエンドポイント*は、EMR Studio ユーザーがワークスペースに接続できる HTTPS エンドポイントです。HTTPS エンドポイントには EMR Studio からのみアクセスでき、Amazon EKS クラスターの Amazon Virtual Private Cloud (Amazon VPC) のプライベートサブネットにこれを作成します。

  Python、PySpark、および Spark Scala カーネルは、EKS での Amazon EMR ジョブ実行ロールで定義されたアクセス許可を使用して、他の AWS のサービスを呼び出します。インタラクティブエンドポイントに接続するすべてのカーネルとユーザーは、エンドポイントの作成時に指定したロールを使用します。ユーザーごとに個別のエンドポイントを作成し、ユーザーが異なる AWS Identity and Access Management (IAM) ロールを持つことをお勧めします。
+ **AWS Application Load Balancer コントローラー** – *AWS Application Load Balancer コントローラー*は、Amazon EKS Kubernetes クラスターの Elastic Load Balancing を管理します。コントローラーは、Kubernetes Ingress リソースを作成するときに、Application Load Balancer (ALB) をプロビジョニングします。ALB は、インタラクティブエンドポイントなどの Kubernetes サービスを Amazon EKS クラスターの外部に公開しますが、同じ Amazon VPC 内に公開します。インタラクティブエンドポイントを作成すると、インタラクティブクライアントが接続できるように ALB を使用してインタラクティブエンドポイントを公開する Ingress リソースもデプロイされます。Amazon EKS クラスターごとに 1 つの AWS Application Load Balancer コントローラーをインストールする必要があります。

次の図に、EKS での Amazon EMR のインタラクティブエンドポイントのアーキテクチャを示します。Amazon EKS クラスターは、分析ワークロードを実行する*コンピューティング*と*インタラクティブエンドポイント*で構成されます。Application Load Balancer コントローラーは `kube-system` 名前空間で実行されます。ワークロードとインタラクティブエンドポイントは、仮想クラスターの作成時に指定した名前空間で実行されます。インタラクティブエンドポイントを作成すると、EKS での Amazon EMR コントロールプレーンは Amazon EKS クラスターにインタラクティブエンドポイントデプロイを作成します。さらに、Application Load Balancer Ingress のインスタンスは AWS 、ロードバランサーコントローラーによって作成されます。Application Load Balancer は、EMR Studio などのクライアントが Amazon EMR クラスターに接続し、インタラクティブワークロードを実行するための外部インターフェイスを提供します。

![\[インタラクティブエンドポイントのアーキテクチャ図\]](http://docs.aws.amazon.com/ja_jp/emr/latest/EMR-on-EKS-DevelopmentGuide/images/emr-on-eks-managed-endpoints-architecture.png)


# EKS での Amazon EMR でインタラクティブエンドポイントを作成するための前提条件
<a name="prereqs-for-studio"></a>

このセクションでは、EMR Studio が EKS での Amazon EMR クラスターに接続してインタラクティブワークロードを実行するために使用できるインタラクティブエンドポイントを設定するための前提条件について説明します。

## AWS CLI
<a name="cli-installed"></a>

[「 の最新バージョンをインストールまたは更新する AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)」の手順に従って、 の最新バージョン AWS Command Line Interface () をインストールしますAWS CLI。

## eksctl のインストール
<a name="eksctl-install"></a>

最新バージョンの eksctl をインストールするには、「[kubectl をインストールする](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)」の手順を行います。Amazon EKS クラスターに Kubernetes バージョン 1.22 以降を使用している場合は、0.117.0 より大きいバージョンの eksctl を使用してください。

## Amazon EKS クラスター
<a name="eks-cluster"></a>

Amazon EKS クラスターを作成します。クラスターを EKS での Amazon EMR に仮想クラスターとして登録します。このクラスターの要件と考慮事項は次のとおりです。
+ クラスターは EMR Studio と同じ Amazon Virtual Private Cloud (VPC) 内にある必要があります。
+ クラスターには、インタラクティブエンドポイントの有効化、Git ベースのリポジトリのリンク、および Application Load Balancer のプライベートモードでの起動のために、少なくとも 1 つのプライベートサブネットが必要です。
+ EMR Studio と、仮想クラスターの登録に使用する Amazon EKS クラスターの間に少なくとも 1 つの共通のプライベートサブネットが必要です。これにより、インタラクティブエンドポイントが Studio ワークスペースにオプションとして表示され、Studio から Application Load Balancer への接続が有効になります。

  Studio と Amazon EKS クラスターを接続するには、2 つの方法から選択できます。
  + Amazon EKS クラスターを作成し、EMR Studio に属するサブネットに関連付けます。
  + または、EMR Studio を作成し、Amazon EKS クラスターのプライベートサブネットを指定します。
+ Amazon EKS 最適化 ARM Amazon Linux AMI は、EKS での Amazon EMR インタラクティブエンドポイントではサポートされていません。
+ [Amazon EKS マネージドノードグループ](https://docs.aws.amazon.com/eks/latest/userguide/managed-node-groups.html)と Karpenter プロビジョニングノードのみがサポートされています。

## EKS での Amazon EMR のクラスターアクセスを許可する
<a name="emr-eks-cluster-virtual"></a>

「[EKS での Amazon EMR のクラスターアクセスを許可する](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/setting-up-cluster-access.html)」のステップを使用して、EKS での Amazon EMR にクラスター内の特定の名前空間へのアクセスを許可します。

## Amazon EKS クラスターでの IRSA の有効化
<a name="activate-iam-roles"></a>

Amazon EKS クラスターでサービスアカウント (IRSA) の IAM ロールを有効化するには、「[Enable IAM Roles for Service Accounts (IRSA)](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/setting-up-enable-IAM.html)」の手順に従ってください。

## IAM ジョブ実行ロールを作成する
<a name="iam-role"></a>

EKS での Amazon EMR インタラクティブエンドポイントでワークロードを実行するには、IAM ロールを作成する必要があります。このドキュメントでは、この IAM ロールを*ジョブ実行ロール*と呼びます。この IAM ロールは、インタラクティブエンドポイントコンテナと、EMR Studio でジョブを送信したときに作成される実際の実行コンテナの両方に割り当てられます。EKS での Amazon EMR のジョブ実行ロールの Amazon リソースネーム (ARN) が必要になります。これには次の 2 つのステップが必要です。
+ [ジョブ実行の IAM ロールを作成する。](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/creating-job-execution-role.html)
+ [ジョブ実行ロールの信頼ポリシーを更新する。](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/setting-up-trust-policy.html)

## Amazon EMR on EKS へのアクセス許可をユーザーに付与する
<a name="iam-permission"></a>

インタラクティブエンドポイントの作成のリクエストを行う IAM エンティティ (ユーザーまたはロール) には、次の Amazon EC2 および `emr-containers` アクセス権限も必要です。「[Amazon EMR on EKS へのアクセス許可をユーザーに付与する](setting-up-iam.md)」で説明した手順に従って、EKS での Amazon EMR が、インタラクティブエンドポイントのロードバランサーへのインバウンドトラフィックを制限するセキュリティグループを作成、管理、および削除できるようにするアクセス権限を付与します。

以下の `emr-containers` アクセス権限により、ユーザーは基本的なインタラクティブエンドポイントオペレーションを実行できます。

```
"ec2:CreateSecurityGroup",
"ec2:DeleteSecurityGroup",
"ec2:AuthorizeSecurityGroupEgress",
"ec2:AuthorizeSecurityGroupIngress",
"ec2:RevokeSecurityGroupEgress",
"ec2:RevokeSecurityGroupIngress"

"emr-containers:CreateManagedEndpoint",
"emr-containers:ListManagedEndpoints",
"emr-containers:DescribeManagedEndpoint",
"emr-containers:DeleteManagedEndpoint"
```

## Amazon EKS クラスターをAmazon EMR に登録する
<a name="register-eks-cluster"></a>

仮想クラスターを設定し、ジョブを実行する Amazon EKS クラスター内の名前空間にマッピングします。 AWS Fargate専用クラスターの場合は、Amazon EMR on EKS 仮想クラスターと Fargate プロファイルの両方に同じ名前空間を使用します。

EKS での Amazon EMR 仮想クラスターの設定の詳細については、「[Amazon EKS クラスターをAmazon EMR に登録する](setting-up-registration.md)」を参照してください。

## Amazon EKS クラスターへの Deploy AWS Load Balancer Controller
<a name="load-balancer-controller"></a>

Amazon EKS クラスターには AWS Application Load Balancer が必要です。Amazon EKS クラスターごとに 1 つの Application Load Balancer コントローラーを設定する必要があります。 AWS Application Load Balancer コントローラーの設定については、*「Amazon EKS* [ユーザーガイド」の AWS Load Balancer Controller アドオン](https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html)のインストール」を参照してください。

# 仮想クラスターのインタラクティブエンドポイントを作成する
<a name="create-managed-endpoint"></a>

このトピックでは、 コマンドラインインターフェイス (AWS CLI) AWS を使用してインタラクティブエンドポイントを作成するいくつかの方法と、使用可能な設定パラメータの詳細について説明します。

## `create-managed-endpoint` コマンドでインタラクティブエンドポイントを作成する
<a name="create-using-json-file"></a>

次のように `create-managed-endpoint` コマンドでパラメータを指定します。EKS での Amazon EMR は、Amazon EMR リリース 6.7.0 以降でのインタラクティブエンドポイントの作成をサポートしています。

```
aws emr-containers create-managed-endpoint \
‐‐type JUPYTER_ENTERPRISE_GATEWAY \
‐‐virtual‐cluster‐id 1234567890abcdef0xxxxxxxx \
‐‐name example-endpoint-name \
‐‐execution-role-arn arn:aws:iam::444455556666:role/JobExecutionRole \
‐‐release-label emr-6.9.0-latest \
‐‐configuration-overrides '{
    "applicationConfiguration": [{
        "classification": "spark-defaults",
        "properties": {
            "spark.driver.memory": "2G"
        }
    }],
    "monitoringConfiguration": {
        "cloudWatchMonitoringConfiguration": {
            "logGroupName": "log_group_name",
            "logStreamNamePrefix": "log_stream_prefix"
        },
        "persistentAppUI": "ENABLED",
        "s3MonitoringConfiguration": {
            "logUri": "s3://my_s3_log_location"
        }
    }
}'
```

詳細については、「[インタラクティブエンドポイントを作成するためのパラメータ](#parameters-for-creating)」を参照してください。

## JSON ファイルで指定されたパラメータを使用してインタラクティブエンドポイントを作成する
<a name="create-using-json-file-B"></a>

1. `create-managed-endpoint-request.json` ファイルを作成し、次の JSON ファイルに示すように、エンドポイントに必要なパラメータを指定します。

   ```
   {
       "name": "MY_TEST_ENDPOINT",
       "virtualClusterId": "MY_CLUSTER_ID",
       "type": "JUPYTER_ENTERPRISE_GATEWAY",
       "releaseLabel": "emr-6.9.0-latest",
       "executionRoleArn": "arn:aws:iam::444455556666:role/JobExecutionRole",
       "configurationOverrides":
       {
           "applicationConfiguration": 
           [
               {
                   "classification": "spark-defaults",
                   "properties":
                   {
                       "spark.driver.memory": "8G"
                   }
               }
           ],
           "monitoringConfiguration":
           {
               "persistentAppUI": "ENABLED",
               "cloudWatchMonitoringConfiguration":
               {
                   "logGroupName": "my_log_group",
                   "logStreamNamePrefix": "log_stream_prefix"
               },
               "s3MonitoringConfiguration":
               {
                   "logUri": "s3://my_s3_log_location"
               }
           }
       }
   }
   ```

1. ローカルまたは Amazon S3 に保存されている `create-managed-endpoint-request.json` ファイルへのパスを指定して、`create-managed-endpoint` コマンドを使用します。

   ```
   aws emr-containers create-managed-endpoint \
   ‐‐cli-input-json  file://./create-managed-endpoint-request.json ‐‐region AWS-Region
   ```

## インタラクティブエンドポイントの作成の出力
<a name="create-managed-endpoint-output"></a>

ターミナルで、次の出力が表示されます。出力には、新しいインタラクティブエンドポイントの名前と ID が含まれます。

```
{
    "id": "1234567890abcdef0",
    "name": "example-endpoint-name", 
    "arn": "arn:aws:emr-containers:us-west-2:111122223333:/virtualclusters/444455556666/endpoints/444455556666",
    "virtualClusterId": "111122223333xxxxxxxx"
}
```

`aws emr-containers create-managed-endpoint` を実行すると、EMR Studio とインタラクティブエンドポイントサーバー間の HTTPS 通信を可能にする自己署名証明書が作成されます。

`create-managed-endpoint` を実行しても前提条件を満たしていない場合、Amazon EMR は続行するために必要なアクションを含むエラーメッセージを返します。

## インタラクティブエンドポイントを作成するためのパラメータ
<a name="parameters-for-creating"></a>

**Topics**
+ [インタラクティブエンドポイントの必須パラメータ](#parameters-for-creating-required)
+ [インタラクティブエンドポイントの任意指定のパラメータ](#parameters-for-creating-optional)

### インタラクティブエンドポイントの必須パラメータ
<a name="parameters-for-creating-required"></a>

インタラクティブエンドポイントを作成するときに次のパラメータを指定する必要があります。

**`‐‐type`**  
`JUPYTER_ENTERPRISE_GATEWAY` を使用します。これはサポートされている唯一のタイプです。

**`‐‐virtual-cluster-id`**  
EKS での Amazon EMR に登録した仮想クラスターの ID。

**`‐‐name`**  
EMR Studio ユーザーがドロップダウンリストから選択しやすいようにする、インタラクティブエンドポイントのわかりやすい名前。

**`‐‐execution-role-arn`**  
前提条件の一部として作成された EKS での Amazon EMR の IAM ジョブ実行 IAM ロールの Amazon リソースネーム (ARN)。

**`‐‐release-label`**  
エンドポイントに使用する Amazon EMR リリースのリリースラベル。例えば、`emr-6.9.0-latest`。EKS での Amazon EMR は、Amazon EMR リリース 6.7.0 以降でインタラクティブエンドポイントをサポートしています。

### インタラクティブエンドポイントの任意指定のパラメータ
<a name="parameters-for-creating-optional"></a>

インタラクティブエンドポイントを作成するときに、オプションで以下を指定することもできます。

**`‐‐configuration-overrides`**  
アプリケーションのデフォルト設定を上書きするには、設定オブジェクトを指定します。短縮構文を使用して、設定を指定したり、JSON ファイルの設定オブジェクトを参照したりできます。

設定オブジェクトは、分類、プロパティ、オプションの入れ子になっている設定で構成されます。プロパティは、そのファイル内で上書きする設定で構成されます。単一の JSON オブジェクトで、複数のアプリケーションに複数の分類を指定できます。EKS での Amazon EMR リリースによって使用可能な設定分類は異なります。EKS での Amazon EMR の各リリースで使用可能な設定分類の一覧については、「[Amazon EMR on EKS リリース](emr-eks-releases.md)」を参照してください。各リリースにリストされている設定分類に加えて、インタラクティブエンドポイントには追加の分類 `jeg-config` が組み込まれています。詳細については、「[Jupyter エンタープライズゲートウェイ (JEG) 設定オプション](jeg-config-options.md)」を参照してください。

# インタラクティブエンドポイントの設定
<a name="managed-endpoint-parameters"></a>

このセクションでは、インタラクティブエンドポイントとポッド設定のさまざまな設定をカバーする一連のトピックについて説明します。これにより、障害のモニタリングとトラブルシューティング、Amazon S3 または へのログ情報の送信 Amazon CloudWatch Logs、カスタムポッドテンプレートを指定するインタラクティブエンドポイントの作成を行うことができます。

**Topics**
+ [モニタリング Spark ジョブ](monitoring-spark-jobs.md)
+ [インタラクティブエンドポイントでカスタムポッドテンプレートを指定する](custom-pod-templates.md)
+ [JEG ポッドのノードグループへのデプロイ](managed-endpoint-nodegroups-setup.md)
+ [Jupyter エンタープライズゲートウェイ (JEG) 設定オプション](jeg-config-options.md)
+ [PySpark セッションパラメータの変更](modify-pyspark-parameters.md)
+ [インタラクティブエンドポイントを含むカスタムカーネルイメージ](custom-kernel.md)

# モニタリング Spark ジョブ
<a name="monitoring-spark-jobs"></a>

障害のモニタリングとトラブルシューティングをできるようにするには、エンドポイントで起動したジョブで Amazon S3、Amazon CloudWatch Logs、またはその両方にログ情報を送信できるようにインタラクティブエンドポイントを設定します。以下のセクションでは、EKS での Amazon EMR インタラクティブエンドポイントで起動した Spark ジョブの Amazon S3 へ Spark アプリケーションログを送信する方法について説明します。

**Amazon S3 ログ用の IAM ポリシーを設定する**

カーネルが Amazon S3 にログデータを送信できるようにするには、ジョブ実行ロールのアクセス権限ポリシーに次のアクセス権限を含める必要があります。*amzn-s3-demo-destination-bucket* をログ記録バケットの名前に置き換えます。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket",
        "arn:aws:s3:::amzn-s3-demo-bucket/*"
      ],
      "Sid": "AllowS3Putobject"
    }
  ]
}
```

------

**注記**  
EKS での Amazon EMR は、S3 バケットを作成することもできます。S3 バケットが利用できない場合は、IAM ポリシーに `s3:CreateBucket` アクセス権限を含めてください。

S3 バケットにログを送信するために必要なアクセス権限を実行ロールに付与すると、ログデータは次の Amazon S3 ロケーションに送信されます。これは、`s3MonitoringConfiguration` が `create-managed-endpoint` リクエストの `monitoringConfiguration` セクションで渡されるときに起こります。
+ **ドライバーログ** — `logUri/virtual-cluster-id/endpoints/endpoint-id/containers/spark-application-id/spark-application-id-driver/(stderr.gz/stdout.gz)`
+ **エグゼキュターログ** — `logUri/virtual-cluster-id/endpoints/endpoint-id/containers/spark-application-id/executor-pod-name-exec-<Number>/(stderr.gz/stdout.gz)`

**注記**  
EKS での Amazon EMR は、エンドポイントログを S3 バケットにアップロードしません。

# インタラクティブエンドポイントでカスタムポッドテンプレートを指定する
<a name="custom-pod-templates"></a>

ドライバーとエグゼキュター用のカスタムポッドテンプレートを指定するインタラクティブエンドポイントを作成できます。*ポッドテンプレート*は、各ポッドの実行方法を決定する仕様です。ポッドテンプレートファイルを使用して、Spark 構成でサポートされていないドライバーまたはエグゼキュターポッドの設定を定義できます。ポッドテンプレートは現在、Amazon EMR リリース 6.3.0 以降でサポートされています。

ポッドテンプレートの詳細については、「*Amazon EMR on EKS Development Guide*」の「[Using pod templates](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/pod-templates.html)」を参照してください。

次の例は、ポッドテンプレートを使用してインタラクティブエンドポイントを作成する方法を示しています。

```
aws emr-containers create-managed-endpoint \
    --type JUPYTER_ENTERPRISE_GATEWAY \
    --virtual-cluster-id virtual-cluster-id \
    --name example-endpoint-name \
    --execution-role-arn arn:aws:iam::aws-account-id:role/EKSClusterRole \
    --release-label emr-6.9.0-latest \
    --configuration-overrides '{
        "applicationConfiguration": [
        {
            "classification": "spark-defaults",
            "properties": {
                "spark.kubernetes.driver.podTemplateFile": "path/to/driver/template.yaml",
                "spark.kubernetes.executor.podTemplateFile": "path/to/executor/template.yaml"
            }
        }]
    }'
```

# JEG ポッドのノードグループへのデプロイ
<a name="managed-endpoint-nodegroups-setup"></a>

JEG (Jupyter Enterprise Gateway) ポッド配置は、特定のノードグループにインタラクティブエンドポイントをデプロイできるようにする機能です。この機能により、インタラクティブエンドポイントの `instance type` などの設定を行うことができます。

## マネージドノードグループに JEG ポッドを関連付ける
<a name="associate-jegpod-to-nodegroup"></a>

次の設定プロパティでは、JEG ポッドをデプロイする Amazon EKS クラスター上のマネージドノードグループの名前を指定できます。

```
//payload 
--configuration-overrides '{
      "applicationConfiguration": [
            {
                "classification": "endpoint-configuration",
                "properties": {
                    "managed-nodegroup-name": NodeGroupName
                }        
            }
        ] 
    }'
```

ノードグループには、ノードグループに含まれるすべてのノードに Kubernetes ラベル `for-use-with-emr-containers-managed-endpoint-ng=NodeGroupName` がアタッチされている必要があります。このタグを持つノードグループのすべてのノードをリストするには、次のコマンドを使用します。

```
kubectl get nodes --show-labels | grep for-use-with-emr-containers-managed-endpoint-ng=NodeGroupName
```

上記のコマンドの出力でマネージドノードグループの一部であるノードが返されない場合は、`for-use-with-emr-containers-managed-endpoint-ng=NodeGroupName` Kubernetes ラベルがアタッチされたノードがノードグループにありません。この場合、以下の手順に従って、そのラベルをノードグループ内のノードにアタッチします。

1. 次のコマンドを使用して、マネージドノードグループ `NodeGroupName` のすべてのノードに `for-use-with-emr-containers-managed-endpoint-ng=NodeGroupName` Kubernetes ラベルを追加します。

   ```
   kubectl label nodes --selector eks:nodegroup-name=NodeGroupName for-use-with-emr-containers-managed-endpoint-ng=NodeGroupName
   ```

1. 次のコマンドを使用して、ノードが正しくラベル付けされていることを確認します。

   ```
   kubectl get nodes --show-labels | grep for-use-with-emr-containers-managed-endpoint-ng=NodeGroupName
   ```

マネージドノードグループは Amazon EKS クラスターのセキュリティグループに関連付ける必要があります。通常、`eksctl` を使用してクラスターとマネージドノードグループを作成した場合にこれが当てはまります。これは、次の手順を使用して AWS コンソールで確認できます。

1. Amazon EKS コンソールでクラスターに移動します。

1. クラスターの [ネットワーキング] タブに移動し、クラスターセキュリティグループを書き留めます。

1. クラスターの [コンピューティング] タブに移動し、マネージドノードグループ名をクリックします。

1. マネージドノードグループの **[詳細]** タブで、前にメモしたクラスターセキュリティグループが **[セキュリティグループ]** に表示されていることを確認します。

マネージドノードグループが Amazon EKS クラスターセキュリティグループにアタッチされていない場合は、`for-use-with-emr-containers-managed-endpoint-sg=ClusterName/NodeGroupName` タグをノードグループのセキュリティグループにアタッチする必要があります。このタグをアタッチするには、次の手順を使用します。

1. Amazon EC2 コンソールに移動し、左側のナビゲーションペインで [セキュリティグループ] をクリックします。

1. チェックボックスをクリックして、マネージドノードグループのセキュリティグループを選択します。

1. **[タグ]** タブの **[タグの管理]** ボタンを使用してタグ `for-use-with-emr-containers-managed-endpoint-sg=ClusterName/NodeGroupName` を追加します。

## セルフマネージドノードグループに JEG ポッドを関連付ける
<a name="associate-jegpod-to-self-managed-nodegroup"></a>

次の設定プロパティでは、JEG ポッドがデプロイされる Amazon EKS クラスター上のセルフマネージドノードグループまたはアンマネージドノードグループの名前を指定できます。

```
//payload 
--configuration-overrides '{
      "applicationConfiguration": [
            {
                "classification": "endpoint-configuration",
                "properties": {
                    "self-managed-nodegroup-name": NodeGroupName
                }        
            }
        ] 
    }'
```

ノードグループには、ノードグループに含まれるすべてのノードに `for-use-with-emr-containers-managed-endpoint-ng=NodeGroupName` Kubernetes ラベルがアタッチされている必要があります。このタグを持つノードグループのすべてのノードをリストするには、次のコマンドを使用します。

```
kubectl get nodes --show-labels | grep for-use-with-emr-containers-managed-endpoint-ng=NodeGroupName
```

上記のコマンドの出力でセルフマネージドノードグループの一部であるノードが返されない場合は、`for-use-with-emr-containers-managed-endpoint-ng=NodeGroupName` Kubernetes ラベルがアタッチされたノードがノードグループにありません。この場合、以下の手順に従って、そのラベルをノードグループ内のノードにアタッチします。

1. `eksctl` を使用してセルフマネージドノードグループを作成した場合は、以下のコマンドを使用して、セルフマネージドノードグループ `NodeGroupName` のすべてのノードに `for-use-with-emr-containers-managed-endpoint-ng=NodeGroupName` Kubernetes ラベルを一度に追加します。

   ```
   kubectl label nodes --selector alpha.eksctl.io/nodegroup-name=NodeGroupName for-use-with-emr-containers-managed-endpoint-ng=NodeGroupName
   ```

   セルフマネージドノードグループの作成に `eksctl` を使用しなかった場合は、上記のコマンドのセレクターを、ノードグループのすべてのノードにアタッチされている別の Kubernetes ラベルに置き換える必要があります。

1. 次のコマンドを使用して、ノードが正しくラベル付けされていることを確認します。

   ```
   kubectl get nodes --show-labels | grep for-use-with-emr-containers-managed-endpoint-ng=NodeGroupName
   ```

セルフマネージドノードグループのセキュリティグループには `for-use-with-emr-containers-managed-endpoint-sg=ClusterName/NodeGroupName` タグがアタッチされている必要があります。次の手順に従って、 AWS マネジメントコンソールからセキュリティグループにタグをアタッチします。

1. Amazon EC2 コンソールに移動します。左側のナビゲーションペインで **[セキュリティグループ]** を選択します。

1. セルフマネージドノードグループのセキュリティグループの横にあるチェックボックスをオンにします。

1. **[タグ]** タブの **[タグの管理]** ボタンを使用してタグ `for-use-with-emr-containers-managed-endpoint-sg=ClusterName/NodeGroupName` を追加します。`ClusterName` と `NodeGroupName` を適切な値に置き換えます。

## オンデマンドインスタンスがあるマネージドノードグループに JEG ポッドを関連付ける
<a name="associate-jegpod-to-on-demand-instances"></a>

*Kubernetes ラベルセレクター*と呼ばれる追加のラベルを定義して、特定のノードまたはノードグループでインタラクティブエンドポイントを実行するための追加の制約や制限を指定することもできます。次の例は、JEG ポッドにオンデマンド Amazon EC2 インスタンスを使用する方法を示しています。

```
--configuration-overrides '{
      "applicationConfiguration": [
            {
                "classification": "endpoint-configuration",
                "properties": {
                    "managed-nodegroup-name": NodeGroupName,
                    "node-labels": "eks.amazonaws.com/capacityType:ON_DEMAND"
                }        
            }
        ] 
    }'
```

**注記**  
`node-labels` プロパティは、`managed-nodegroup-name` または `self-managed-nodegroup-name` プロパティでのみ使用できます。

# Jupyter エンタープライズゲートウェイ (JEG) 設定オプション
<a name="jeg-config-options"></a>

EKS での Amazon EMR は Jupyter エンタープライズゲートウェイ (JEG) を使用してインタラクティブエンドポイントを有効にします。エンドポイントを作成するときに、許可リストに登録されている JEG 設定に次の値を設定できます。
+ **`RemoteMappingKernelManager.cull_idle_timeout`** — 秒単位 (整数) のタイムアウト。この時間が過ぎると、カーネルはアイドル状態になり、カリングできる状態になります。`0` 以下の値はカリングを無効にします。タイムアウトが短いと、ネットワーク接続が不十分なユーザーのカーネルがカリングされる可能性があります。
+ **`RemoteMappingKernelManager.cull_interval`** — カリングタイムアウト値を超えるアイドル状態のカーネルをチェックする秒単位の間隔 (整数)。

# PySpark セッションパラメータの変更
<a name="modify-pyspark-parameters"></a>

EKS での Amazon EMR リリース 6.9.0 以降、Amazon EMR Studio では EMR ノートブックセルで `%%configure` マジックコマンドを実行することで、PySpark セッションに関連付けられた Spark 設定を調整できるようになりました。

次の例は、Spark ドライバーとエグゼキュターのメモリ、コア、その他のプロパティを変更するために使用できるサンプルペイロードを示しています。`conf` 設定では、[Apache Spark の設定ドキュメント](https://spark.apache.org/docs/latest/configuration.html)で説明されている任意の Spark 設定を構成できます。

```
%%configure -f
{
  "driverMemory": "16G",
  "driverCores": 4,
  "executorMemory" : "32G",
  "executorCores": 2,
  "conf": {
     "spark.dynamicAllocation.maxExecutors" : 10,
     "spark.dynamicAllocation.minExecutors": 1
  }
}
```

次の例は、ファイル、pyFiles、および jar 依存関係を Spark ランタイムに追加するために使用できるサンプルペイロードを示しています。

```
%%configure -f
{
  "files": "s3://amzn-s3-demo-bucket-emr-eks/sample_file.txt",
  "pyFiles": : "path-to-python-files",
  "jars" : "path-to-jars
}
```

# インタラクティブエンドポイントを含むカスタムカーネルイメージ
<a name="custom-kernel"></a>

Amazon EMR Studio からインタラクティブワークロードを実行するときにアプリケーションに適切な依存関係があることを確認するには、インタラクティブエンドポイントの Docker イメージをカスタマイズし、カスタマイズされたベースカーネルイメージを実行します。インタラクティブエンドポイントを作成してカスタム Docker イメージに接続するには、以下の手順を実行します。

**注記**  
上書きできるのはベースイメージだけです。新しいカーネルイメージタイプを追加することはできません。

1. **カスタマイズした Docker イメージを作成して公開します。**ベースイメージには、Spark ランタイムと、Spark ランタイムで実行されるノートブックのカーネルが含まれています。イメージを作成するには、[Docker イメージをカスタマイズする方法](docker-custom-images-steps.md) のステップ 1～4 に従います。ステップ 1 では、Docker ファイル内のベースイメージ URI で、`notebook-spark` を `spark` の代わりに使用する必要があります。

   ```
   ECR-registry-account.dkr.ecr.Region.amazonaws.com/notebook-spark/container-image-tag
   ```

    AWS リージョン およびコンテナイメージタグの選択方法の詳細については、「」を参照してください[ベースイメージ URI の選択の詳細](docker-custom-images-tag.md)。

1. **カスタムイメージで使用できるインタラクティブエンドポイントを作成します。**

   1. 次の内容を含む JSON ファイル `custom-image-managed-endpoint.json` を作成します。この例では、Amazon EMR リリース 6.9.0 を使用します。  
**Example**  

      ```
      {
          "name": "endpoint-name",
          "virtualClusterId": "virtual-cluster-id",
          "type": "JUPYTER_ENTERPRISE_GATEWAY",
          "releaseLabel": "emr-6.9.0-latest",
          "executionRoleArn": "execution-role-arn",
          "configurationOverrides": {
              "applicationConfiguration": [
                  {
                      "classification": "jupyter-kernel-overrides",
                      "configurations": [
                          {
                              "classification": "python3",
                              "properties": {
                                  "container-image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/custom-notebook-python:latest"
                              }
                          },
                          {
                              "classification": "spark-python-kubernetes",
                              "properties": {
                                  "container-image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/custom-notebook-spark:latest"
                              }
                          }
                      ] 
                  }
              ]
          }
      }
      ```

   1. 次の例で示すように、JSON ファイルで指定された設定を使用してインタラクティブエンドポイントを作成します。詳細については、「[`create-managed-endpoint` コマンドでインタラクティブエンドポイントを作成する](create-managed-endpoint.md#create-using-json-file)」を参照してください。

      ```
      aws emr-containers create-managed-endpoint --cli-input-json custom-image-managed-endpoint.json
      ```

1. **EMR Studio 経由でインタラクティブエンドポイントに接続します。**詳細と完了する手順については、 AWS Workshop [Studio ドキュメントの Amazon EMR on EKS セクションの「Studio からの接続](https://emr-on-eks.workshop.aws/advanced/emr-studio/connecting-from-studio.html)」を参照してください。

# インタラクティブエンドポイントのモニタリング
<a name="managed-endpoints-customer-metrics"></a>

EKS での Amazon EMR 6.10 以降では、インタラクティブエンドポイントは、カーネルのライフサイクルオペレーションのモニタリングとトラブルシューティングのための Amazon CloudWatch メトリクスを生成します。メトリクスは、EMR Studio やセルフホストの Jupyter Notebook などのインタラクティブクライアントによってトリガーされます。インタラクティブエンドポイントがサポートする各操作には、メトリクスが関連付けられています。以下の表に示すように、操作は各メトリクスのディメンションとしてモデル化されます。インタラクティブエンドポイントによって生成されたメトリクスは、アカウントのカスタム名前空間 EMRContainers に表示されます。


| メトリクス | 説明 | Unit | 
| --- | --- | --- | 
|  RequestCount  |  インタラクティブエンドポイントによって処理されたオペレーションのリクエストの累積数。  |  カウント  | 
|  RequestLatency  |  リクエストがインタラクティブエンドポイントに到着し、インタラクティブエンドポイントからレスポンスが送信されるまでの時間。  |  ミリ秒  | 
|  4XXError  |  操作のリクエストが処理中に 4xx エラーになった場合に生成されます。  |  カウント  | 
|  5XXError  |  操作のリクエストが 5Xxx サーバー側エラーになった場合に生成されます。  |  カウント  | 
|  KernelLaunchSuccess  |  CreateKernel 操作にのみ適用されます。このリクエストを含む、このリクエストまでに成功したカーネル起動の累積数を示します。  |  カウント  | 
|  KernelLaunchFailure  |  CreateKernel 操作にのみ適用されます。このリクエストを含む、このリクエストまでに失敗したカーネル起動の累積数を示します。  |  カウント  | 

各インタラクティブエンドポイントメトリクスには、次のディメンションが関連付けられています。
+ **`ManagedEndpointId`**— インタラクティブエンドポイントの識別子 
+ **`OperationName`**— インタラクティブクライアントによってトリガーされる操作

**`OperationName`** ディメンションに指定できる値を次の表に示します。


| `operationName` | 操作の説明 | 
| --- | --- | 
|  `CreateKernel`  |  インタラクティブエンドポイントにカーネルの起動をリクエストします。  | 
|  `ListKernels`  |  インタラクティブエンドポイントに、同じセッショントークンを使用して以前に起動されたカーネルを一覧表示するようにリクエストします。  | 
|  `GetKernel`  |  インタラクティブエンドポイントに、以前に起動された特定のカーネルの詳細を取得するようにリクエストします。  | 
|  `ConnectKernel`  |  インタラクティブエンドポイントに、ノートブッククライアントとカーネル間の接続を確立するようにリクエストします。  | 
|  `ConfigureKernel`  |  pyspark カーネルで `%%configure magic request` を公開します。  | 
|  `ListKernelSpecs`  |  インタラクティブエンドポイントに、利用可能なカーネル仕様を一覧表示するようリクエストします。  | 
|  `GetKernelSpec`  |  インタラクティブエンドポイントに、以前に起動したカーネルのカーネル仕様を取得するようリクエストします。  | 
|  `GetKernelSpecResource`  |  インタラクティブエンドポイントに、以前に起動されたカーネル仕様に関連する特定のリソースを取得するようにリクエストします。  | 

## 例
<a name="metrics-examples"></a>

### 特定の日にインタラクティブエンドポイントで起動されたカーネルの総数を確認するには
<a name="example01"></a>

1. カスタム名前空間を選択します: `EMRContainers`

1. `ManagedEndpointId`、`OperationName – CreateKernel` を選択します。

1. 統計 `SUM` と期間 `1 day` を含む `RequestCount` メトリクスは、過去 24 時間以内に行われたすべてのカーネル起動リクエストを提供します。

1. 統計 `SUM` と期間 `1 day` を含む KernelLaunchSuccess メトリクスは、過去 24 時間以内に行われたすべての成功したカーネル起動リクエストを提供します。

### 特定の日にインタラクティブエンドポイントで発生したカーネル障害の数を確認するには
<a name="example02"></a>

1. カスタム名前空間を選択します: EMRContainers 

1. `ManagedEndpointId`、`OperationName – CreateKernel` を選択します。

1. 統計 `SUM` と期間 `1 day` を含む `KernelLaunchFailure` メトリクスは、過去 24 時間以内に行われたすべての失敗したカーネル起動リクエストを提供します。また、`4XXError` と `5XXError` メトリクスを選択して、どのようなカーネル起動エラーが発生したかを確認することもできます。

# セルフホスト型 Jupyter Notebook を使用する
<a name="managed-endpoints-self-hosted"></a>

Jupyter または JupyterLab Notebook は、Amazon EC2 インスタンスまたは独自の Amazon EKS クラスターで*セルフホスト型 Jupyter Notebook* としてホストおよび管理できます。その後、セルフホスト型 Jupyter Notebook でインタラクティブワークロードを実行できます。以下のセクションでは、セルフホスト型 Jupyter Notebook を Amazon EKS クラスターにセットアップしてデプロイするプロセスについて説明します。



**Topics**
+ [セキュリティグループを作成する](#managed-endpoints-self-hosted-security)
+ [EKS での Amazon EMR インタラクティブエンドポイントを作成する](#managed-endpoints-self-hosted-create-me)
+ [インタラクティブエンドポイントのゲートウェイサーバー URL を取得する](#managed-endpoints-self-hosted-gateway)
+ [認証トークンを取得してインタラクティブエンドポイントに接続します。](#managed-endpoints-self-hosted-auth)
+ [例: JupyterLab ノートブックをデプロイする](#managed-endpoints-self-hosted-example)
+ [セルフホスト型 Jupyter Notebook を削除する](#managed-endpoints-self-hosted-cleanup)

## セキュリティグループを作成する
<a name="managed-endpoints-self-hosted-security"></a>

インタラクティブエンドポイントを作成し、セルフホスト型 Jupyter または JupyterLab ノートブックを実行する前に、ノートブックとインタラクティブエンドポイント間のトラフィックを制御するセキュリティグループを作成する必要があります。Amazon EC2 コンソールまたは Amazon EC2 SDK を使用してセキュリティグループを作成するには、「*Amazon EC2 ユーザーガイド*」の「[セキュリティグループの作成](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/working-with-security-groups.html#creating-security-group)」の手順を参照してください。ノートブックサーバーをデプロイする VPC にセキュリティグループを作成する必要があります。

このガイドの例に従うには、Amazon EKS クラスターと同じ VPC を使用してください。Amazon EKS クラスターの VPC とは異なる VPC でノートブックをホストする場合、これらの 2 つの VPC 間にピアリング接続を作成する必要がある場合があります。2 つの VPC 間にピアリング接続を作成する手順については、「Amazon VPC Getting Started Guide」の「[Create a VPC peering connection](https://docs.aws.amazon.com/vpc/latest/peering/create-vpc-peering-connection.html)」を参照してください。

次のステップで [EKS での Amazon EMR インタラクティブエンドポイントを作成する](https://docs.aws.amazon.com/)には、セキュリティグループの ID が必要です。

## EKS での Amazon EMR インタラクティブエンドポイントを作成する
<a name="managed-endpoints-self-hosted-create-me"></a>

ノートブックのセキュリティグループを作成したら、「[仮想クラスターのインタラクティブエンドポイントを作成する](create-managed-endpoint.md)」に記載されている手順に従ってインタラクティブエンドポイントを作成します。「[セキュリティグループを作成する](#managed-endpoints-self-hosted-security)」でノートブック用に作成したセキュリティグループ ID を指定する必要があります。

次の構成オーバーライド設定で、*your-notebook-security-group-id* の代わりにセキュリティ ID を挿入します。

```
--configuration-overrides '{
    "applicationConfiguration": [
        {
            "classification": "endpoint-configuration",
            "properties": {
                "notebook-security-group-id": "your-notebook-security-group-id"
            }
        }
    ],
    "monitoringConfiguration": {
    ...'
```

## インタラクティブエンドポイントのゲートウェイサーバー URL を取得する
<a name="managed-endpoints-self-hosted-gateway"></a>

インタラクティブエンドポイントを作成したら、 AWS CLIで `describe-managed-endpoint` コマンドを使用してゲートウェイサーバーの URL を取得します。この URL は、ノートブックをエンドポイントに接続するために必要です。ゲートウェイサーバー URL はプライベートエンドポイントです。

```
aws emr-containers describe-managed-endpoint \
--region region \
--virtual-cluster-id virtualClusterId \
--id endpointId
```

最初、エンドポイントの状態は **CREATING** です。数分後、**ACTIVE** 状態に遷移します。エンドポイントが **ACTIVE** となっていれば、使用準備が完了しています｡

`serverUrl` コマンドがアクティブなエンドポイントから返す `aws emr-containers describe-managed-endpoint` 属性を書き留めておきます。[セルフホスト型 Jupyter または JupyterLab ノートブックをデプロイするときに](https://docs.aws.amazon.com/)、ノートブックをエンドポイントに接続するには、この URL が必要です。

## 認証トークンを取得してインタラクティブエンドポイントに接続します。
<a name="managed-endpoints-self-hosted-auth"></a>

Jupyter または JupyterLab ノートブックからインタラクティブエンドポイントに接続するには、`GetManagedEndpointSessionCredentials` API を使用してセッショントークンを生成する必要があります。このトークンは、インタラクティブエンドポイントサーバーに接続するための認証証明として機能します。

次のコマンドについて、出力例を示してさらに詳しく説明します。

```
aws emr-containers get-managed-endpoint-session-credentials \
--endpoint-identifier endpointArn \
--virtual-cluster-identifier virtualClusterArn \
--execution-role-arn executionRoleArn \
--credential-type "TOKEN" \
--duration-in-seconds durationInSeconds \
--region region
```

**`endpointArn`**  
エンドポイントの ARN。ARN は `describe-managed-endpoint` 呼び出しの結果で確認できます。

**`virtualClusterArn`**  
仮想クラスターの ARN。

**`executionRoleArn`**  
実行ロールの ARN。

**`durationInSeconds`**  
トークンの有効期間 (秒単位)。デフォルトの有効期間は 15 分 (`900`) で、最長は 12 時間 (`43200`) です。

**`region` **  
エンドポイントと同じリージョン。

出力は次の例のようになります。[セルフホスト型 Jupyter または JupyterLab ノートブックをデプロイする](https://docs.aws.amazon.com/)ときに使用する `session-token` 値を書き留めておいてください。

```
{
    "id": "credentialsId",
    "credentials": {
        "token": "session-token"
    },
    "expiresAt": "2022-07-05T17:49:38Z"
}
```

## 例: JupyterLab ノートブックをデプロイする
<a name="managed-endpoints-self-hosted-example"></a>

上記のステップを完了したら、このサンプル手順を試して、インタラクティブエンドポイントを使用して JupyterLab ノートブックを Amazon EKS クラスターにデプロイできます。

1. ノートブックサーバーを実行する名前空間を作成します。

1. `notebook.yaml` というファイルを次の内容でローカルに作成します。ファイルの内容は次のとおりです。

   ```
   apiVersion: v1
   kind: Pod
   metadata:
     name: jupyter-notebook
     namespace: namespace
   spec:
     containers:
     - name: minimal-notebook
       image: jupyter/all-spark-notebook:lab-3.1.4 # open source image 
       ports:
       - containerPort: 8888
       command: ["start-notebook.sh"]
       args: ["--LabApp.token=''"]
       env:
       - name: JUPYTER_ENABLE_LAB
         value: "yes"
       - name: KERNEL_LAUNCH_TIMEOUT
         value: "400"
       - name: JUPYTER_GATEWAY_URL
         value: "serverUrl"
       - name: JUPYTER_GATEWAY_VALIDATE_CERT
         value: "false"
       - name: JUPYTER_GATEWAY_AUTH_TOKEN
         value: "session-token"
   ```

   Jupyter Notebook を Fargate 専用クラスターにデプロイする場合は、次の例のように Jupyter ポッドに `role` ラベルを付けます。

   ```
   ...
   metadata:
     name: jupyter-notebook
     namespace: default
     labels:
       role: example-role-name-label
   spec:
               ...
   ```  
**`namespace`**  
ノートブックをデプロイする Kubernetes 名前空間。  
**`serverUrl`**  
[インタラクティブエンドポイントのゲートウェイサーバー URL を取得する](#managed-endpoints-self-hosted-gateway) で `describe-managed-endpoint` コマンドが返した `serverUrl` 属性。  
**`session-token`**  
[認証トークンを取得してインタラクティブエンドポイントに接続します。](#managed-endpoints-self-hosted-auth) で `get-managed-endpoint-session-credentials` コマンドが返した `session-token` 属性。  
**`KERNEL_LAUNCH_TIMEOUT`**  
インタラクティブエンドポイントが、カーネルが **RUNNING** 状態になるのを待つ時間 (秒単位)。カーネル起動タイムアウトを適切な値 (最大 400 秒) に設定して、カーネルの起動が完了するまで十分な時間を確保します。  
**`KERNEL_EXTRA_SPARK_OPTS`**  
オプションで、Spark カーネルに追加の Spark 構成を渡すことができます。以下の例のように、この環境変数に Spark 設定プロパティとして値を設定します。  

   ```
   - name: KERNEL_EXTRA_SPARK_OPTS
     value: "--conf spark.driver.cores=2
             --conf spark.driver.memory=2G
             --conf spark.executor.instances=2
             --conf spark.executor.cores=2
             --conf spark.executor.memory=2G
             --conf spark.dynamicAllocation.enabled=true
             --conf spark.dynamicAllocation.shuffleTracking.enabled=true
             --conf spark.dynamicAllocation.minExecutors=1
             --conf spark.dynamicAllocation.maxExecutors=5
             --conf spark.dynamicAllocation.initialExecutors=1
             "
   ```

1. Amazon EKS クラスターにポッドの仕様をデプロイします。

   ```
   kubectl apply -f notebook.yaml -n namespace
   ```

   これにより、EKS での Amazon EMR インタラクティブエンドポイントに接続された最小限の JupyterLab ノートブックが起動します。ポッドが **RUNNING** になるまでお待ちください。次のコマンドを使用して、ポッドのステータスを確認します。

   ```
   kubectl get pod jupyter-notebook -n namespace
   ```

   ポッドの準備が整うと、`get pod` コマンドは次のような出力を返します。

   ```
   NAME              READY  STATUS   RESTARTS  AGE
   jupyter-notebook  1/1    Running  0         46s
   ```

1. ノートブックセキュリティグループを、ノートブックがスケジュールされているノードにアタッチします。

   1. まず、`jupyter-notebook` ポッドがスケジュールされているノードを `describe pod` コマンドで特定します。

      ```
      kubectl describe pod jupyter-notebook -n namespace
      ```

   1. [https://console.aws.amazon.com/eks/home\$1/clusters](https://console.aws.amazon.com/eks/home#/clusters) で Amazon EKS コンソールを開きます。

   1. Amazon EKS クラスターの **[コンピューティング]** タブに移動し、`describe pod` コマンドで特定したノードを選択します。ノードのインスタンス ID を選択します。

   1. **[アクション]** メニューから **[セキュリティ]** > **[セキュリティグループを変更]** を選択し、[セキュリティグループを作成する](#managed-endpoints-self-hosted-security) で作成したセキュリティグループをアタッチします。

   1. Jupyter Notebook ポッドを にデプロイする場合は AWS Fargate、ロールラベルを使用して Jupyter Notebook ポッド[]()に適用する を作成します。

      ```
      cat >my-security-group-policy.yaml <<EOF
      apiVersion: vpcresources.k8s.aws/v1beta1
      kind: SecurityGroupPolicy
      metadata:
        name: example-security-group-policy-name
        namespace: default
      spec:
        podSelector:
          matchLabels:
            role: example-role-name-label
        securityGroups:
          groupIds:
            - your-notebook-security-group-id
      EOF
      ```

1. 次に、ポート転送して JupyterLab インターフェイスにローカルにアクセスできるようにします。

   ```
   kubectl port-forward jupyter-notebook 8888:8888 -n namespace
   ```

   それが実行したら、ローカルブラウザに移動し、`localhost:8888` にアクセスして JupyterLab インターフェイスを確認してください。  
![\[JupyterLab のスタート画面のスクリーンショット。\]](http://docs.aws.amazon.com/ja_jp/emr/latest/EMR-on-EKS-DevelopmentGuide/images/emr-on-eks-Jupyter-notebook-start.png)

1. JupyterLab から、新しい Scala ノートブックを作成します。Pi の値を概算するために実行できるサンプルコードスニペットを次に示します。

   ```
   import scala.math.random
   import org.apache.spark.sql.SparkSession
   
   /** Computes an approximation to pi */
   val session = SparkSession
     .builder
     .appName("Spark Pi")
     .getOrCreate()
   
   val slices = 2
   // avoid overflow
   val n = math.min(100000L * slices, Int.MaxValue).toInt 
    
   val count = session.sparkContext
   .parallelize(1 until n, slices)
   .map { i =>
     val x = random * 2 - 1
     val y = random * 2 - 1
     if (x*x + y*y <= 1) 1 else 0
   }.reduce(_ + _)
   
   println(s"Pi is roughly ${4.0 * count / (n - 1)}")
   session.stop()
   ```  
![\[JupyterLab の Scala ノートブックコードの例のスクリーンショット。\]](http://docs.aws.amazon.com/ja_jp/emr/latest/EMR-on-EKS-DevelopmentGuide/images/emr-on-eks-Jupyter-notebook-scala-program.png)

## セルフホスト型 Jupyter Notebook を削除する
<a name="managed-endpoints-self-hosted-cleanup"></a>

セルフホスト型ノートブックを削除する準備ができたら、インタラクティブエンドポイントとセキュリティグループも削除できます。次の順番でアクションを実行します。

1. 次のコマンドを使用して、`jupyter-notebook` ポッドを削除します。

   ```
   kubectl delete pod jupyter-notebook -n namespace
   ```

1. 次に、`delete-managed-endpoint` コマンドを使用してインタラクティブエンドポイントを削除します。インタラクティブエンドポイントを削除する手順については、「[インタラクティブエンドポイントを削除する](delete-managed-endpoint.md)」を参照してください。最初、エンドポイントは **TERMINATING** 状態になります。すべてのリソースがクリーンアップされると、**TERMINATED** 状態に移行します。

1. [セキュリティグループを作成する](#managed-endpoints-self-hosted-security) で作成したノートブックセキュリティグループを他の Jupyter Notebook デプロイに使用する予定がない場合は、削除できます。詳細については、「Amazon EC2 User Guide」の「[Delete a security group](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/working-with-security-groups.html#deleting-security-group)」を参照してください。

# CLI コマンドを使用したインタラクティブエンドポイントに関する情報の取得
<a name="other-operations"></a>

このトピックでは、[`create-managed-endpoint`](create-managed-endpoint.md) 以外のインタラクティブエンドポイントでサポートされるオペレーションについて説明します。

## インタラクティブエンドポイントの詳細を取得する
<a name="fetch-details"></a>

インタラクティブエンドポイントを作成したら、 `describe-managed-endpoint` AWS CLI コマンドを使用してその詳細を取得できます。*managed-endpoint-id*、*virtual-cluster-id*、および *region* に独自の値を挿入してください。

```
aws emr-containers describe-managed-endpoint ‐‐id managed-endpoint-id \
 ‐‐virtual-cluster-id virtual-cluster-id ‐‐region region
```

出力は、ARN、ID、名前などの指定されたエンドポイントを含む次のようになります。

```
{
   "id": "as3ys2xxxxxxx",
   "name": "endpoint-name",
    "arn": "arn:aws:emr-containers:us-east-1:1828xxxxxxxx:/virtualclusters/lbhl6kwwyoxxxxxxxxxxxxxxx/endpoints/as3ysxxxxxxxx",
    "virtualClusterId": "lbhl6kwwyoxxxxxxxxxxxxxxx",
    "type": "JUPYTER_ENTERPRISE_GATEWAY",
    "state": "ACTIVE",
    "releaseLabel": "emr-6.9.0-latest",
   "executionRoleArn": "arn:aws:iam::1828xxxxxxxx:role/RoleName",
    "certificateAuthority": {
        "certificateArn": "arn:aws:acm:us-east-1:1828xxxxxxxx:certificate/zzzzzzzz-e59b-4ed0-aaaa-bbbbbbbbbbbb",
        "certificateData": "certificate-data"
    },
    "configurationOverrides": {
        "applicationConfiguration": [
            {
                "classification": "spark-defaults",
                "properties": {
                    "spark.driver.memory": "8G"
                }
            }
        ],
        "monitoringConfiguration": {
            "persistentAppUI": "ENABLED",
            "cloudWatchMonitoringConfiguration": {
                "logGroupName": "log-group-name",
                "logStreamNamePrefix": "log-stream-name-prefix"
            },
            "s3MonitoringConfiguration": {
                "logUri": "s3-bucket-name"
            }
        }
    },
   "serverUrl": "https://internal-k8s-namespace-ingressa-aaaaaaaaaa-zzzzzzzzzz.us-east-1.elb.amazonaws.com:18888 (https://internal-k8s-nspluto-ingressa-51e860abbd-1620715833.us-east-1.elb.amazonaws.com:18888/)",
    "createdAt": "2022-09-19T12:37:49+00:00",
    "securityGroup": "sg-aaaaaaaaaaaaaa",
    "subnetIds": [
        "subnet-11111111111",
        "subnet-22222222222",
        "subnet-33333333333"
    ],
    "stateDetails": "Endpoint created successfully. It took 3 Minutes 15 Seconds",
    "tags": {}
 }
```

## 仮想クラスターに関連付けられたすべてのインタラクティブエンドポイントをリストする
<a name="list-all-managed-endpoints"></a>

`list-managed-endpoints` AWS CLI コマンドを使用して、指定された仮想クラスターに関連付けられているすべてのインタラクティブエンドポイントのリストを取得します。`virtual-cluster-id` は、仮想クラスターの ID に置き換えます。

```
aws emr-containers list-managed-endpoints ‐‐virtual-cluster-id virtual-cluster-id
```

次のような `list-managed-endpoint` コマンドの出力が表示されます。

```
{
    "endpoints": [{
        "id": "as3ys2xxxxxxx",
        "name": "endpoint-name",
        "arn": "arn:aws:emr-containers:us-east-1:1828xxxxxxxx:/virtualclusters/lbhl6kwwyoxxxxxxxxxxxxxxx/endpoints/as3ysxxxxxxxx",
        "virtualClusterId": "lbhl6kwwyoxxxxxxxxxxxxxxx",
        "type": "JUPYTER_ENTERPRISE_GATEWAY",
        "state": "ACTIVE",
        "releaseLabel": "emr-6.9.0-latest",
        "executionRoleArn": "arn:aws:iam::1828xxxxxxxx:role/RoleName",
        "certificateAuthority": {
            "certificateArn": "arn:aws:acm:us-east-1:1828xxxxxxxx:certificate/zzzzzzzz-e59b-4ed0-aaaa-bbbbbbbbbbbb",
            "certificateData": "certificate-data"
        },
        "configurationOverrides": {
            "applicationConfiguration": [{
                "classification": "spark-defaults",
                "properties": {
                    "spark.driver.memory": "8G"
                }
            }],
            "monitoringConfiguration": {
                "persistentAppUI": "ENABLED",
                "cloudWatchMonitoringConfiguration": {
                    "logGroupName": "log-group-name",
                    "logStreamNamePrefix": "log-stream-name-prefix"
                },
                "s3MonitoringConfiguration": {
                    "logUri": "s3-bucket-name"
                }
            }
        },
        "serverUrl": "https://internal-k8s-namespace-ingressa-aaaaaaaaaa-zzzzzzzzzz.us-east-1.elb.amazonaws.com:18888 (https://internal-k8s-nspluto-ingressa-51e860abbd-1620715833.us-east-1.elb.amazonaws.com:18888/)",
        "createdAt": "2022-09-19T12:37:49+00:00",
        "securityGroup": "sg-aaaaaaaaaaaaaa",
        "subnetIds": [
            "subnet-11111111111",
            "subnet-22222222222",
            "subnet-33333333333"
        ],
        "stateDetails": "Endpoint created successfully. It took 3 Minutes 15 Seconds",
        "tags": {}
    }]
}
```

# インタラクティブエンドポイントを削除する
<a name="delete-managed-endpoint"></a>

Amazon EMR on EKS 仮想クラスターに関連付けられたインタラクティブエンドポイントを削除するには、 `delete-managed-endpoint` AWS CLI コマンドを使用します。インタラクティブエンドポイントを削除すると、EKS での Amazon EMR はそのエンドポイント用に作成されたデフォルトのセキュリティグループを削除します。

コマンドに次のパラメータの値を指定します。
+ **‐‐id:** 削除するインタラクティブエンドポイントの識別子。
+ **‐‐virtual-cluster-id** - 削除するインタラクティブエンドポイントに関連付けられている仮想クラスターの識別子。これは、インタラクティブエンドポイントの作成時に指定された仮想クラスター ID と同じです。

```
aws emr-containers delete-managed-endpoint ‐‐id managed-endpoint-id ‐‐virtual-cluster-id virtual-cluster-id
```

このコマンドにより、インタラクティブエンドポイントが削除されたことを確認するために、次のような出力が返されます。

```
{
    "id":"8gai4l4exxxxx",
    "virtualClusterId":"0b0qvauoy3ch1nqodxxxxxxxx"
}
```