最近のチュートリアル Gitを使用したRubyデプロイメント用のAWSElastic Beanstalkのセットアップについて、CIサーバーからElastic Beanstalk環境をセットアップするだけです。ただし、アプリケーション開始に失敗しました。ログを調べたところ、bundle install
がエラーメッセージで失敗していることがわかりました。
[email protected]:example/private-repository.gitの取得ホストキーの検証に失敗しました。致命的:リモートエンドが予期せずハングアップしました[31mGitエラー:ディレクトリ/ var/app/ondeckのコマンド
git clone '[email protected]:example/private-repository.git' "/var/app/ondeck/vendor/cache/Ruby/1.9.1/cache/bundler/git/private-repository-e4bbe6c2b13bb62664e39e345c1b01d80017934c" --bare --no-hardlinks
が失敗しました。[0m
私のRailsアプリケーションのGemfile
には、Github上の私が所有するいくつかのプライベートリポジトリでホストされているgemifiedプラグインへの参照が含まれています。
gem'somegemname '、:git =>' [email protected]:example/private-repository.git '
Capistranoの展開で同様の問題に直面しましたが、ssh_options[:forward_agent] = true
を設定することで解決しました。
AWS Elastic Beanstalk Rubyコンテナは、.config
の下に配置されたカスタム.ebextensions
ファイルを介したカスタム構成をサポートします。この場合、SSHフォワードエージェントを設定すると役立ちますか?他に選択肢はありますか? Elastic Beanstalk環境の起動中にプライベートGithubリポジトリにアクセスするには?
更新1:bundle install
が開始されたユーザーを確認しました。スクリプト/opt/elasticbeanstalk/hooks/appdeploy/pre/10_bundle_install.sh
がbundle install
をroot
ユーザーとして開始することがわかりました。 /root/.ssh
の下にSSHキーを作成してみて、そのpub-keyをそのリポジトリのGithubDeployキーに追加しました。今のところ運がない。ここで、SSH pub-keyをGithubのユーザーアカウントに追加して、Githubアカウントからアクセスできるすべてのプライベートリポジトリに適用できるようにします。
良い一日を過ごした後、.config
ファイルを使用するだけで、ElasticBeanstalkで組織のプライベートGitHubリポジトリを使用できるようになりました。 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バケットを設定します。そのバケット内に、pip
、npm
、bundle
などを介してアクセスするGitHubリポジトリへのアクセスを許可するSSHキーを保存します。Sudo aws s3 cp
を使用してデプロイ時にそのキーをEBインスタンスにコピーします。 EBスクリプトはec2-user
ではなくSudo
を使用するため、root
が必要です。
このebextensions構成ファイルは、EBインスタンスに2つのファイルも作成します。 /root/.ssh/config
は、S3からコピーしたキーを使用するようにssh
(pip
とgit
によって呼び出されます)に指示します。 ssh-keyscan -H github.com
の出力を/root/.ssh/known_hosts
に貼り付けると、EBインスタンスのssh
が実際にGitHubと通信して、MITM攻撃を回避していることが事前に確認されます。これは、/root/.ssh/config
でStrictHostKeyChecking
を無効にするよりも優れています。
これがpip
のrequirements.txt
ファイルです。
Beaker==1.7.0
Flask==0.10.1
Jinja2==2.7.3
MarkupSafe==0.23
# [...]
git+ssh://[email protected]/myorganization/[email protected]
eb-deploy
の実行中に、tail -f /var/log/eb-activity.log
を実行して、すべてがスムーズに実行されることを確認できます。
これが私がついにやった方法です。 bundle install
フェーズを担当するユーザーのSSHキーを設定することがすべてです。
root
user のSSHキーを作成します。$ Sudou-root
$ ssh-keygen -t rsa -C "[email protected]"
.bash_profile
を編集して明示的にssh-agent
を開始し、新しく生成されたSSHキーを追加します。次の行を追加します(これは不要に思えるかもしれませんが、念のために行いました)
eval `ssh-agent
eval
ssh-add ~/.ssh/id_rsa
SSH公開鍵に注意してください。例:~/.ssh/id_rsa.pub
そして、プライベートリポジトリにアクセスできるGithubアカウントのSSH鍵のセットに追加します。
この時点で、インスタンスはプライベートGithubリポジトリにアクセスできます。 root
userとしてログインして、これらのリポジトリでgit clone
を発行することにより、これをテストできます。
標準の方法を使用して、このインスタンスからAMIを作成します
AWS Elastic Beanstalkダッシュボードに戻り、アプリケーションの環境でEdit Configuration
オプションを探します。 Server
タブで、Custom AMI
を指定できるオプションを探します。このフィールドを新しく作成されたAMIIDで更新します(例:AMI-4324fd4
)。
Apply Changes
を押して構成を保存します。 AWS Elastic Beanstalkは、環境全体に新しいインスタンスのデプロイを開始し、古いインスタンスを終了します。これは、すべての自動スケーリングされたインスタンスに、プライベートGithubアクセスに必要なホワイトリストに登録されたSSHキーがあることを確認するためです。
上記の手順が完了したら、先に進んでRailsアプリケーションをgit aws.Push
でデプロイできます。
これが行き詰まっている他の人に役立つことを願っています。しかし、これよりも優雅な解決策を見つけてうれしいです。
お急ぎの場合で、アプリケーションリポジトリも非公開の場合は、追加のGithubユーザーアカウントを作成して、gemを含むリポジトリに読み取り専用権限を割り当てることができます。
次に、バンドラーに新しいアカウントの資格情報を含むhttpsURLを指定します。
gem 'somegemname', git: "https://username:[email protected]/example/privaterepository"
GitHubで認証するには2つのアプローチがあります。いずれの場合も、個人のGitHubアカウントをプライベートのGitHubリポジトリに関連付けることをお勧めします。
最初のアプローチでは、ローカルで使用するのと同じssh認証情報をリモートのGitHubリポジトリからプッシュ、プルなどに渡します。個人アカウントの公開鍵をアップロードしました。これがGitHubで使用されます。別のサーバーで実行しているときにこれを機能させるには、ssh-agent
を実行し、ssh-add
を使用してキーをエージェントに追加する必要があります。その後、個人のGitHub資格情報を使用してgitコマンドを実行できます。
2番目のアプローチは、デプロイするリモートサーバーがGitHubにアクセスできるようにすることです。これは、エラスティックBeanstalkまたは実際のサーバーである可能性があります。サーバー上にパスワードなしのsshキーを作成し(ssh-keygen -t rsa
、デフォルトを受け入れる、またはEBに独自の方法がある可能性があります)、生成された公開キーの内容をコピーして、GitHubリポジトリにそのキーを含む新しい「デプロイキー」を作成します-あなたは管理者である必要があります、私はあなたがそうだと思います。インストールされたデプロイキーにより、EBユーザーはリモートサーバーにログインし、サーバーからgit pull
および関連するコマンド(読み取り専用)を実行できます。
最初の方法は、展開するサーバーの数が増えるにつれて、よりエレガントで管理しやすくなると思いますが、どちらの方法を使用するかは、EBのオプションによって異なる場合があります。
プライベートgithubリポジトリをrequirements.txtファイルから削除し、ユーザー名とパスワードの環境変数を使用してそれらをインストールするスクリプトを作成します。
ファイル:project-root/install-extra-requirements.sh
#!/bin/sh
source /opt/python/run/venv/bin/activate
python ".extra-requirements.py"
ファイル:project-root/.extra-requirements.py
import os
def main():
github_username = os.environ['GITHUB_USERNAME']
github_password = os.environ['GITHUB_PASSWORD']
repository = "git+https://%s:%[email protected]/yourgithubrepo" % (github_username, github_password)
os.system("pip install %s" % repository)
if __name__ == '__main__':
main()
ファイル:project-root/.ebextensions/002_container.config
container_commands:
01_install_extra_requirements:
command: './install-extra-requirements.sh'
これで、エラスティックBeanstalk環境の環境変数としてGITHUB_USERNAMEとGITHUB_PASSWORDを設定できます。