如何在 AWS EMR bootstrap 脚本中*安全地*安装来自 github 的 python 私有包

How to *safely* install a python private package from github in an AWS EMR bootstrap script

我想将 Python3 包从私有 Github 存储库安装到 AWS EMR Spark 集群上。

我知道如何通过对凭据进行硬编码来以肮脏的方式执行此操作,但是推荐的安全执行此操作的最佳做​​法是什么?我不想将凭据存储在 bootstrap 脚本中...

提前致谢。

警告:我没有使用过自定义 EMR 引导脚本,但我认为它们与常规用户数据脚本没有太大区别。

有一些选项:

  1. Systems Manager Parameter Store: 这本质上类似于 AWS 中的 windows 注册表,一个区域键值存储。您可以在此处以 my/git/credentials 等名称存储您的凭据,甚至可以使用密钥管理服务对其进行加密。然后,在您的引导脚本中,您可以使用 AWS CLI 请求凭据,并使用它们连接到私有 git 存储库。这需要集群的实例角色有权访问该参数(以及 KMS 密钥,如果您已加密该值)
  2. Secrets Manager:大体思路类似于SSM参数存储。秘密管理器还允许您以安全的方式存储您的凭据,在这种情况下加密是强制性的。它甚至提供生命周期挂钩,以在您需要时定期更新凭据。您可以在引导脚本中使用我在选项 1) 中描述的相同技术。在权限方面的要求是相似的,虽然你肯定要在这里添加 KMS 权限和 Secrets Manger 权限。在这种情况下,您必须解析来自 Secrets Manager 的 JSON 响应。

我个人会从选项 1 入手,它会更便宜。如果您有特定的 audit/regulatory 要求,我会考虑选项 2 - 它稍微复杂一些。

感谢 Maurice,我已经按照他的选项 #2 成功实施了一个安全流程。

  1. 在 github 上使用读取凭据创建访问令牌。

  2. 将其存储在 AWS Secrets Manager 中。在我的例子中,我将这个秘密命名为“github-read-access”

  3. 将此机密的访问权限授予要查询它的用户,或者在 bootstrap EMR 脚本的情况下,授予 EMR 角色。

  4. 使用 aws CLI,我将令牌存储为环境变量并使用以下命令安装包:

    export GITHUB_TOKEN=`aws secretsmanager get-secret-value --secret-id github-read-access |grep SecretString|cut -d ":" -f 3|cut -d '"' -f 2 |cut -d '\' -f1`
    sudo pip3 install git+https://${GITHUB_TOKEN}@github.com/<USER_NAME>/<REPO_NAME>.git