

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

# EMR Serverless イメージのカスタマイズ
<a name="application-custom-image"></a>

Amazon EMR 6.9.0 以降では、カスタムイメージを使用して、Amazon EMR Serverless を使用してアプリケーションの依存関係とランタイム環境を 1 つのコンテナにパッケージ化します。これにより、ワークロードの依存関係を管理する方法が簡単になり、パッケージの移植性が向上します。EMR Serverless イメージをカスタマイズすると、次の利点が得られます。
+ ワークロードに最適化されたパッケージをインストールして設定します。これらのパッケージは、Amazon EMR ランタイム環境のパブリックディストリビューションでは広範囲に利用できません。
+ EMR Serverless をローカルでの開発やテストなど、組織内で現在確立されているビルド、テスト、デプロイの各プロセスと統合します。
+ 組織内のコンプライアンスとガバナンスに関する要件を満たす、確立されたセキュリティプロセス (イメージスキャンなど) を適用します。
+ アプリケーションに独自のバージョンの JDK と Python を使用できます。

EMR Serverless には、独自のイメージを作成するときにベースとして使用するイメージが用意されています。ベースイメージは、イメージが EMR Serverless とやり取りするための必須のジャー、設定、ライブラリを備えています。ベースイメージは、[Amazon ECR Public Gallery](https://gallery.ecr.aws/emr-serverless/) で取得できます。アプリケーションタイプ (Spark または Hive) とリリースバージョンに一致するイメージを使用します。例えば、Amazon EMR リリース 6.9.0 でアプリケーションを作成する場合は、次のイメージを使用します。


| タイプ | Image | 
| --- | --- | 
|  Spark  |  `public.ecr.aws/emr-serverless/spark/emr-6.9.0:latest`  | 
|  [Hive]  |  `public.ecr.aws/emr-serverless/hive/emr-6.9.0:latest`  | 

## 前提条件
<a name="worker-configs"></a>

EMR Serverless カスタムイメージを作成する前に、以下の前提条件を満たすようにしてください。

1. EMR Serverless アプリケーションの起動に使用する AWS リージョン のと同じ に Amazon ECR リポジトリを作成します。Amazon ECR プライベートリポジトリを作成するには、「[Creating a private repository](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)」を参照してください。

1. Amazon ECR リポジトリへのアクセス権をユーザーに付与するには、このリポジトリのイメージを使用して EMR Serverless アプリケーションを作成または更新するユーザーとロールに次のポリシーを追加します。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "ECRRepositoryListGetPolicy",
         "Effect": "Allow",
         "Action": [
           "ecr:GetDownloadUrlForLayer",
           "ecr:BatchGetImage",
           "ecr:DescribeImages"
         ],
         "Resource": [
           "arn:aws:ecr:*:123456789012:repository/my-repo"
         ]
       }
     ]
   }
   ```

------

   Amazon ECR アイデンティティベースのポリシーのその他の例については、「[Amazon Elastic Container Registry identity-based policy examples](https://docs.aws.amazon.com/AmazonECR/latest/userguide/security_iam_id-based-policy-examples.html)」を参照してください。

## ステップ 1: EMR Serverless ベースイメージからカスタムイメージを作成する
<a name="create-image"></a>

まず、任意のベースイメージを使用する `FROM` 指示で始まる [Dockerfile](https://docs.docker.com/engine/reference/builder/) を作成します。`FROM` 指示の後、イメージに加える必要がある変更を追加します。ベースイメージは、`USER` を自動的に `hadoop` に設定します。この設定には、追加するすべての変更に対するアクセス許可がありません。回避策として、`USER` を `root` に設定し、イメージを変更してから、`USER` を `hadoop:hadoop` に戻します。一般的なユースケースのサンプルを参照するには、「[EMR Serverless でのカスタムイメージの使用](using-custom-images.md)」を参照してください。

```
# Dockerfile
FROM public.ecr.aws/emr-serverless/spark/emr-6.9.0:latest

USER root
# MODIFICATIONS GO HERE

