我的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实例上为git设置有效的SSH配置,而不必在源代码控制中存储秘密密钥等。
显然,EB实例没有访问我的私人github仓库所需的SSH密钥。如果我将HTTPS样式的git URL与username:password@github.com内联一起使用,则效果很好。它也可以使用github提供的oauth令牌方法工作(本质上是user:pass)。但是我不希望将任何凭据签入到源代码控制中,因此我试图从github进行克隆以在我的EB实例上通过SSH进行工作。
username:password@github.com
我已经尝试了上百万种方法,包括npm preinstall根据此博客文章提供的脚本,该脚本以前一直工作到npm2为止,在npm2上进行了更改,预安装在树生成后运行,而解决该问题的PR仍在进行中。
npm preinstall
我尝试了一个.ebextensions命令配置,该配置尝试调用git config以将insteadofgit@github.com上的HTTPS URL放入具有来自环境变量的OAUTH令牌(本身很棘手,因为启动时此时未设置环境变量)循环,缺少$ HOME会使git config混淆)。
.ebextensions
git config
insteadof
我还尝试了各种不同的方法来.ebextensions在我的EB实例上设置SSH,包括从提到的博客文章的评论中得到的解决方案。基本上这就是我现在停留的地方。
files
/tmp/.ssh/
commands
/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处设置$ HOME。
nodejs
如何获取git来获取我的SSH配置并因此使用我的SSH密钥?如何找到git在哪里寻找SSH配置文件?通常它位于〜/ .ssh中,但是由于未设置$ HOME,所以……这应该很容易,但会让我发疯。
事实证明,放置ssh键以便被git在EB上拾取的正确位置是/root/.ssh,不是 /tmp/.ssh, 不是 /home/ec2-user/.ssh。
/root/.ssh
/tmp/.ssh
/home/ec2-user/.ssh
我的最终配置(假设在的S3存储桶中有一个私有SSH密钥<my-bucket>/github-eb- key,并且使用访问权限访问该仓库的github用户注册了相应的公共密钥),使用配置为的AMI 64bit Amazon Linux 2016.09 v3.3.0 running Node.js,并且在AMI中配置了以下内容.ebextensions/01_ssh_setup.config:
<my-bucket>/github-eb- key
64bit Amazon Linux 2016.09 v3.3.0 running Node.js
.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