web-dev-qa-db-ja.com

Amazon EC2で、起動時にプライベートgithubリポジトリのクローンを作成する最良の方法は何ですか?

起動時に特定のブランチを複製してプライベートgithubリポジトリからコミットし、そのリポジトリ内からコードを実行するEC2インスタンスの自動スケールグループを設定する必要があります。

Cloud-init起動システムを搭載したUbuntuから派生したAMIを使用しているので、これを実装する最も簡単な方法は、GitHubデプロイキーをインストールし、それを使用してクローンを作成するcloud-initユーザースクリプトであるように思われます。リポジトリを作成し、複製されたリポジトリ内で適切なスクリプトを開始します。

これが私の最初の試みです(デプロイキー、ブランチ、およびコミットハッシュは、LaunchConfigurationを初期化する前に自動スケールクラスターを管理する管理プロセスによって挿入されます):

#!/usr/bin/env python

# ** IMPORTS OMITTED **

DEPLOY_KEY = '''
--- RSA PRIVATE KEY GOES HERE ---
'''
REPO_URL = '[email protected]:github_user/MyRepository.git'
BRANCH = 'master'
COMMIT = '6dba9ae2cb77dc30c525ce14aeb82b072c88042b'
USER_HOMEDIR = os.environ['HOME']
WORKING_PATH = USER_HOMEDIR

try:
    os.makedirs(os.path.join(USER_HOMEDIR, '.ssh'))
except:
    pass

# Install the deploy key as the user's default identity file
keypath = os.path.join(USER_HOMEDIR, '.ssh', 'id_rsa')
try:
    with open(keypath, 'w') as keyfile:
        keyfile.write(DEPLOY_KEY)
except:
    with open(keypath, 'r') as keyfile:
        assert keyfile.read() == DEPLOY_KEY

# openSSH requires identitiy file mode to be 600
os.chmod(keypath, stat.S_IREAD)

# Disable strict Host checking for github.com so we don't get the Prompt
with open(os.path.join(USER_HOMEDIR, '.ssh', 'config'), 'a') as sshconfig:
    sshconfig.write("\nHost github.com\n\tStrictHostKeyChecking no\n")

# clone the get repo
os.chdir(WORKING_PATH)
subprocess.call('git clone %s --branch %s' % (REPO_URL, BRANCH), Shell=True)
if COMMIT != 'HEAD':
    os.chdir(os.path.join(WORKING_PATH, 'LFAnalyze'))
    subprocess.call('git checkout ' + COMMIT, Shell=True)

このスクリプトはログインシェルから機能しますが、$ HOME環境変数がまだ設定されていないため、cloud-initの環境内で実行できません(cloud-initはランレベル2のUpstartジョブ内で実行され、 これらの環境変数 )。

git-cloneには、特定のキーファイルを使用できるようにするなどのSSHオプションを渡すオプションがないようです。 〜/ .ssh /でデフォルトのIDキーを探すだけです。このスクリプトの実行時に$ HOMEが定義されていない場合、デプロイキーを探す場所をgit-cloneに指示するにはどうすればよいですか?

または、cloud-initに特定のユーザーとしてスクリプトを実行させ、ログインシェル環境をエミュレートする方法はありますか?

それとも、この問題全体に間違った方法でアプローチしているだけですか?これを行うための確立されたベストプラクティスまたは標準的な方法はありますか?

1
leted

通常、SSHキーとgit repo cloneを使用して動作するEC2インスタンス(理想的な構成の動作インスタンス)を作成することをお勧めします。

次に、そのインスタンスのAMIを作成し、起動構成でuserdataにスクリプトを入力して、インスタンスが起動されるたびにスクリプトが実行されるようにします(基本的にはgitとlaunchコマンドを更新します)。

サンプルスクリプトは次のようになります(/ opt/srcがリポジトリの場所であると想定):

#!/bin/sh
cd /opt/src
git pull
source run_cmd.sh

このようにして、スクリプトが含まれ、適切に維持されます。お役に立てば幸いです。

3
Ketan Patel