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

JHH*_*JHH 7 git ssh node.js amazon-elastic-beanstalk ebextensions

我的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>",
  ...
}
Run Code Online (Sandbox Code Playgroud)

-

我需要的是能够在我的Elastic Beanstalk实例上为git设置一个有效的SSH配置,而不必在源代码控制中存储密钥等.

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

我已经尝试了一百万种方法,包括npm preinstall根据这篇博客文章的脚本,它曾经工作到npm2,其中一个更改使预安装在构建树之后运行,并且修复该问题的PR仍然未决.

我尝试过一个.ebextensions命令配置试图调用git configinsteadofgit@github.com放在一个HTTPS URL中,OAUTH令牌来自一个环境变量(由于env变量在启动时此时未设置,因此本身很棘手)循环,缺少$ HOME使git配置混乱).

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

  • 我已经成功创建了一个密钥对,在我的github配置文件中设置它,并验证私钥可以从我的本地客户端使用来克隆我的repo
  • 我已将私钥和ssh配置文件放在私有S3存储桶上
  • 根据这个例子,我已经创建了一个.ebextensions files配置,可以将我的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
Run Code Online (Sandbox Code Playgroud)

/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.
Run Code Online (Sandbox Code Playgroud)

我现在已经没想完了.我最好的猜测是/tmp/.ssh不是git去寻找ssh配置文件的路径 - 它可能是在提出链接解决方案但在以后的AMI中可能已经改变的时候:s等.使用的环境当EB启动时似乎有点受限; 命令以用户身份运行,nodejs但/ tmp似乎用作主目录,即使$ HOME未在任何地方设置.

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

JHH*_*JHH 14

一整天的斗争后终于绊倒这个答案给我以前错过了一个非常类似的问题,事实证明了正确的地方,把SSH密钥才能被混帐的EB回升是/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,并且具有以下内容.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
Run Code Online (Sandbox Code Playgroud)