# EMRS runs the image as hadoop
USER hadoop:hadoop
```

Dockerfile を取得したら、次のコマンドを使用してイメージを構築します。

```
# build the docker image
docker build . -t aws-account-id.dkr.ecr.region.amazonaws.com/my-repository[:tag]or[@digest]
```

## ステップ 2: イメージをローカルで検証する
<a name="validate"></a>

EMR Serverless は、カスタムイメージを静的にチェックして、基本的なファイル、環境変数、および正しいイメージ設定を検証できるオフラインツールを備えています。ツールをインストールして実行する方法については、「[Amazon EMR Serverless Image CLI GitHub](https://github.com/awslabs/amazon-emr-serverless-image-cli)」を参照してください。

ツールをインストールしたら、次のコマンドを実行してイメージを検証します。

```
amazon-emr-serverless-image \
validate-image -r emr-6.9.0 -t spark \
-i aws-account-id.dkr.ecr.region.amazonaws.com/my-repository:tag/@digest
```

以下のような出力が表示されます:

```
Amazon EMR Serverless - Image CLI
Version: 0.0.1
... Checking if docker cli is installed
... Checking Image Manifest
[INFO] Image ID: 9e2f4359cf5beb466a8a2ed047ab61c9d37786c555655fc122272758f761b41a
[INFO] Created On: 2022-12-02T07:46:42.586249984Z
[INFO] Default User Set to hadoop:hadoop : PASS
[INFO] Working Directory Set to  : PASS
[INFO] Entrypoint Set to /usr/bin/entrypoint.sh : PASS
[INFO] HADOOP_HOME is set with value: /usr/lib/hadoop : PASS
[INFO] HADOOP_LIBEXEC_DIR is set with value: /usr/lib/hadoop/libexec : PASS
[INFO] HADOOP_USER_HOME is set with value: /home/hadoop : PASS
[INFO] HADOOP_YARN_HOME is set with value: /usr/lib/hadoop-yarn : PASS
[INFO] HIVE_HOME is set with value: /usr/lib/hive : PASS
[INFO] JAVA_HOME is set with value: /etc/alternatives/jre : PASS
[INFO] TEZ_HOME is set with value: /usr/lib/tez : PASS
[INFO] YARN_HOME is set with value: /usr/lib/hadoop-yarn : PASS
[INFO] File Structure Test for hadoop-files in /usr/lib/hadoop: PASS
[INFO] File Structure Test for hadoop-jars in /usr/lib/hadoop/lib: PASS
[INFO] File Structure Test for hadoop-yarn-jars in /usr/lib/hadoop-yarn: PASS
[INFO] File Structure Test for hive-bin-files in /usr/bin: PASS
[INFO] File Structure Test for hive-jars in /usr/lib/hive/lib: PASS
[INFO] File Structure Test for java-bin in /etc/alternatives/jre/bin: PASS
[INFO] File Structure Test for tez-jars in /usr/lib/tez: PASS
-----------------------------------------------------------------
Overall Custom Image Validation Succeeded.
-----------------------------------------------------------------
```

## ステップ 3: イメージを Amazon ECR リポジトリにアップロードする
<a name="upload-image"></a>

以下のコマンドを使用して、Amazon ECR リポジトリに ECR イメージをプッシュします。イメージをリポジトリにプッシュするための正しい IAM アクセス許可があることを確認します。詳細については、「*Amazon ECR ユーザーガイド*」の「[Pushing an image](https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-push.html)」を参照してください。

```
# login to ECR repo
aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws-account-id.dkr.ecr.region.amazonaws.com

