

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

# Amazon EMR on EKS での Apache Livy の使用
<a name="job-runs-apache-livy"></a>

Amazon EMR リリース 7.1.0 以降では、Apache Livy を使用して Amazon EMR on EKS でジョブを送信できます。Apache Livy を使用すると、独自の Apache Livy REST エンドポイントを設定して Amazon EKS クラスターに Spark アプリケーションをデプロイし、管理できます。Amazon EKS クラスターに Livy をインストールすると、Livy エンドポイントを使用して Spark アプリケーションを Livy サーバーに送信できます。サーバーは Spark アプリケーションのライフサイクルを管理します。

**注記**  
Amazon EMR は、vCPU とメモリ消費量に基づいて Amazon EKS の料金を算出します。この計算は、ドライバーポッドとエグゼキュターポッドに適用されます。この計算は、Amazon EMR アプリケーションイメージをダウンロードしてから Amazon EKS ポッドが終了するまでに開始され、秒単位で四捨五入されます。

**Topics**
+ [Amazon EMR on EKS 用の Apache Livy の設定](job-runs-apache-livy-setup.md)
+ [Amazon EMR on EKS での Apache Livy の使用開始](job-runs-apache-livy-install.md)
+ [Amazon EMR on EKS の Apache Livy による Spark アプリケーションの実行](job-runs-apache-livy-run-spark.md)
+ [Amazon EMR on EKS を使用した Apache Livy のアンインストール](job-runs-apache-livy-uninstall.md)
+ [Amazon EMR on EKS を使用した Apache Livy のセキュリティ](job-runs-apache-livy-security.md)
+ [Amazon EMR on EKS リリースでの Apache Livy のインストールプロパティ](job-runs-apache-livy-installation-properties.md)
+ [一般的な環境変数の形式エラーのトラブルシューティング](job-runs-apache-livy-troubleshooting.md)

# Amazon EMR on EKS 用の Apache Livy の設定
<a name="job-runs-apache-livy-setup"></a>

