本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 EMR Serverless 進行資料保護的 Secrets Manager
AWS Secrets Manager 是一項秘密儲存服務,可用來保護資料庫憑證、API金鑰和其他秘密資訊。然後,您可以在程式碼中將硬式編碼憑證取代為 Secrets Manager 的API呼叫。這有助於確保檢查程式碼的人員不會洩露機密,因為機密不存在。如需概觀,若要取得概述,請參閱《AWS Secrets Manager 使用指南》。
Secrets Manager 使用 AWS Key Management Service 金鑰加密秘密。如需詳細資訊,請參閱 AWS Secrets Manager 使用者指南 中的秘密加密和解密。
您可以設定 Secrets Manager 根據您指定的排程自動輪換秘密。這可讓您以短期秘密取代長期秘密,有助於大幅降低洩漏風險。如需詳細資訊,請參閱 AWS Secrets Manager 使用者指南 中的輪換 AWS Secrets Manager 秘密。
Amazon EMR Serverless 與 整合 AWS Secrets Manager ,以便您可以將資料存放在 Secrets Manager 中,並在組態中使用秘密 ID。
EMR Serverless 如何使用秘密
當您將資料儲存在 Secrets Manager 中並在無EMR伺服器組態中使用秘密 ID 時,不會以純文字將敏感組態資料傳遞至無EMR伺服器,並將其公開至外部 APIs。如果您指出金鑰值對包含存放在 Secrets Manager 中秘密的秘密 ID,EMR則 Serverless 會在將組態資料傳送給工作者執行任務時擷取秘密。
若要指出組態的鍵值對包含儲存在 Secrets Manager 中的秘密參考,請將EMR.secret@
註釋新增至組態值。對於具有秘密 ID 註釋的任何組態屬性,無EMR伺服器會呼叫 Secrets Manager,並在任務執行時解析秘密。
如何建立秘密
若要建立秘密,請遵循 AWS Secrets Manager 使用者指南 中的建立 AWS Secrets Manager 秘密中的步驟。在步驟 3 中,選擇純文字欄位以輸入您的敏感值。
在組態分類中提供秘密
下列範例示範如何在 的組態分類中提供秘密StartJobRun
。如果您想要在應用程式層級設定 Secrets Manager 的分類,請參閱 EMR Serverless 的預設應用程式組態。
在範例中,
將 取代為要擷取的秘密名稱。包含連字號,後面接著 Secrets Manager 新增至秘密 結尾的六個字元ARN。如需詳細資訊,請參閱如何建立秘密。SecretName
指定秘密參考 - Spark
範例 – 在 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/" } } }'
範例 – 在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
範例 – 在 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
" } } }'
範例 – 在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 擷取秘密的存取權
若要允許 EMR Serverless 從 Secrets Manager 擷取秘密值,請在建立時將下列政策陳述式新增至您的秘密。您必須使用客戶管理的KMS金鑰建立秘密,EMRServerless 才能讀取秘密值。如需詳細資訊,請參閱 AWS Secrets Manager 使用者指南 中的KMS金鑰許可。
在下列政策中,
將 取代為應用程式的 ID。applicationId
秘密的資源政策
您必須在 中的秘密資源政策中包含下列許可 AWS Secrets Manager ,才能允許 EMR Serverless 擷取秘密值。為了確保只有特定應用程式可以擷取此秘密,您可以選擇在政策中指定無EMR伺服器應用程式 ID 作為條件。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret" ], "Principal": { "Service": [ "emr-serverless.amazonaws.com" ] }, "Resource": [ "*" ], "Condition": { "StringEquals": { "aws:SourceArn": "arn:aws:emr-serverless:
AWS 區域
:aws_account_id
:/applications/applicationId
" } } } ] }
使用下列客戶受管 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" } } }
輪換秘密
輪換是指定期更新秘密。您可以設定 AWS Secrets Manager ,依您指定的排程自動輪換秘密。如此一來,您可以將長期秘密取代為短期秘密。這有助於降低入侵的風險。EMR 當任務轉換為執行中狀態時,無伺服器會從註釋組態擷取秘密值。如果您或 程序更新 Secrets Manager 中的秘密值,則必須提交新任務,以便任務能夠擷取更新的值。
注意
已處於執行中狀態的任務無法擷取更新的秘密值。這可能會導致任務失敗。