在 AWS EMR PySpark 作业中管理机密

Managing secrets in AWS EMR PySpark job

我有一个 EMR PySpark 作业需要访问第 3 方拥有的 s3 存储桶。

PySpark 作业存储在 s3://mybucket/job.py 上并作为步骤提交

        {
            "Name": "Process promo_regs",
            "ActionOnFailure": "TERMINATE_CLUSTER",
            "HadoopJarStep": {
                "Jar": "command-runner.jar",
                "Args": ["spark-submit", "--master", "yarn", "--deploy-mode cluster", "s3://mybucket.job.py"],
            }
        }

job.py我配置了一个boto3 s3客户端。

from pyspark.sql import SparkSession
import boto3

# How to inject this?
env = {
    'AWS_ACCESS_KEY_ID': '',
    '#AWS_SECRET_ACCESS_KEY': '',
    'AWS_REGION_NAME': ''

}
s3 = boto3.client(
    's3',
    aws_access_key_id=env['AWS_ACCESS_KEY_ID'],
    aws_secret_access_key=env['#AWS_SECRET_ACCESS_KEY'],
    region_name=env['AWS_REGION_NAME'],

spark = (SparkSession
         .builder
         .appName("Test processing dummy data")
         .getOrCreate())


将访问密钥安全地注入脚本的选项有哪些?

如果重要的话,我正在启动集群并使用 boto3.client('emr').run_job_flow() 提交作业

我想到了两种方法:

  1. 要求第 3 方将一项策略添加到他们的 S3 存储桶中。

说明:您的 EMR 集群(位于账户 A 中)将有一个 IAM 用户 。请他们授予从帐户 B 到您的帐户 A EMR_EC2_ROLE 的访问权限。 您可以找到更多详细信息 .

  1. 如果这不可行,您可以使用 AWS Secret Manager。授予 EMR_EC2_ROLE 权限。使用 boto3 在运行时获取详细信息。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "secretsmanager:GetSecretValue"
            ],
            "Resource": "arn:aws:secretsmanager:us-east-1:<account-no>:secret:<Secret prefix if you have any>*",
            "Effect": "Allow",
            "Sid": "VisualEditor0"
        }
    ]
}