Amazon EKS クラスターに Apache Livy をインストールする前に、必須となるツールセットをインストールして設定する必要があります。これらには AWS CLI、 AWS リソースを操作するための基本的なコマンドラインツールである 、Amazon EKS を操作するためのコマンドラインツール、およびクラスターアプリケーションをインターネットで利用可能にし、ネットワークトラフィックをルーティングするためにこのユースケースで使用されるコントローラーが含まれます。
+ **[の最新バージョンをインストールまたは更新する AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) ** – を既にインストールしている場合は AWS CLI、最新バージョンがあることを確認します。
+ **[kubectl と eksctl の設定](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)** — eksctl は、Amazon EKS との通信に使用するコマンドラインツールです。
+ **[Helm のインストール](https://docs.aws.amazon.com/eks/latest/userguide/helm.html)** – Kubernetes 用の Helm パッケージマネージャーを使用すると、Kubernetes クラスターにアプリケーションをインストールして管理できます。
+ **[Amazon EKS – eksctl の使用開始](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html)** – Amazon EKS にノードを持つ新しい Kubernetes クラスターを作成する手順に従います。
+ **[Amazon EMR リリースラベルの選択](docker-custom-images-tag.md)** – Apache Livy は Amazon EMR リリース 7.1.0 以降でサポートされています。
+ **[ALB コントローラーをインストールする](https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html)** – ALB コントローラーは AWS Elastic Load Balancing for Kubernetes クラスターを管理します。Apache Livy の設定中に Kubernetes Ingress を作成すると、 AWS Network Load Balancer (NLB) が作成されます。

# Amazon EMR on EKS での Apache Livy の使用開始
<a name="job-runs-apache-livy-install"></a>

Apache Livy をインストールするには、次の手順を実行します。これには、パッケージマネージャーの設定、Spark ワークロード実行用の名前空間の作成、Livy のインストール、負荷分散の設定、検証ステップが含まれます。Spark でバッチジョブを実行するには、これらの手順を実行する必要があります。

1. まだ設定していない場合は、[Amazon EMR on EKS 用の Apache Livy](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-setup.html) を設定します。

1. Amazon ECR レジストリに対し、Helm クライアントを認証します。の対応する`ECR-registry-account`値は、Amazon ECR レジストリアカウント AWS リージョン からリージョン別に確認できます。 [https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-tag.html#docker-custom-images-ECR](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-tag.html#docker-custom-images-ECR)

   ```
   aws ecr get-login-password \--region <AWS_REGION> | helm registry login \
   --username AWS \
   --password-stdin <ECR-registry-account>.dkr.ecr.<region-id>.amazonaws.com
   ```

1. Livy を設定すると、Livy サーバーのサービスアカウントと Spark アプリケーション用にもう一つのアカウントが作成されます。サービスアカウントの IRSA を設定するには、「[サービスアカウント用 IAM ロール (IRSA、IAM roles for service accounts) でアクセス権限を設定する](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-irsa.html)」を参照してください。

1. Spark ワークロードを実行する名前空間を作成します。

   ```
   kubectl create ns <spark-ns>
   ```

1. 次のコマンドを使用して Livy をインストールします。

   この Livy エンドポイントは、EKS クラスターの VPC でのみ内部的に使用できます。VPC 以外のアクセスを有効にするには、Helm インストールコマンドで `—-set loadbalancer.internal=false` を設定します。
**注記**  
デフォルトでは、SSL はこの Livy エンドポイント内で有効ではなく、エンドポイントは EKS クラスターの VPC 内でのみ表示されます。`loadbalancer.internal=false` と `ssl.enabled=false` を設定すると、安全でないエンドポイントが VPC の外部に公開されます。安全な Livy エンドポイントを設定するには、「[TLS/SSL を使用した安全な Apache Livy エンドポイントの設定](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-secure-endpoint.html)」を参照してください。

   ```
   helm install livy-demo \
     oci://895885662937.dkr.ecr.region-id.amazonaws.com/livy \
     --version 7.12.0 \
     --namespace livy-ns \
     --set image=ECR-registry-account.dkr.ecr.region-id.amazonaws.com/livy/emr-7.12.0:latest \
     --set sparkNamespace=<spark-ns> \
     --create-namespace
   ```

   次のような出力が表示されます。

   ```
   NAME: livy-demo
   LAST DEPLOYED: Mon Mar 18 09:23:23 2024
   NAMESPACE: livy-ns
   STATUS: deployed
   REVISION: 1
   TEST SUITE: None
   NOTES:
   The Livy server has been installed.
   Check installation status:
   1. Check Livy Server pod is running
     kubectl --namespace livy-ns get pods -l "app.kubernetes.io/instance=livy-demo"
   2. Verify created NLB is in Active state and it's target groups are healthy (if loadbalancer.enabled is true)
   
   Access LIVY APIs:
       # Ensure your NLB is active and healthy
       # Get the Livy endpoint using command:
       LIVY_ENDPOINT=$(kubectl get svc -n livy-ns -l app.kubernetes.io/instance=livy-demo,emr-containers.amazonaws.com/type=loadbalancer -o jsonpath='{.items[0].status.loadBalancer.ingress[0].hostname}' |  awk '{printf "%s:8998\n", $0}')
       # Access Livy APIs using http://$LIVY_ENDPOINT or https://$LIVY_ENDPOINT (if SSL is enabled)
       # Note: While uninstalling Livy, makes sure the ingress and NLB are deleted after running the helm command to avoid dangling resources
   ```

   Livy サーバーと Spark セッションのデフォルトのサービスアカウント名は `emr-containers-sa-livy`と `emr-containers-sa-spark-livy` です。カスタム名を使用するには、`serviceAccounts.name` パラメータと `sparkServiceAccount.name` パラメータを使用します。

   ```
   --set serviceAccounts.name=my-service-account-for-livy
   --set sparkServiceAccount.name=my-service-account-for-spark
   ```

1. Helm チャートをインストールしたことを確認します。

   ```
   helm list -n livy-ns -o yaml
   ```

   `helm list` コマンドは、新しい Helm チャートに関する情報を返します。

   ```
   app_version: 0.7.1-incubating
   chart: livy-emr-7.12.0
   name: livy-demo
   namespace: livy-ns
   revision: "1"
   status: deployed
   updated: 2024-02-08 22:39:53.539243 -0800 PST
   ```

1. Network Load Balancer がアクティブであることを確認します。

   ```
   LIVY_NAMESPACE=<livy-ns>
   LIVY_APP_NAME=<livy-app-name>
   AWS_REGION=<AWS_REGION>
   
   # Get the NLB Endpoint URL
   NLB_ENDPOINT=$(kubectl --namespace $LIVY_NAMESPACE get svc -l "app.kubernetes.io/instance=$LIVY_APP_NAME,emr-containers.amazonaws.com/type=loadbalancer" -o jsonpath='{.items[0].status.loadBalancer.ingress[0].hostname}') 
   
   # Get all the load balancers in the account's region
   ELB_LIST=$(aws elbv2 describe-load-balancers --region $AWS_REGION)
   
   # Get the status of the NLB that matching the endpoint from the Kubernetes service
   NLB_STATUS=$(echo $ELB_LIST | grep -A 8 "\"DNSName\": \"$NLB_ENDPOINT\"" | awk '/Code/{print $2}/}/' | tr -d '"},\n')
   echo $NLB_STATUS
   ```

1. 次に、Network Load Balancer のターゲットグループが正常であることを確認します。

   ```
   LIVY_NAMESPACE=<livy-ns>
   LIVY_APP_NAME=<livy-app-name>
   AWS_REGION=<AWS_REGION>
   
   # Get the NLB endpoint
   NLB_ENDPOINT=$(kubectl --namespace $LIVY_NAMESPACE get svc -l "app.kubernetes.io/instance=$LIVY_APP_NAME,emr-containers.amazonaws.com/type=loadbalancer" -o jsonpath='{.items[0].status.loadBalancer.ingress[0].hostname}') 
   
   # Get all the load balancers in the account's region
   ELB_LIST=$(aws elbv2 describe-load-balancers --region $AWS_REGION)
   
   # Get the NLB ARN from the NLB endpoint
   NLB_ARN=$(echo $ELB_LIST | grep -B 1 "\"DNSName\": \"$NLB_ENDPOINT\"" | awk '/"LoadBalancerArn":/,/"/'| awk '/:/{print $2}' | tr -d \",)
   
   # Get the target group from the NLB. Livy setup only deploys 1 target group
   TARGET_GROUP_ARN=$(aws elbv2 describe-target-groups --load-balancer-arn $NLB_ARN --region $AWS_REGION | awk '/"TargetGroupArn":/,/"/'| awk '/:/{print $2}' | tr -d \",)
   
   # Get health of target group
   aws elbv2 describe-target-health --target-group-arn $TARGET_GROUP_ARN
   ```

   以下は、ターゲットグループのステータスを示す出力のサンプルです。

   ```
   {
       "TargetHealthDescriptions": [
           {
               "Target": {
                   "Id": "<target IP>",
                   "Port": 8998,
                   "AvailabilityZone": "us-west-2d"
               },
               "HealthCheckPort": "8998",
               "TargetHealth": {
                   "State": "healthy"
               }
           }
       ]
   }
   ```

   NLB のステータスが `active` になり、ターゲットグループが `healthy` になったら、続行できます。これには数分かかることがあります。

1. Helm インストールから Livy エンドポイントを取得します。Livy エンドポイントが安全かどうかは、SSL を有効にしたかどうかで決まります。

   ```
   LIVY_NAMESPACE=<livy-ns>
    LIVY_APP_NAME=livy-app-name
    LIVY_ENDPOINT=$(kubectl get svc -n livy-ns -l app.kubernetes.io/instance=livy-app-name,emr-containers.amazonaws.com/type=loadbalancer -o jsonpath='{.items[0].status.loadBalancer.ingress[0].hostname}' |  awk '{printf "%s:8998\n", $0}')
    echo "$LIVY_ENDPOINT"
   ```

1. Helm インストールから Spark サービスアカウントを取得する

   ```
   SPARK_NAMESPACE=spark-ns
   LIVY_APP_NAME=<livy-app-name>
   SPARK_SERVICE_ACCOUNT=$(kubectl --namespace $SPARK_NAMESPACE get sa -l "app.kubernetes.io/instance=$LIVY_APP_NAME" -o jsonpath='{.items[0].metadata.name}')
   echo "$SPARK_SERVICE_ACCOUNT"
   ```

   次のような出力が表示されます。

   ```
   emr-containers-sa-spark-livy
   ```

1. VPC の外部からのアクセスを可能にするように `internalALB=true` を設定した場合は、Amazon EC2 インスタンスを作成し、Network Load Balancer が EC2 インスタンスからのネットワークトラフィックを許可していることを確認します。インスタンスが Livy エンドポイントにアクセスするには、これが必要となります。VPC の外部にエンドポイントを安全に公開する方法の詳細については、「[TLS/SSL を使用した安全な Apache Livy エンドポイントの設定](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-secure-endpoint.html)」を参照してください。

1. Livy をインストールすると、Spark アプリケーションを実行するサービスアカウント `emr-containers-sa-spark` が作成されます。Spark アプリケーションが S3 などの AWS リソースを使用している場合、または AWS API または CLI オペレーションを呼び出す場合は、必要なアクセス許可を持つ IAM ロールを spark サービスアカウントにリンクする必要があります。詳細については、「[サービスアカウント用 IAM ロール (IRSA、IAM roles for service accounts) でアクセス権限を設定する](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-irsa.html)」を参照してください。

Apache Livy は、Livy のインストール時に使用できる追加の設定をサポートしています。詳細については、「Amazon EMR on EKS リリースでの Apache Livy のインストールプロパティ」を参照してください。

# Amazon EMR on EKS の Apache Livy による Spark アプリケーションの実行
<a name="job-runs-apache-livy-run-spark"></a>

Apache Livy で Spark アプリケーションを実行する前に、[Amazon EMR on EKS 用の Apache Livy の設定](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-setup.html)と、[Amazon EMR on EKS での Apache Livy の使用開始](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-install.html)の手順が完了していることを確認してください。

Apache Livy を使用して、次の 2 種類のアプリケーションを実行できます。
+ バッチセッション – Livy ワークロードの一種で、Spark バッチジョブを送信します。
+ インタラクティブセッション – Livy ワークロードの一種で、Spark クエリを実行するためのプログラムインターフェイスとビジュアルインターフェイスを提供します。

**注記**  
さまざまなセッションのドライバーポッドとエグゼキュターポッドが相互に通信できます。名前空間はポッド間のセキュリティを保証しません。Kubernetes では、指定された名前空間内のポッドのサブセットに対する選択的なアクセス権限は許可されません。

## バッチセッションの実行
<a name="job-runs-apache-livy-run-spark-batch"></a>

バッチジョブを送信するには、次のコマンドを使用します。

```
curl -s -k -H 'Content-Type: application/json' -X POST \
      -d '{
            "name": "my-session",
            "file": "entryPoint_location (S3 or local)",
            "args": ["argument1", "argument2", ...],
            "conf": {
                "spark.kubernetes.namespace": "<spark-namespace>",
                "spark.kubernetes.container.image": "public.ecr.aws/emr-on-eks/spark/emr-7.12.0:latest",
                "spark.kubernetes.authenticate.driver.serviceAccountName": "<spark-service-account>"
            }
          }' <livy-endpoint>/batches
```

バッチジョブをモニタリングするには、次のコマンドを使用します。

```
curl -s -k -H 'Content-Type: application/json' -X GET <livy-endpoint>/batches/my-session
```

## インタラクティブセッションの実行
<a name="job-runs-apache-livy-run-spark-interactive"></a>

Apache Livy でインタラクティブセッションを実行するには、次の手順を参照してください。

1. SageMaker AI Jupyter Notebook など、セルフホスト型 Jupyter Notebook またはマネージド型 Jupyter Notebook のいずれかにアクセスできることを確認してください。Jupyter Notebook には [sparkmagic](https://github.com/jupyter-incubator/sparkmagic/blob/master/README.md) がインストールされている必要があります。

1. Spark 設定 `spark.kubernetes.file.upload.path` のバケットを作成します。Spark サービスアカウントにバケットへの読み取りおよび書き込みのアクセス権限があることを確認します。spark サービスアカウントの設定方法の詳細については、「サービスアカウントの IAM ロール (IRSA、IAM roles for service accounts) でアクセス権限を設定する」を参照してください。

1. コマンド `%load_ext sparkmagic.magics` を使用して、Jupyter Notebook に sparkmagic をロードします。

1. コマンド `%manage_spark` を実行して、Jupyter Notebook で Livy エンドポイントを設定します。**[エンドポイントを追加]** タブを選択して設定された認証タイプを選択し、ノートブックに Livy エンドポイントを追加して **[エンドポイントを追加]** を選択します。

1. `%manage_spark` を再度実行して Spark コンテキストを作成し、**[セッションを作成]** に移動します。Livy エンドポイントを選択し、一意のセッション名を指定して言語を選択し、次のプロパティを追加します。

   ```
   {
     "conf": {
       "spark.kubernetes.namespace": "livy-namespace",
       "spark.kubernetes.container.image": "public.ecr.aws/emr-on-eks/spark/emr-7.12.0:latest",
       "spark.kubernetes.authenticate.driver.serviceAccountName": "<spark-service-account>", 
       "spark.kubernetes.file.upload.path": "<URI_TO_S3_LOCATION_>"
     }
   }
   ```

1. アプリケーションを送信して Spark コンテキストが作成されるのを待ちます。

1. インタラクティブセッションのステータスをモニタリングするには、次のコマンドを実行します。

   ```
   curl -s -k -H 'Content-Type: application/json' -X GET livy-endpoint/sessions/my-interactive-session
   ```

## Spark アプリケーションのモニタリング
<a name="job-runs-apache-livy-run-ui"></a>

Livy UI を使用して Spark アプリケーションの進捗状況をモニタリングするには、リンク `http://<livy-endpoint>/ui` を使用します。

# Amazon EMR on EKS を使用した Apache Livy のアンインストール
<a name="job-runs-apache-livy-uninstall"></a>

Apache Livy をアンインストールするには、次の手順に従ってください。

1. 名前空間名とアプリケーション名を使用して Livy の設定を削除します。この例では、アプリケーション名は `livy-demo` で、名前空間は `livy-ns` です。

   ```
   helm uninstall livy-demo -n livy-ns
   ```

1. アンインストールすると、Amazon EMR on EKS は Livy の Kubernetes サービス、 AWS ロードバランサー、およびインストール中に作成したターゲットグループを削除します。リソースの削除には数分かかる場合があります。名前空間に Livy を再インストールする前に、リソースが削除されていることを確認してください。

1. Spark 名前空間を削除します。

   ```
   kubectl delete namespace spark-ns
   ```

# Amazon EMR on EKS を使用した Apache Livy のセキュリティ
<a name="job-runs-apache-livy-security"></a>

Amazon EMR on EKS で Apache Livy のセキュリティを設定する方法の詳細については、以下のトピックを参照してください。これらのオプションには、トランスポートレイヤーセキュリティ、ロールベースのアクセス制御 (組織内のユーザーロールに基づいたアクセス)、および IAM ロールの使用 (付与されたアクセス権限に基づいたリソースへのアクセスの提供) が含まれます。

**Topics**
+ [TLS/SSL を使用した安全な Apache Livy エンドポイントの設定](job-runs-apache-livy-secure-endpoint.md)
+ [ロールベースのアクセスコントロール (RBAC) による Apache Livy および Spark のアプリケーションアクセス権限の設定](job-runs-apache-livy-rbac.md)
+ [サービスアカウント用 IAM ロール (IRSA、IAM roles for service accounts) でアクセス権限を設定する](job-runs-apache-livy-irsa.md)

# TLS/SSL を使用した安全な Apache Livy エンドポイントの設定
<a name="job-runs-apache-livy-secure-endpoint"></a>

エンドツーエンドの TLS および SSL 暗号化を使用した Amazon EMR on EKS 用の Apache Livy の設定について詳しくは、以下のセクションを参照してください。

## TLS および SSL 暗号化の設定
<a name="job-runs-apache-livy-security-tls"></a>

Apache Livy エンドポイントで SSL 暗号化を設定するには、次の手順に従います。
+ [Secrets Store CSI ドライバーと AWS Secrets and Configuration Provider (ASCP)](https://docs.aws.amazon.com/secretsmanager/latest/userguide/integrating_csi_driver.html) をインストールする – Secrets Store CSI ドライバーと ASCP は、Livy サーバーポッドが SSL を有効にするために必要な Livy の JKS 証明書とパスワードを安全に保存します。Secrets Store CSI Driver のみをインストールし、サポートされている他のシークレットプロバイダーを使用することもできます。
+ [ACM 証明書の作成](https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-request-public.html) – この証明書は、クライアントと ALB エンドポイント間の接続を保護するために必要です。
+ ALB エンドポイントと Livy サーバー間の接続を保護するために AWS Secrets Manager 必要な JKS 証明書、キーパスワード、およびキーストアパスワードを に設定します。
+ からシークレットを取得するアクセス許可を Livy サービスアカウントに追加します AWS Secrets Manager 。Livy サーバーには、ASCP からシークレットを取得し、Livy サーバーを保護するための Livy 設定を追加するためのこれらのアクセス許可が必要です。サービスアカウントに IAM アクセス権限を追加するには、「サービスアカウント用 IAM ロール (IRSA、IAM roles for service accounts) でアクセス権限を設定する」を参照してください。

### のキーとキーストアパスワードを使用して JKS 証明書を設定する AWS Secrets Manager
<a name="job-runs-apache-livy-jks-certificate"></a>

キーとキーストアパスワードを使用して JKS 証明書を設定するには、次の手順に従います。

1. Livy サーバーのキーストアファイルを生成します。

   ```
   keytool -genkey -alias <host> -keyalg RSA -keysize 2048 –dname CN=<host>,OU=hw,O=hw,L=<your_location>,ST=<state>,C=<country> –keypass <keyPassword> -keystore <keystore_file> -storepass <storePassword> --validity 3650
   ```

1. 証明書を作成します。

   ```
   keytool -export -alias <host> -keystore mykeystore.jks -rfc -file mycertificate.cert -storepass <storePassword>
   ```

1. トラストストアファイルを作成します。

   ```
   keytool -import -noprompt -alias <host>-file <cert_file> -keystore <truststore_file> -storepass <truststorePassword>
   ```

1. JKS 証明書を に保存します AWS Secrets Manager。`livy-jks-secret` をシークレットに置き換え、`fileb://mykeystore.jks` をキーストア JKS 証明書へのパスに置き換えます。

   ```
   aws secretsmanager create-secret \ 
   --name livy-jks-secret \
   --description "My Livy keystore JKS secret" \
   --secret-binary fileb://mykeystore.jks
   ```

1. Secrets Manager にキーストアとキーパスワードを保存します。必ず独自のパラメータを使用してください。

   ```
   aws secretsmanager create-secret \
   --name livy-jks-secret \
   --description "My Livy key and keystore password secret" \
   --secret-string "{\"keyPassword\":\"<test-key-password>\",\"keyStorePassword\":\"<test-key-store-password>\"}"
   ```

1. 次のコマンドで Livy サーバーの名前空間を作成します。

   ```
   kubectl create ns <livy-ns>
   ```

1. JKS 証明書とパスワードを持つ Livy サーバーの `ServiceProviderClass` オブジェクトを作成します。

   ```
   cat >livy-secret-provider-class.yaml << EOF
   apiVersion: secrets-store.csi.x-k8s.io/v1
   kind: SecretProviderClass
   metadata:
     name: aws-secrets
   spec:
     provider: aws
     parameters:
       objects: |
           - objectName: "livy-jks-secret"
             objectType: "secretsmanager"
           - objectName: "livy-passwords"
             objectType: "secretsmanager"
                        
   EOF
   kubectl apply -f livy-secret-provider-class.yaml -n <livy-ns>
   ```

## SSL 対応の Apache Livy の使用開始
<a name="job-runs-apache-livy-ssl-enabled-getting-started"></a>

Livy サーバーで SSL を有効にしたら、 AWS Secrets Managerで `keyStore` シークレットと `keyPasswords` シークレットにアクセスできるように `serviceAccount` を設定する必要があります。

1. Livy サーバーの名前空間を作成します。

   ```
   kubectl create namespace <livy-ns>
   ```

1. Secrets Manager のシークレットにアクセスできるように Livy のサービスアカウントを設定します。IRSA のセットアップの詳細については、「[Apache Livy のインストール中に IRSA を設定する](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-irsa.html#job-runs-apache-livy-irsa)」を参照してください。

   ```
   aws ecr get-login-password \--region region-id | helm registry login \
   --username AWS \
   --password-stdin ECR-registry-account.dkr.ecr.region-id.amazonaws.com
   ```

1. Livy をインストールします。Helm チャートのバージョンパラメータには、`7.1.0` などの Amazon EMR リリースラベルを使用します。また、Amazon ECR レジストリのアカウント ID とリージョン ID を独自の ID に置き換える必要があります。の対応する`ECR-registry-account`値は、Amazon ECR レジストリアカウント AWS リージョン からリージョン別に確認できます。 [https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-tag.html#docker-custom-images-ECR](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-tag.html#docker-custom-images-ECR)

   ```
   helm install <livy-app-name> \
     oci://895885662937.dkr.ecr.region-id.amazonaws.com/livy \
     --version 7.12.0 \
     --namespace livy-namespace-name \
     --set image=<ECR-registry-account.dkr.ecr>.<region>.amazonaws.com/livy/emr-7.12.0:latest \
     --set sparkNamespace=spark-namespace \
     --set ssl.enabled=true
     --set ssl.CertificateArn=livy-acm-certificate-arn
     --set ssl.secretProviderClassName=aws-secrets
     --set ssl.keyStoreObjectName=livy-jks-secret
     --set ssl.keyPasswordsObjectName=livy-passwords
     --create-namespace
   ```

1. [Amazon EMR on EKS への Apache Livy のインストール](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-setup.html#job-runs-apache-livy-install)のステップ 5 から続けます。

# ロールベースのアクセスコントロール (RBAC) による Apache Livy および Spark のアプリケーションアクセス権限の設定
<a name="job-runs-apache-livy-rbac"></a>

Livy をデプロイするために、Amazon EMR on EKS はサーバーのサービスアカウントとロール、および Spark のサービスアカウントとロールを作成します。これらのロールには、Spark アプリケーションの設定と実行を完了するために必要な RBAC アクセス権限が必要です。

**サーバーのサービスアカウントとロールのための RBAC アクセス権限**

Amazon EMR on EKS は、Spark ジョブの Livy セッションを管理し、イングレスやその他のリソースとの間でトラフィックをルーティングするための Livy サーバーのサービスアカウントとロールを作成します。

このサービスアカウントのデフォルト名は `emr-containers-sa-livy` です。次のアクセス権限が必要です。

```
rules:
- apiGroups:
  - ""
  resources:
  - "namespaces"
  verbs:
  - "get"
- apiGroups:
  - ""
  resources:
  - "serviceaccounts"
    "services"
    "configmaps"
    "events"
    "pods"
    "pods/log"
  verbs:
  - "get"
    "list"
    "watch"
    "describe"
    "create"
    "edit"
    "delete"
    "deletecollection"
    "annotate"
    "patch"
    "label"
 - apiGroups:
   - ""
   resources:
   - "secrets"
   verbs:
   - "create"
     "patch"
     "delete"
     "watch"
 - apiGroups:
   - ""
   resources:
   - "persistentvolumeclaims"
   verbs:
   - "get"
     "list"
     "watch"
     "describe"
     "create"
     "edit"
     "delete"
     "annotate"
     "patch"
     "label"
```

**Spark のサービスアカウントとロールのための RBAC アクセス権限**

Spark ドライバーポッドには、ポッドと同じ名前空間にある Kubernetes サービスアカウントが必要です。このサービスアカウントには、エグゼキュターポッドとドライバーポッドに必要なリソースを管理するためのアクセス権限が必要です。名前空間のデフォルトサービスアカウントに必要なアクセス権限がなければ、ドライバーは失敗して終了します。以下の RBAC アクセス権限が必要です。

```
rules:
- apiGroups:
  - ""
    "batch"
    "extensions"
    "apps"
  resources:
  - "configmaps"
    "serviceaccounts"
    "events"
    "pods"
    "pods/exec"
    "pods/log"
    "pods/portforward"
    "secrets"
    "services"
    "persistentvolumeclaims"
    "statefulsets"
  verbs:
  - "create"
    "delete"
    "get"
    "list"
    "patch"
    "update"
    "watch"
    "describe"
    "edit"
    "deletecollection"
    "patch"
    "label"
```

# サービスアカウント用 IAM ロール (IRSA、IAM roles for service accounts) でアクセス権限を設定する
<a name="job-runs-apache-livy-irsa"></a>

デフォルトでは、Livy サーバーと Spark アプリケーションのドライバーとエグゼキュターは AWS リソースにアクセスできません。サーバーサービスアカウントと spark サービスアカウントは、Livy サーバーと spark アプリケーションのポッドの AWS リソースへのアクセスを制御します。アクセスを許可するには、サービスアカウントを、必要な AWS アクセス許可を持つ IAM ロールにマッピングする必要があります。

Apache Livy のインストール前、インストール中、インストール終了後のいずれにおいても IRSA マッピングを設定できます。

## Apache Livy インストール中の IRSA の設定 (サーバーのサービスアカウント用)
<a name="job-runs-apache-livy-irsa"></a>

**注記**  
このマッピングは、サーバーのサービスアカウントでのみサポートされています。

1. [Amazon EMR on EKS の Apache Livy の設定](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-setup.html)が終了し、[Amazon EMR on EKS による Apache Livy のインストール](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-install.html)の途中であることを確認します。

1. Livy サーバー用に、Kubernetes 名前空間を作成します。この例では、名前空間の名前は `livy-ns` です。

1. ポッドがアクセス AWS のサービス する のアクセス許可を含む IAM ポリシーを作成します。次の例では、Spark エントリポイントの Amazon S3 リソースを取得する IAM ポリシーを作成します。

   ```
   cat >my-policy.json <<EOF{
   "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
   "Effect": "Allow",
               "Action": "s3:GetObject",
               "Resource": "arn:aws:s3:::my-spark-entrypoint-bucket"
           }
       ]
   }
   EOF
   
   aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json
   ```

1. 次のコマンドを使用して、 AWS アカウント ID を変数に設定します。

   ```
   account_id=$(aws sts get-caller-identity --query "Account" --output text)
   ```

1. クラスターの OpenID Connect (OIDC) ID プロバイダーを環境変数に設定します。

   ```
   oidc_provider=$(aws eks describe-cluster --name my-cluster --region $AWS_REGION --query "cluster.identity.oidc.issuer" --output text | sed -e "s/^https:\/\///")
   ```

1. サービスアカウントの名前空間と名前の変数を設定します。必ず独自の値を使用してください。

   ```
   export namespace=default
   export service_account=my-service-account
   ```

1. 次のコマンドを使用して信頼ポリシーファイルを作成します。名前空間内のすべてのサービスアカウントにロールへのアクセス権を付与する場合は、次のコマンドをコピーして、`StringEquals` を `StringLike` に、`$service_account` を `*` に置き換えます。

   ```
   cat >trust-relationship.json <<EOF
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Federated": "arn:aws:iam::$account_id:oidc-provider/$oidc_provider"
         },
         "Action": "sts:AssumeRoleWithWebIdentity",
         "Condition": {
           "StringEquals": {
             "$oidc_provider:aud": "sts.amazonaws.com",
             "$oidc_provider:sub": "system:serviceaccount:$namespace:$service_account"
           }
         }
       }
     ]
   }
   EOF
   ```

1. ロールを作成します。

   ```
   aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
   ```

1. 次の Helm インストールコマンドを使用して、`serviceAccount.executionRoleArn` を IRSA をマッピングするように設定します。Helm インストールコマンドの例を次に示します。の対応する`ECR-registry-account`値は、Amazon ECR レジストリアカウント AWS リージョン からリージョン別に確認できます。 [https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-tag.html#docker-custom-images-ECR](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-tag.html#docker-custom-images-ECR)

   ```
   helm install livy-demo \
     oci://895885662937.dkr.ecr.us-west-2.amazonaws.com/livy \
     --version 7.12.0 \
     --namespace livy-ns \
     --set image=ECR-registry-account.dkr.ecr.region-id.amazonaws.com/livy/emr-7.12.0:latest \
     --set sparkNamespace=spark-ns \
     --set serviceAccount.executionRoleArn=arn:aws:iam::123456789012:role/my-role
   ```

## IRSA の Spark サービスアカウントへのマッピング
<a name="job-runs-apache-livy-irsa-spark"></a>

IRSA を Spark サービスアカウントにマッピングする前に、次の項目が完了していることを確認してください。
+ [Amazon EMR on EKS の Apache Livy の設定](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-setup.html)が終了し、[Amazon EMR on EKS による Apache Livy のインストール](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-install.html)の途中であることを確認します。
+ クラスターの既存 IAM OpenID Connect (OIDC) プロバイダーが必要です。既にあるかどうか、または作成する方法を確認するには、「[クラスターの IAM OIDC プロバイダーを作成する](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html)」を参照してください。
+ バージョン 0.171.0 以降の `eksctl` CLI または AWS CloudShellがインストールされていることを確認します。`eksctl` をインストールまたはアップグレードするには、`eksctl` ドキュメントの「[インストール](https://eksctl.io/installation/)」を参照してください。

IRSA を Spark サービスアカウントにマッピングするには、次の手順に従います。

1. 次のコマンドを実行して Spark サービスアカウントを取得します。

   ```
   SPARK_NAMESPACE=<spark-ns>
   LIVY_APP_NAME=<livy-app-name>
   kubectl --namespace $SPARK_NAMESPACE describe sa -l "app.kubernetes.io/instance=$LIVY_APP_NAME" | awk '/^Name:/ {print $2}'
   ```

1. サービスアカウントの名前空間と名前の変数を設定します。

   ```
   export namespace=default
   export service_account=my-service-account
   ```

1. IAM ロール用の信頼ポリシーファイルを作成するには、次のコマンドを使用します。次の例では、名前空間内のすべてのサービスアカウントにロールを使用するアクセス権限を付与します。これを行うには、`StringEquals` を `StringLike` に、`$service_account` を \$1 に置き換えます。

   ```
   cat >trust-relationship.json <<EOF
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Federated": "arn:aws:iam::$account_id:oidc-provider/$oidc_provider"
         },
         "Action": "sts:AssumeRoleWithWebIdentity",
         "Condition": {
           "StringEquals": {
             "$oidc_provider:aud": "sts.amazonaws.com",
             "$oidc_provider:sub": "system:serviceaccount:$namespace:$service_account"
           }
         }
       }
     ]
   }
   EOF
   ```

1. ロールを作成します。

   ```
   aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
   ```

1. 次の `eksctl` コマンドを使用して、サーバーまたは Spark のサービスアカウントをマッピングします。必ず独自の値を使用してください。

   ```
    eksctl create iamserviceaccount --name spark-sa \
    --namespace spark-namespace --cluster livy-eks-cluster \
    --attach-role-arn arn:aws:iam::0123456789012:role/my-role \
    --approve --override-existing-serviceaccounts
   ```

# Amazon EMR on EKS リリースでの Apache Livy のインストールプロパティ
<a name="job-runs-apache-livy-installation-properties"></a>

Apache Livy のインストールでは、Livy Helm チャートのバージョンを選択できます。Helm チャートには、インストールとセットアップのエクスペリエンスをカスタマイズするためにさまざまなプロパティが用意されています。これらのプロパティは、Amazon EMR on EKS リリース 7.1.0 以降でサポートされています。

**Topics**
+ [Amazon EMR 7.1.0 のインストールプロパティ](#job-runs-apache-livy-installation-properties-710)

## Amazon EMR 7.1.0 のインストールプロパティ
<a name="job-runs-apache-livy-installation-properties-710"></a>

次の表は、サポートされているすべての Livy プロパティを示しています。Apache Livy をインストールするときは、Livy Helm チャートのバージョンを選択できます。インストール中にプロパティを設定するには、コマンド `--set <property>=<value>` を使用します。


| プロパティ | 説明 | デフォルト | 
| --- | --- | --- | 
| 画像 | Livy サーバーの Amazon EMR リリース URI です。これは必須の設定です。 | "" | 
| sparkNamespace | Livy Spark セッションを実行する名前空間です。例えば、「livy」と指定します。これは必須の設定です。 | "" | 
| nameOverride | livy の代わりに名前を指定します。名前はすべての Livy リソースのラベルとして設定されます | 「livy」 | 
| fullnameOverride | リソースのフルネームの代わりに使用する名前を指定します。 | "" | 
| ssl.enabled | Livy エンドポイントから Livy サーバーへのエンドツーエンド SSL を有効にします。 | FALSE | 
| ssl.certificateArn | SSL が有効になっている場合、これはサービスによって作成された NLB の ACM 証明書 ARN です。 | "" | 
| ssl.secretProviderClassName | SSL が有効になっている場合、これは Livy サーバー接続の NLB を SSL で保護するためのシークレットプロバイダークラス名です。 | "" | 
| ssl.keyStoreObjectName | SSL が有効になっている場合、シークレットプロバイダークラスのキーストア証明書のオブジェクト名です。 | "" | 
| ssl.keyPasswordsObjectName | SSL が有効になっている場合、キーストアとキーパスワードを持つシークレットのオブジェクト名です。 | "" | 
| rbac.create | true の場合、RBAC リソースを作成します。 | FALSE | 
| serviceAccount.create | true の場合、Livy サービスアカウントを作成します。 | TRUE | 
| serviceAccount.name | Livy に使用するサービスアカウントの名前です。このプロパティを設定せずにサービスアカウントを作成すると、Amazon EMR on EKS は fullname オーバーライドプロパティを使用して名前を自動的に生成します。 | 「emr-containers-sa-livy」 | 
| serviceAccount.executionRoleArn | Livy サービスアカウントの実行ロール ARN です。 | "" | 
| sparkServiceAccount.create | true の場合、.Release.Namespace で Spark サービスアカウントを作成します。 | TRUE | 
| sparkServiceAccount.name | Spark に使用するサービスアカウントの名前です。このプロパティを設定せずに Spark サービスアカウントを作成すると、Amazon EMR on EKS は fullnameOverride プロパティに -spark-livy サフィックスを付けた名前を自動的に生成します。 | 「emr-containers-sa-spark-livy」 | 
| service.name | Livy サービスの名前 | "emr-containers-livy" | 
| service.annotations | Livy サービスの注釈 | \$1\$1 | 
| loadbalancer.enabled | Amazon EKS クラスターの外部に Livy エンドポイントを公開するために使用される Livy サービスのロードバランサーを作成するかどうか。 | FALSE | 
| loadbalancer.internal | Livy エンドポイントを VPC の内部として設定するか、外部として設定するか。 このプロパティを `FALSE` に設定すると、VPC の外部のソースにエンドポイントが公開されます。TLS/SSL を使用してエンドポイントを保護することをお勧めします。詳細については、「[TLS および SSL 暗号化の設定](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-security.html#job-runs-apache-livy-security-tls)」を参照してください。 | FALSE | 
| imagePullSecrets | プライベートリポジトリから Livy イメージをプルするために使用する imagePullSecret の名前のリストです。 | [] | 
| リソース | Livy コンテナのリソースリクエストと制限です。 | \$1\$1 | 
| nodeSelector | Livy ポッドをスケジュールするノードです。 | \$1\$1 | 
| tolerations | 定義する Livy ポッドの許容度を含むリストです。 | [] | 
| affinity | Livy ポッドのアフィニティのルールです。 | \$1\$1 | 
| persistence.enabled | true の場合、セッションディレクトリの永続性を有効にします。 | FALSE | 
| persistence.subPath | セッションディレクトリにマウントする PVC サブパスです。 | "" | 
| persistence.existingClaim | 新しい PVC を作成する代わりに使用する PVC です。 | \$1\$1 | 
| persistence.storageClass | 使用するストレージクラスです。このパラメータを定義するには、storageClassName: <storageClass> 形式を使用します。このパラメータを "-" に設定すると、動的プロビジョニングが無効になります。このパラメータを null に設定するか、何も指定しない場合、Amazon EMR on EKS は storageClassName を設定せず、デフォルトのプロビジョナーを使用します。 | "" | 
| persistence.accessMode | PVC アクセスモードです。 | ReadWriteOnce | 
| persistence.size | PVC サイズです。 | 20Gi | 
| persistence.annotations | PVC の追加の注釈です。 | \$1\$1 | 
| env.\$1 | Livy コンテナに設定する追加の env です。詳細については、「[Livy のインストール中に独自の Livy と Spark の設定を入力する](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-troubleshooting.html)」を参照してください。 | \$1\$1 | 
| envFrom.\$1 | Kubernetes 設定マップまたはシークレットから Livy に設定する追加の env です。 | [] | 
| livyConf.\$1 | マウントされた Kubernetes 設定マップまたはシークレットから設定する追加の livy.conf エントリです。 | \$1\$1 | 
| sparkDefaultsConf.\$1 | マウントされた Kubernetes 設定マップまたはシークレットから設定する追加の spark-defaults.conf エントリです。 | \$1\$1 | 

# 一般的な環境変数の形式エラーのトラブルシューティング
<a name="job-runs-apache-livy-troubleshooting"></a>

Livy と Spark の設定を入力すると、サポートされていない環境変数の形式があり、エラーの原因となることがあります。この手順では、正しい形式を使用するための一連の手順を説明します。

**Livy のインストール中に独自の Livy と Spark の設定を入力する**

`env.*` Helm プロパティを使用して、任意の Apache Livy または Apache Spark の環境変数を設定できます。以下のステップに従って、サンプル設定 `example.config.with-dash.withUppercase` をサポートされている環境変数の形式に変換します。

1. 大文字を 1 と小文字に置き換えます。例えば、`example.config.with-dash.withUppercase` は `example.config.with-dash.with1uppercase` になります。

1. ダッシュ (-) を 0 に置き換えます。例えば、`example.config.with-dash.with1uppercase` は `example.config.with0dash.with1uppercase` になります。

1. ドット (.) をアンダースコア (\$1) に置き換えます。例えば、`example.config.with0dash.with1uppercase` は `example_config_with0dash_with1uppercase` になります。

1. 小文字をすべて大文字に置き換えます。

1. プレフィックス `LIVY_` を変数名に追加します。

1. helm チャートから Livy をインストールする際に、--set env.*YOUR\$1VARIABLE\$1NAME*.value=*yourvalue* 形式で変数を使用します。

例えば、Livy と Spark の設定 `livy.server.recovery.state-store = filesystem` と `spark.kubernetes.executor.podNamePrefix = my-prefix` を設定するには、次の Helm プロパティを使用します。

```
—set env.LIVY_LIVY_SERVER_RECOVERY_STATE0STORE.value=filesystem
—set env.LIVY_SPARK_KUBERNETES_EXECUTOR_POD0NAME0PREFIX.value=myprefix
```