

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

# EMR Serverless によるデータ保護のための Secrets Manager
<a name="secrets-manager"></a>

AWS Secrets Manager は、データベース認証情報、API キー、およびその他のシークレット情報を保護するためのシークレットストレージサービスです。次に、コード内で、ハードコードされた認証情報を Secrets Manager への API コールに置き換えます。シークレットはそこに存在しないため､お客様のコードを調べている誰かがシークレットを漏らさないようにするのに役立ちます。この概要については、「[AWS Secrets Manager ユーザーガイド](https://docs.aws.amazon.com/secretsmanager/latest/userguide)」を参照してください。

Secrets Manager は、 AWS Key Management Service キーを使用してシークレットを暗号化します。詳細については、「*AWS Secrets Manager ユーザーガイド*」の「[Secret encryption and decryption](https://docs.aws.amazon.com/secretsmanager/latest/userguide/security-encryption.html)」を参照してください。

指定したスケジュールに従って自動的にシークレットを更新するように Secrets Manager を設定することができます。これにより、長期のシークレットを短期のシークレットに置き換えることが可能となり、侵害されるリスクが大幅に減少します。詳細については、「*AWS Secrets Manager ‬ ユーザーガイド*」の「[AWS Secrets Manager シークレットのローテーション](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html)」を参照してください。

Amazon EMR Serverless は と統合 AWS Secrets Manager されているため、データを Secrets Manager に保存し、設定でシークレット ID を使用できます。

## EMR Serverless がシークレットを使用する方法
<a name="secrets-manager-how"></a>

Secrets Manager にデータを保存して、EMR Serverless の設定でシークレット ID を使用する場合、機密設定データをプレーンテキストで EMR Serverless に渡したり、外部 API に公開したりすることはありません。キーと値のペアに Secrets Manager に保存したシークレットのシークレット ID が含まれていることを示すと、EMR Serverless は実行中のジョブの設定データをワーカーに送信するときにシークレットを取得します。

設定のキーと値のペアに Secrets Manager に保存したシークレットへの参照が含まれていることを示すには、設定値に `EMR.secret@` 注釈を追加します。シークレット ID 注釈を持つ設定プロパティの場合、EMR Serverless は Secrets Manager を呼び出し、ジョブの実行時にシークレットを解決します。

## シークレットを作成する方法
<a name="secrets-manager-create"></a>

シークレットを作成するには、*AWS Secrets Manager 「 ユーザーガイド*」の[「 AWS Secrets Manager シークレットを作成する](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)」の手順に従います。**ステップ 3** では、**[プレーンテキスト]** フィールドを選択して機密値を入力します。

## シークレットを設定分類で指定する
<a name="secrets-manager-examples"></a>

次の例は、`StartJobRun` の設定分類でシークレットを指定する方法をデモンストレーションしています。アプリケーションレベルで Secrets Manager の分類を設定する場合は、「[EMR Serverless のデフォルトのアプリケーション設定](default-configs.md)」を参照してください。

この例では、`SecretName` を取得するシークレットの名前に置き換えます。詳細については、[シークレットを作成する方法](#secrets-manager-create) を参照してください。

**Topics**
+ [シークレットリファレンスを指定する - Spark](#secrets-manager-examples-spark)
+ [シークレットリファレンスを指定する - Hive](#secrets-manager-examples-hive)

### シークレットリファレンスを指定する - Spark
<a name="secrets-manager-examples-spark"></a>

**Example – Spark の外部 Hive メタストア設定でシークレットリファレンスを指定する**  

```
aws emr-serverless start-job-run \
  --application-id "application-id" \
  --execution-role-arn "job-role-arn" \
  --job-driver '{
        "sparkSubmit": {
            "entryPoint": "s3://amzn-s3-demo-bucket/scripts/spark-jdbc.py",
            "sparkSubmitParameters": "--jars s3://amzn-s3-demo-bucket/mariadb-connector-java.jar 
            --conf spark.hadoop.javax.jdo.option.ConnectionDriverName=org.mariadb.jdbc.Driver 
            --conf spark.hadoop.javax.jdo.option.ConnectionUserName=connection-user-name 
            --conf spark.hadoop.javax.jdo.option.ConnectionPassword=EMR.secret@SecretName
            --conf spark.hadoop.javax.jdo.option.ConnectionURL=jdbc:mysql://db-host:db-port/db-name 
            --conf spark.driver.cores=2
            --conf spark.executor.memory=10G 
            --conf spark.driver.memory=6G 
            --conf spark.executor.cores=4"
        }
    }' \
    --configuration-overrides '{
        "monitoringConfiguration": {
        "s3MonitoringConfiguration": {
            "logUri": "s3://amzn-s3-demo-bucket/spark/logs/"
        }
    }
}'
```

**Example – `spark-defaults` 分類で外部 Hive メタストア設定のシークレットリファレンスを指定する**  

```
{
        "classification": "spark-defaults",
        "properties": {
            "spark.hadoop.javax.jdo.option.ConnectionDriverName":"org.mariadb.jdbc.Driver"
            "spark.hadoop.javax.jdo.option.ConnectionURL":"jdbc:mysql://db-host:db-port/db-name"
            "spark.hadoop.javax.jdo.option.ConnectionUserName":"connection-user-name"  
            "spark.hadoop.javax.jdo.option.ConnectionPassword": "EMR.secret@SecretName",
        }
    }
```

### シークレットリファレンスを指定する - Hive
<a name="secrets-manager-examples-hive"></a>

**Example – Hive の外部 Hive メタストア設定でシークレットリファレンスを指定する**  

```
aws emr-serverless start-job-run \
  --application-id "application-id" \
  --execution-role-arn "job-role-arn" \
    --job-driver '{
        "hive": {
        "query": "s3://amzn-s3-demo-bucket/emr-serverless-hive/query/hive-query.ql",
        "parameters": "--hiveconf hive.exec.scratchdir=s3://amzn-s3-demo-bucket/emr-serverless-hive/hive/scratch 
                    --hiveconf hive.metastore.warehouse.dir=s3://amzn-s3-demo-bucket/emr-serverless-hive/hive/warehouse  
                    --hiveconf javax.jdo.option.ConnectionUserName=username
                    --hiveconf javax.jdo.option.ConnectionPassword=EMR.secret@SecretName 
                    --hiveconf hive.metastore.client.factory.class=org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClientFactory 
                    --hiveconf javax.jdo.option.ConnectionDriverName=org.mariadb.jdbc.Driver 
                    --hiveconf javax.jdo.option.ConnectionURL=jdbc:mysql://db-host:db-port/db-name"
        }
    }' \
    --configuration-overrides '{
        "monitoringConfiguration": {
        "s3MonitoringConfiguration": {
            "logUri": "s3://amzn-s3-demo-bucket"
        }
    }
}'
```

**Example – `hive-site` 分類で外部 Hive メタストア設定のシークレットリファレンスを指定する**  

```
{
    "classification": "hive-site",
    "properties": {
        "hive.metastore.client.factory.class": "org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClientFactory",
        "javax.jdo.option.ConnectionDriverName": "org.mariadb.jdbc.Driver",
        "javax.jdo.option.ConnectionURL": "jdbc:mysql://db-host:db-port/db-name",
        "javax.jdo.option.ConnectionUserName": "username",
        "javax.jdo.option.ConnectionPassword": "EMR.secret@SecretName"
    }
}
```

## EMR Serverless にアクセス権を付与してシークレットを取得する
<a name="secrets-manager-permission"></a>

EMR Serverless が Secrets Manager からシークレット値を取得できるようにするには、クラスターを作成するときにシークレットに次のポリシーステートメントを追加します。EMR Serverless がシークレット値を読み取るには、カスタマーマネージド KMS キーを使用してシークレットを作成する必要があります。詳細については、「*AWS Secrets Manager ユーザーガイド*」の「[Permissions for the KMS key](https://docs.aws.amazon.com/secretsmanager/latest/userguide/security-encryption.html#security-encryption-authz)」を参照してください。

次のポリシーでは、`applicationId` をアプリケーションの ID に置き換えます。

**シークレットのリソースポリシー**

EMR Serverless がシークレット値を取得できるようにするには、 AWS Secrets Manager のシークレットのリソースポリシーに次のアクセス許可を含める必要があります。特定のアプリケーションのみがこのシークレットを取得できるようにするには、オプションでポリシーの条件として EMR Serverless アプリケーション ID を指定できます。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetSecretValue",
        "secretsmanager:DescribeSecret"
      ],
      "Resource": [
        "*"
      ],
      "Condition": {
        "StringEquals": {
          "aws:SourceArn": "arn:aws:emr-serverless:*:123456789012:/applications/*"
        }
      },
      "Sid": "AllowSECRETSMANAGERGetsecretvalue"
    }
  ]
}
```

------

カスタマーマネージド AWS Key Management Service (AWS KMS) キーの次のポリシーを使用してシークレットを作成します。

**カスタマーマネージド AWS KMS キーのポリシー**

```
{
    "Sid": "Allow EMR Serverless to use the key for decrypting secrets",
    "Effect": "Allow",
    "Principal": {
        "Service": [
            "emr-serverless.amazonaws.com"
        ]
    },
    "Action": [
        "kms:Decrypt",
        "kms:DescribeKey"
    ],
    "Resource": "*",
    "Condition": {
        "StringEquals": {
            "kms:ViaService": "secretsmanager.AWS リージョン.amazonaws.com"
        }
    }
}
```

## シークレットのローテーション
<a name="secrets-manager-rotate"></a>

*ローテーション*とは、シークレットを定期的に更新することです。 AWS Secrets Manager を設定して､指定したスケジュールで自動的にシークレットをローテーションするようにすることができます。そうすれば、長期のシークレットを短期のシークレットに置き換えることができます。これにより、侵害のリスクを減らすことができます。EMR Serverless は、ジョブが実行中状態に移行すると、注釈付き設定からシークレット値を取得します。お客様またはプロセスが Secrets Manager のシークレット値を更新する場合は、ジョブが更新された値を取得できるように、新しいジョブを送信する必要があります。

**注記**  
既に実行中の状態のジョブは、更新されたシークレット値を取得できません。これにより、ジョブが失敗する可能性があります。