【问题标题】:Bundle Git SSH keys into a private AMI将 Git SSH 密钥捆绑到私有 AMI
【发布时间】:2015-01-31 09:56:36
【问题描述】:

我有一个 EC2 实例,它运行一个托管在私有 git 存储库上的应用程序。

我需要能够从我的主服务器启动其中的许多。目前,我有 5 个固定的“worker”实例,我从 master 启动/停止没有问题。每个工作人员启动、提取 repo 并在启动时启动应用程序。这显然不是一个好的解决方案,我想让它更灵活(启动尽可能多的实例等)。配置和包是最终的,所以我觉得将它们全部捆绑到一个 AMI 中感觉很好。

有没有办法让我将我的 git 密钥捆绑到 AMI 中,以便启动许多类似的实例并让它们在启动时拉动并启动我的应用程序,而无需连接到每个实例并输入密码?有没有更好的办法?我已经阅读了有关 cloud-init、用户数据、puppet 和许多其他内容的信息,但我对这件事还很陌生,找不到使用 ssh 密钥的合适示例。

【问题讨论】:

    标签: linux git amazon-web-services amazon-ec2 amazon-ami


    【解决方案1】:

    我建议您不要将密钥与 AMI 捆绑在一起,而是将它们与 AMI 分开,因为:

    1. 如果您更改 git 密钥,则无需构建新的 AMI
    2. 有权从您的 AMI 启动实例的未授权用户无法启动您的应用程序

    我建议使用用户数据功能。您可以选择加密您的密钥并根据需要对其进行 base64 编码。当您手动或使用 CLI/API 启动实例时,您可以传递实例启动后可以访问的密钥。有多种方法可以访问数据(python、curl 等等)。我建议您使用 AWS 元数据服务器,因为您的实例不需要您的 AWS 凭证来获取用户数据。启动实例后,让您的应用进行以下调用,获取密钥,然后拉取存储库:

    curl http://169.254.169.254/latest/user-data
    

    返回您的元数据(无需凭据)。您可以选择 base64decode 和解密您的密钥并使用它来提取 repo。如果您不想要额外的安全性,您可以绕过 encrypt/base64 部分。

    【讨论】:

    • 感谢您的回答!所以,总结一下,我需要:创建一个用户数据脚本,粘贴我的私钥、公钥和已知主机(所以我不必接受指纹),运行 ssh-agent,然后克隆 repo?那么我只需要在启动时卷曲它吗?对不起,我有点困惑
    • 是的。制作一个自包含的脚本,它将密钥、已知主机复制到正确的位置,并克隆存储库。在启动实例时将内容复制到用户数据字段之前,请在本地计算机上验证脚本。
    • AWS 需要 base64 编码格式的用户数据。如果您使用 AWS 控制面板,可以选择让 AWS 将其编码为 base64。如果您使用的是 API/CLI,请从文档中了解 API/CLI 是否希望您对数据进行编码。如果在启动您的实例后,如果您没有看到所需的结果:cd /var/lib/cloud/instance/scripts。你应该在那里看到你的脚本。尝试运行脚本、调试、修复脚本并在启动实例时将其用作用户数据。我已经这样做了很多次,所以如果您没有看到想要的结果,请随时向我提问。
    • 可能还值得一提的是,日志可以在/var/log/cloud-init-output.log 中找到,非常感谢您的帮助!
    猜你喜欢
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    相关资源
    最近更新 更多