web-dev-qa-db-ja.com

AWS ElasticBeanstalkとRubyコンテナ)を使用してプライベートGithubアクセスを設定する

最近のチュートリアル 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.shbundle installrootユーザーとして開始することがわかりました。 /root/.sshの下にSSHキーを作成してみて、そのpub-keyをそのリポジトリのGithubDeployキーに追加しました。今のところ運がない。ここで、SSH pub-keyをGithubのユーザーアカウントに追加して、Githubアカウントからアクセスできるすべてのプライベートリポジトリに適用できるようにします。

24
rhetonik

良い一日を過ごした後、.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バケットを設定します。そのバケット内に、pipnpmbundleなどを介してアクセスするGitHubリポジトリへのアクセスを許可するSSHキーを保存します。Sudo aws s3 cpを使用してデプロイ時にそのキーをEBインスタンスにコピーします。 EBスクリプトはec2-userではなくSudoを使用するため、rootが必要です。

  • このebextensions構成ファイルは、EBインスタンスに2つのファイルも作成します。 /root/.ssh/configは、S3からコピーしたキーを使用するようにsshpipgitによって呼び出されます)に指示します。 ssh-keyscan -H github.comの出力を/root/.ssh/known_hostsに貼り付けると、EBインスタンスのsshが実際にGitHubと通信して、MITM攻撃を回避していることが事前に確認されます。これは、/root/.ssh/configStrictHostKeyCheckingを無効にするよりも優れています。

これがpiprequirements.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を実行して、すべてがスムーズに実行されることを確認できます。

34
markplindsay

これが私がついにやった方法です。 bundle installフェーズを担当するユーザーのSSHキーを設定することがすべてです。

  1. AWS ElasticBeanstalkでアプリケーションの環境を開始します
  2. オプション-Amazon EC2コンソールにログインし、インスタンスタイプを目的の値に変更します
  3. SSHキーペア名を更新して、リモートSSHログインを有効にします。 (環境の起動時にインスタンスタイプとSSHキーペア名を指定する方法が必要だと確信しています)
  4. EC2コンソールまたはCLIを介して、新しく起動されたインスタンスを探します。このインスタンスの完全修飾ドメイン名(FQDN)に注意してください。 EBインスタンスは、AmazonEC2で作成する他のインスタンスと同じです。 SSH経由でこのインスタンスにログインします。
  5. 次のコマンドを実行して、root user のSSHキーを作成します。

    $ Sudou-root

    $ ssh-keygen -t rsa -C "[email protected]"

  6. .bash_profileを編集して明示的にssh-agentを開始し、新しく生成されたSSHキーを追加します。次の行を追加します(これは不要に思えるかもしれませんが、念のために行いました)

    eval `ssh-agent

    eval ssh-add ~/.ssh/id_rsa

  7. SSH公開鍵に注意してください。例:~/.ssh/id_rsa.pubそして、プライベートリポジトリにアクセスできるGithubアカウントのSSH鍵のセットに追加します。

  8. この時点で、インスタンスはプライベートGithubリポジトリにアクセスできます。 root userとしてログインして、これらのリポジトリでgit cloneを発行することにより、これをテストできます。

  9. 標準の方法を使用して、このインスタンスからAMIを作成します

  10. AWS Elastic Beanstalkダッシュボードに戻り、アプリケーションの環境でEdit Configurationオプションを探します。 Serverタブで、Custom AMIを指定できるオプションを探します。このフィールドを新しく作成されたAMIIDで更新します(例:AMI-4324fd4)。

  11. Apply Changesを押して構成を保存します。 AWS Elastic Beanstalkは、環境全体に新しいインスタンスのデプロイを開始し、古いインスタンスを終了します。これは、すべての自動スケーリングされたインスタンスに、プライベートGithubアクセスに必要なホワイトリストに登録されたSSHキーがあることを確認するためです。

上記の手順が完了したら、先に進んでRailsアプリケーションをgit aws.Pushでデプロイできます。

これが行き詰まっている他の人に役立つことを願っています。しかし、これよりも優雅な解決策を見つけてうれしいです。

10
rhetonik

お急ぎの場合で、アプリケーションリポジトリも非公開の場合は、追加のGithubユーザーアカウントを作成して、gemを含むリポジトリに読み取り専用権限を割り当てることができます。

次に、バンドラーに新しいアカウントの資格情報を含むhttpsURLを指定します。

gem 'somegemname', git: "https://username:[email protected]/example/privaterepository"
4
Gabe Kopley

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のオプションによって異なる場合があります。

0
Tom Harrison

プライベート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を設定できます。

0
tamarabyte