# push the docker image
docker push aws-account-id.dkr.ecr.region.amazonaws.com/my-repository:tag/@digest
```

## ステップ 4: カスタムイメージを使用してアプリケーションを作成または更新する
<a name="create-app"></a>

アプリケーションを起動する方法に従って AWS CLI タブ AWS マネジメントコンソール を選択し、次の手順を実行します。

------
#### [ Console ]

1. [https://console.aws.amazon.com/emr](https://console.aws.amazon.com/emr) で EMR Studio コンソールにサインインします。アプリケーションに移動するか、「[アプリケーションの作成](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/studio.html#studio-create-app)」の手順で新しいアプリケーションを作成します。

1. EMR Serverless アプリケーションを作成または更新するときにカスタムイメージを指定するには、アプリケーション設定オプションで **[カスタム設定]** を選択します。

1. **[カスタムイメージ設定]** セクションで、**[このアプリケーションでカスタムイメージを使用する]** チェックボックスをオンにします。

1. Amazon ECR イメージ URI を **[イメージ URI]** フィールドに貼り付けます。EMR Serverless は、アプリケーションのすべてのワーカータイプにこのイメージを使用します。または、**[異なるカスタムイメージ]** を選択し、ワーカータイプごとに異なる Amazon ECR イメージ URI を貼り付けることができます。

------
#### [ CLI ]
+ `image-configuration` パラメータを使用してアプリケーションを作成します。EMR Serverless は、この設定をすべてのワーカータイプに適用します。

  ```
  aws emr-serverless create-application \
  --release-label emr-6.9.0 \
  --type SPARK \
  --image-configuration '{
      "imageUri": "aws-account-id.dkr.ecr.region.amazonaws.com/my-repository:tag/@digest"
  }'
  ```

  ワーカータイプごとに異なるイメージ設定を持つアプリケーションを作成するには、`worker-type-specifications` パラメータを使用します。

  ```
  aws emr-serverless create-application \
  --release-label emr-6.9.0 \
  --type SPARK \
  --worker-type-specifications '{
      "Driver": {
          "imageConfiguration": {
              "imageUri": "aws-account-id.dkr.ecr.region.amazonaws.com/my-repository:tag/@digest"
          }
      },
      "Executor" : {
          "imageConfiguration": {
              "imageUri": "aws-account-id.dkr.ecr.region.amazonaws.com/my-repository:tag/@digest"
          }
      }
  }'
  ```

  アプリケーションを更新するには、`image-configuration` パラメータを使用します。EMR Serverless は、この設定をすべてのワーカータイプに適用します。

  ```
  aws emr-serverless update-application \
  --application-id application-id \
  --image-configuration '{
      "imageUri": "aws-account-id.dkr.ecr.region.amazonaws.com/my-repository:tag/@digest"
  }'
  ```

------

## ステップ 5: EMR Serverless がカスタムイメージリポジトリにアクセスできるようにする
<a name="access-repo"></a>

Amazon ECR リポジトリに次のリソースポリシーを追加して、EMR Serverless サービスプリンシパルがこのリポジトリの `get`、`describe`、`download` のリクエストを使用できるようにします。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "EmrServerlessCustomImageSupport",
      "Effect": "Allow",
      "Action": [
        "ecr:BatchGetImage",
        "ecr:DescribeImages",
        "ecr:GetDownloadUrlForLayer"
      ],
      "Resource": "arn:aws:ecr:*:123456789012:repository/my-repo",
      "Condition": {
        "ArnLike": {
          "aws:SourceArn": "arn:aws:emr-serverless:*:123456789012:/applications/*"
        }
      }
    }
  ]
}
```

------

セキュリティのベストプラクティスとして、リポジトリポリシーに `aws:SourceArn` 条件キーを追加します。IAM グローバル条件キー `aws:SourceArn` は、EMR Serverless がアプリケーション ARN にのみリポジトリを使用するようにします。Amazon ECR リポジトリポリシーの詳細については、「[Creating a private repository](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policies.html)」を参照してください。

## 考慮事項と制限事項
<a name="considerations"></a>

カスタムイメージを使用して作業する場合は、次の点を考慮してください。
+ アプリケーションのタイプ (Spark または Hive) とリリースラベル (`emr-6.9.0` など) に一致する正しいベースイメージを使用します。
+ EMR Serverless は、Docker ファイル内の `[CMD]` または `[ENTRYPOINT]` の指示を無視します。`[COPY]`、`[RUN]`、`[WORKDIR]` など Docker ファイルで一般的な手順を使用します。
+ カスタムイメージを作成するときに、環境変数 `JAVA_HOME`、`SPARK_HOME`、`HIVE_HOME`、`TEZ_HOME` を変更しないでください。
+ カスタムイメージのサイズは 10 GB を超えることはできません。
+ Amazon EMR ベースイメージのバイナリまたはジャーを変更することにより、アプリケーションまたはジョブの起動に失敗する可能性があります。
+ Amazon ECR リポジトリは、EMR Serverless アプリケーションの起動に使用する AWS リージョン のと同じ にある必要があります。