2017-04-19 119 views
5

我的Node.JS項目包含對github上託管的私有NPM回購的引用。這在本地運行良好,但我正在努力使這個工作在Elastic Beanstalk上。爲Elastic Beanstalk上的github私人回購訪問設置SSH密鑰

dependencies: { 
    ... 
    "express": "^4.12.4", 
    "jsonwebtoken": "^5.0.5", 
    "my-private-module": "[email protected]:<my-user>/<my-repo>.git#<my-version>", 
    ... 
} 

-

我需要的是能夠建立在我的魔豆彈性git的情況下工作的SSH配置,而無需密鑰等存儲在源代碼控制。

顯然,EB實例沒有所需的SSH密鑰來訪問我的私人github回購。如果我使用內嵌username:[email protected]的HTTPS風格的git URL,則可以正常工作。它也可以使用github提供的oauth token method(它本質上是一個用戶:pass)。但我不希望將任何憑據簽入到源代碼控制中,所以我試圖從github上克隆我的EB實例上的SSH工作。

我試過一百萬種方法,包括npm preinstall腳本根據this blog post,它曾經工作到npm2,其中一個更改使得預安裝在構建樹之後運行,並且解決該問題的PR仍未解決。

我已經試過了試圖調用git config[email protected]insteadof放置到HTTPS URL與環境變量(棘手進來本身,因爲ENV變量不是令牌一個OAuth的.ebextensions命令配置在這個時候在啓動週期中設置,並且$ HOME的缺失使git config感到困惑)。

我也嘗試過使用.ebextensions在我的EB實例上設置SSH的各種不同方式,包括this solution from the comments on the mentioned blog post。這基本上是我現在卡住的地方。

  • 我已經成功地創建一個密鑰對,將其設置在我github上的個人資料,並驗證了私鑰是從我的本地客戶端可用於克隆我的回購
  • 我已經把我的私人密鑰和SSH在一個私人的S3存儲
  • 我創建了一個.ebextensionsfiles配置,從我的S3存儲將這兩個文件拷貝到/tmp/.ssh/,根據this example
  • 配置文件我已經創建了一個調試commands.ebextensions配置,其中列出的/ tmp/.ssh a ND表明文件從S3下載成功:

/tmp/.ssh/config包含:

Host github.com 
    IdentityFile /tmp/.ssh/deploy_key 
    IdentitiesOnly yes 
    UserKnownHostsFile=/dev/null 
    StrictHostKeyChecking no 

/tmp/.ssh/deploy_key包含我這是驗證在本地工作的私鑰。

然而,混帳仍然拋出一個錯誤:

npm ERR! Command failed: git clone --template=/tmp/.npm/_git-remotes/_templates --mirror ssh://[email protected]/[.....] 
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沒有設置,所以......這應該很容易,但是讓我感到很緊張。

回答

5

一整天的鬥爭,終於結結巴巴地this answer到我以前錯過了一個非常類似的問題,事實證明了正確的地方,把SSH密鑰,以便以後由混帳的EB被拾起在/root/.ssh/tmp/.ssh,不是/home/ec2-user/.ssh

我使用配置爲64bit Amazon Linux 2016.09 v3.3.0 running Node.js的AMI配置了我的最終配置(假設位於S3存儲桶中的私有SSH密鑰爲<my-bucket>/github-eb-key,並且相應的公鑰已向有權訪問repo的github用戶註冊)並在.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