由去最近的教程上使用Git的Ruby部署建立AWS弹性魔豆,我只是从我的CI服务器设置一个弹性魔豆环境。 但是,应用程序未能启动。 我通过日志去发现, bundle install
,并显示错误消息是失败。
取git@github.com:例如/私有repository.git主机密钥验证失败。 致命:远程端挂了出乎意料[31mGit错误:命令git clone 'git@github.com:example/private-repository.git' "/var/app/ondeck/vendor/cache/ruby/1.9.1/cache/bundler/git/private-repository-e4bbe6c2b13bb62664e39e345c1b01d80017934c" --bare --no-hardlinks
的目录/ var /应用/ ondeck失败。[0米
Gemfile
我的Rails应用程序包含引用到gemified托管在一对夫妇在Github上我拥有的私有仓库的插件。 就像是
宝石 'somegemname',:GIT中=> 'git@github.com:例如/私人repository.git'
我已经通过设立面临Capistrano的部署类似的问题,这是解决ssh_options[:forward_agent] = true
。
AWS弹性豆茎红宝石容器支持通过定制自定义配置.config
文件下放置.ebextensions
。 将建立在这种情况下的SSH转发代理的帮助? 还有没有其他的替代方案达成私人Github上库,同时启动的弹性魔豆环境?
更新1:我刚刚检查与一个用户bundle install
开始。 发现了一个脚本/opt/elasticbeanstalk/hooks/appdeploy/pre/10_bundle_install.sh
开始bundle install
的root
用户。 我试图创建下一个SSH密钥/root/.ssh
并增加它的酒馆关键Github上部署密钥,用于存储库。 至今没有运气。 现在将尝试一个SSH酒馆键添加到Github上我的用户帐户,以便它适用于通过我的Github上的帐户访问的所有私有仓库。
努力好日子后,我终于通过只使用一个能使用我公司专用GitHub的回购与弹性魔豆.config
文件。 我使用Python和pip
,但它也应该适用于EB上的其他程序包安装。
rhetonik的ssh-agent
+ ssh-add
方法并没有为我在所有的工作,所以我当选为建立一个ssh配置文件来代替。
这里是我的.ebextensions/3-pip-install-from-github.config
文件:
files:
"/root/.ssh/config":
owner: root
group: root
mode: "000600"
content: |
Host github.com
User git
Hostname github.com
IdentityFile /root/.ssh/github
"/root/.ssh/known_hosts":
owner: root
group: root
mode: "000644"
content: |
#
# paste output of `ssh-keyscan -H github.com` here
#
commands:
01-command:
command: sudo aws s3 cp s3://bucket-with-your-github-ssh-key/github /root/.ssh
02-command:
command: sudo chmod 600 /root/.ssh/github
粗糙说明:
由您的EB实例访问的S3桶。 里面那个桶,存储SSH密钥允许访问要通过访问GitHub的仓库pip
, npm
, bundle
等使用sudo aws s3 cp
到密钥复制到您的EB实例上部署。 sudo
因为EB脚本中使用是必要的root
,而不是ec2-user
。
这ebextensions配置文件也创造了你的EB实例2个文件。 /root/.ssh/config
告诉ssh
(通过调用pip
和git
)使用你从S3复制的关键。 粘贴的输出ssh-keyscan -H github.com
到/root/.ssh/known_hosts
将预先验证ssh
你的EB实例实际上是与GitHub的沟通,以避免MITM攻击。 这比禁止更StrictHostKeyChecking
在/root/.ssh/config
。
这是我requirements.txt
文件pip
:
Beaker==1.7.0
Flask==0.10.1
Jinja2==2.7.3
MarkupSafe==0.23
# [...]
git+ssh://git@github.com/myorganization/myprivaterepo.git@0.0.142
在运行eb-deploy
,您可以tail -f /var/log/eb-activity.log
,以确保一切顺利。
下面是我终于做到了。 这一切都建立了负责用户的SSH密钥bundle install
阶段。
- 在AWS弹性魔豆的应用程序启动的环境
- 可选 -登录亚马逊EC2控制台,并更改实例类型为期望值
- 更新SSH密钥对的名称,以使远程SSH登录。 (我敢肯定,必须有指定实例类型和SSH密钥对名称的方式,同时启动环境)
- 寻找无论是在EC2控制台或通过CLI最新推出的情况下,请注意此实例的完全限定域名(FQDN)。 EB情况下,就像你将与亚马逊EC2创建任何其他实例。 通过SSH这种情况下登录。
- 执行以下命令以创建SSH密钥
root
用户 $ sudo的苏 - 根
$的ssh - 凯基-t RSA -C “some-email@yourdomain.com”
编辑.bash_profile
显式启动ssh-agent
并添加新生成的SSH密钥。 添加以下行(这似乎是不必要的,我做到了,只是要确定)
EVAL`的ssh-agent
EVAL ssh-add ~/.ssh/id_rsa
注意SSH公钥如: ~/.ssh/id_rsa.pub
并将其添加到了Github上的帐户设置SSH密钥有权访问私有仓库
此时,您的实例访问您的私人Github的库。 你可以通过发出测试这个git clone
由作为登录这些版本库root
用户。
创建AMI出使用标准方法将此实例
回到你的AWS弹性魔豆仪表盘和寻找Edit Configuration
在应用程序的环境选项。 在Server
选项卡中,寻找一个选项,它可以让你指定一个Custom AMI
。 更新此字段与新创建的AMI ID例如: ami-4324fd4
。
通过点击保存设置Apply Changes
。 AWS弹性魔豆将开始在你的环境中部署新实例和终止旧的。 这是为了确保所有的自动缩放实例有私人Github上访问所需的白名单中的SSH密钥。
上述步骤完成后,你可以继续和部署Rails应用程序git aws.push
希望这可以帮助其他人谁卡住了。 我很高兴地看到不止这一个,虽然一个更优美的解决方案。
如果你是在赶时间,你的应用程序回购也是私有的,你可以创建一个额外的Github上的用户帐户,并为其分配只读权限到含有宝石的回购。
然后给捆绑使用新的帐户凭据的HTTPS URL:
gem 'somegemname', git: "https://username:password@github.com/example/privaterepository"
有两种方法可以与GitHub的认证。 我建议你个人的GitHub帐户在两种情况下,私人GitHub库相关联。
第一种方法通过使用本地从远程GitHub库推,拉,所以在相同的SSH凭证 - 你上传你的公钥对您的个人帐户,而这正是GitHub上使用。 到另一台服务器上运行时,做这项工作,你需要有ssh-agent
运行和使用ssh-add
到您的钥匙添加到代理-那么你的个人GitHub的凭据可用于执行Git命令。
第二种方法是让你部署到能够访问GitHub上的远程服务器(S) - 这可能是弹性的豆茎或实际的服务器(一个或多个)。 在服务器上创建一个密码的SSH密钥( ssh-keygen -t rsa
,接受默认设置,或者EB都有自己的一种方式),然后复制生成的公钥内容,并创建一个新的“部署的关键”包含在你的GitHub是关键回购 - 你需要admin,我以为你是。 已安装部署键将允许EB用户登录到远程服务器,并做git pull
和相关命令(只读)从服务器。
我认为第一种方法是更优雅,更易于管理要部署到服务器的数量增长,但哪种方法,你可以使用依赖于EB的选项。
从requirements.txt文件中删除私人github上回购和创建脚本中使用环境变量的用户名和密码进行安装。
文件: 项目根/ install-extra-requirements.sh
#!/bin/sh
source /opt/python/run/venv/bin/activate
python ".extra-requirements.py"
文件: 项目根/ .extra-requirements.py
import os
def main():
github_username = os.environ['GITHUB_USERNAME']
github_password = os.environ['GITHUB_PASSWORD']
repository = "git+https://%s:%s@github.com/yourgithubrepo" % (github_username, github_password)
os.system("pip install %s" % repository)
if __name__ == '__main__':
main()
文件:项目根/ .ebextensions / 002_container.config
container_commands:
01_install_extra_requirements:
command: './install-extra-requirements.sh'
现在,你可以设置GITHUB_USERNAME和GITHUB_PASSWORD在你的弹性魔豆环境环境变量。
文章来源: Setting up private Github access with AWS Elastic Beanstalk and Ruby container