在Elastic Beanstalk上为github私有repo访问设置SSH密钥

时间:2017-04-19 13:48:32

标签: node.js git ssh elastic-beanstalk ebextensions

My Node.JS项目包含对github上托管的私有NPM repos的引用。这在本地工作正常,但我很难在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实例上为git设置有效的SSH配置,而无需在源代码管理中存储密钥等。

显然,EB实例没有所需的SSH密钥来访问我的私有github存储库。如果我使用带有username:password@github.com内联的HTTPS样式git URL,它可以正常工作。它也可以使用github提供的oauth token method(基本上是用户:pass)。但我不希望任何凭据被签入源代码控制,所以我试图从我的EB实例上通过SSH从github克隆工作。

我已经尝试了一百万种方法,包括根据this blog postnpm preinstall脚本,这些方法过去一直工作到npm2,其中更改使预安装在构建树之后运行,并且PR要修复该问题仍未解决。

我尝试了一个.ebextensions命令配置,试图调用git configinsteadof放在git@github.com上的HTTPS URL中,OAUTH令牌来自环境变量(本身很棘手,因为在启动周期中此时未设置env变量,并且缺少$ HOME会使git配置混乱)。

我还尝试了使用.ebextensions在我的EB实例上设置SSH的各种不同方式,包括this solution from the comments on the mentioned blog post。这基本上就是我现在被困住的地方。

  • 我已经成功创建了一个密钥对,在我的github配置文件中进行了设置,并验证了私钥可以从我的本地客户端使用来克隆我的仓库
  • 我已将私钥和ssh配置文件放在私有S3存储桶上
  • 我已经创建了.ebextensions files配置,根据this example
  • 将这两个文件从我的S3存储桶复制到/tmp/.ssh/
  • 我创建了一个调试commands .ebextensions配置,列出了/tmp/.ssh并显示文件是从S3成功下载的:

/tmp/.ssh/config包含:

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中可能已经改变的时候:s等。使用的环境当EB启动时似乎有点受限;命令以用户nodejs运行,但/ tmp似乎用作主目录,即使$ HOME未在任何地方设置。

如何获取git来获取我的SSH配置,从而使用我的SSH密钥?我怎样才能找到git查找SSH配置文件的位置?通常它在〜/ .ssh,但由于$ HOME没有设置好,所以......这应该很容易但是让我疯了。

1 个答案:

答案 0 :(得分:11)

经过一整天的挣扎并最终绊倒this answer到我之前错过的一个非常相似的问题,事实证明放置ssh键的正确位置是为了被EB上的git拾取而在{ {1}}, /root/.ssh /tmp/.ssh

我的最终配置(假设在/home/ec2-user/.ssh的S3存储桶中有一个私有SSH密钥,并且使用配置了AMI的github用户向访问存储库的用户注册了相应的公钥作为<my-bucket>/github-eb-key,以及64bit Amazon Linux 2016.09 v3.3.0 running Node.js中的以下内容:

.ebextensions/01_ssh_setup.config