

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 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 《 使用者指南*》中的[秘密加密和解密](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，並將其公開給外部 APIs。如果您指出金鑰值對包含存放在 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 擷取秘密值，請在建立秘密時新增下列政策陳述式。您必須使用客戶管理的 KMS 金鑰建立秘密，EMR Serverless 才能讀取秘密值。如需詳細資訊，請參閱*AWS Secrets Manager 《 使用者指南*》中的 [KMS 金鑰的許可](https://docs.aws.amazon.com/secretsmanager/latest/userguide/security-encryption.html#security-encryption-authz)。

在下列政策中，將 `applicationId`取代為應用程式的 ID。

**秘密的資源政策**

您必須在 中秘密的資源政策中包含下列許可 AWS Secrets Manager ，以允許 EMR Serverless 擷取秘密值。為了確保只有特定應用程式可以擷取此秘密，您可以選擇在政策中指定 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"
    }
  ]
}
```

------

使用下列 customer-managed 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 中的秘密值，您必須提交新任務，以便任務可以擷取更新的值。

**注意**  
已處於執行中狀態的任務無法擷取更新的秘密值。這可能會導致任務失敗。