在 Elastic Beanstalk 上为 GitHub 私有仓库访问设置 SSH 密钥

10

我的 Node.JS 项目中包含对托管在 GitHub 上的私有 NPM 存储库的引用。这在本地运行良好,但我无法让其在 Elastic Beanstalk 上正常工作。

dependencies: {
  ...
  "express": "^4.12.4",
  "jsonwebtoken": "^5.0.5",
  "my-private-module": "git@github.com:<my-user>/<my-repo>.git#<my-version>",
  ...
}
我需要的是在我的Elastic Beanstalk实例上设置一个可工作的SSH配置,以便于可以从github上克隆代码库,而无需将密钥等信息存储在源代码管理中。显然,EB实例没有所需的SSH密钥来访问我的私有github repos。如果我使用带有内联username:password @ github.com的HTTPS风格的git URL,则可以正常工作。使用GitHub提供的OAuth令牌方法也可以正常工作(本质上是user:pass),但我不想将任何凭据检入到源代码管理中,因此我正在尝试通过SSH在我的EB实例上从github进行克隆操作。 我已经尝试了各种方式,包括根据这篇博客文章进行的npm preinstall脚本,该脚本曾经在npm2中起作用,在该版本中更改后,preinstall在构建树后运行,并且修复该问题的PR仍在等待审核。

我还尝试了各种不同的方法,包括使用.ebextensions在我的EB实例上设置SSH,包括来自上述博客文章评论中的此解决方案。 这基本上是我现在所卡住的地方.

我已成功创建了一个密钥对,将其设置在我的github个人资料中,并验证了私有密钥可从我的本地客户端使用以克隆我的代码库。 我已将私钥和ssh配置文件放在私有S3存储桶中。 我已经创建了一个.ebextensionsfiles配置,该配置将这两个文件从我的S3存储桶复制到/tmp/.ssh/中,根据此示例。 我已经创建了一个调试commands.ebextensions配置,它列出了/tmp/.ssh并显示文件已成功从S3下载:
Host github.com
    IdentityFile /tmp/.ssh/deploy_key
    IdentitiesOnly yes
    UserKnownHostsFile=/dev/null
    StrictHostKeyChecking no

/tmp/.ssh/deploy_key 包含了我的私钥,本地验证通过。

然而,git 仍然报错:

npm ERR! Command failed: git clone --template=/tmp/.npm/_git-remotes/_templates --mirror ssh://git@github.com/[.....]
npm ERR! Cloning into bare repository '/tmp/.npm/_git-remotes/git-ssh-git-github-com-[...]
npm ERR! Host key verification failed.
npm ERR! fatal: Could not read from remote repository.
npm ERR! 
npm ERR! Please make sure you have the correct access rights
npm ERR! and the repository exists.

我现在已经没有什么创意了。我最好的猜测是,/tmp/.ssh可能不是git用来查找ssh配置文件的路径 - 这可能是在提出链接解决方案时发生的,但在以后的AMI中可能已经改变。 EB启动时使用的环境似乎有点受限制; 命令作为用户nodejs运行,但即使$HOME没有设置,/tmp似乎仍然被用作主目录。

我该如何让git获取我的SSH配置文件,并因此使用我的SSH密钥?我该如何找出git查找SSH配置文件的位置?通常它在~ /.ssh中,但由于未设置$HOME,所以…这应该很容易,但让我感到抓狂。

1个回答

16

在经过一整天的努力并最终偶然发现之前错过的一个非常类似问题的答案后,我发现将ssh密钥放置在/root/.ssh而不是/tmp/.ssh或者/home/ec2-user/.ssh才是让git在EB上识别它们的正确位置。

我的最终配置(假设私有SSH密钥位于S3存储桶的<my-bucket>/github-eb-key位置,并且相应的公钥已经注册给了拥有访问repo权限的github用户),使用配置为64位Amazon Linux 2016.09 v3.3.0运行Node.js的AMI,在.ebextensions/01_ssh_setup.config中包含以下内容:

Resources: 
  AWSEBAutoScalingGroup: 
    Metadata: 
      ? "AWS::CloudFormation::Authentication"
      : 
        S3Auth: 
          buckets: 
            - <my-bucket>
          roleName: 
            ? "Fn::GetOptionSetting"
            : 
              DefaultValue: aws-elasticbeanstalk-ec2-role
              Namespace: "aws:asg:launchconfiguration"
              OptionName: IamInstanceProfile
          type: s3
files: 
  /root/.ssh/github-eb-key: 
    authentication: S3Auth
    mode: "000600"
    owner: root
    group: root
    source: "https://s3-eu-west-1.amazonaws.com/<my-bucket>/github-eb-key"
  /root/.ssh/config: 
    mode: "000600"
    owner: root
    group: root
    content: |
      Host github.com
        IdentityFile /root/.ssh/github-eb-key
        IdentitiesOnly yes
        UserKnownHostsFile=/dev/null
        StrictHostKeyChecking no

我注意到如果使用package-lock.json,这个方法不起作用,但我一直无法弄清楚原因。看起来NPM在从package-lock.json中提取数据时会执行某些不同的操作。我将package-lock.json添加到.egignore文件中,这样可以解决问题,但可能会导致部署时版本不匹配。 - TehNrd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接