2017-02-15 6 views
1

私の基本的な質問:Elastic Beanstalkデプロイメントプロセス中に有効になる環境変数を設定するにはどうすればよいですか?エラスティックbeanstalkデプロイ中に適用される環境変数

私は、デプロイメント後にアプリケーションでアクセス可能なデプロイ時に環境変数を設定することについては言及していません。エラスティックBeanstalkのビルドスクリプトの特定の動作を変更する環境変数を設定する必要があります。

明らかに - これは一般的には悪い考えですが、この場合は問題ありませんので、私はこれを実験として試しています。

米国のAWSから中国のAWSにサーバーを移行する過程で、そのサーバーが展開していることがわかりました。その日に応じて、時間の50%〜100%の間で失敗する。これは開発中の大きな苦痛ですが、私は主に、この作業をどのようにプロダクションで行うのかについて心配しています。

これは、Python 2.7を実行しているアマゾンのLinuxサーバであり、ログがしようとしているときにピップによって生成されたすべてのをインストールし、たまにでスローピアによって、いくつかの接続をリセットして、障害が主に読むタイムアウトエラーであることを示していますpypiからパッケージをダウンロードしてください。これを確認するために、いくつかのパッケージを手動でインストールするためにインスタンスにsshを実行しました。小さなサンプルサイズでも同様の失敗率が表示されます。これは、中国のGFWの反対側のコンテンツにアクセスしようとするときには、かなり一般的です。

だから、私は私のローカルマシンにピップダウンロード Sパッケージは、その後、AWSがは私のサーバーと同じ領域に位置S3バケットにそれらをよ同期するというスクリプトを書きました。これにより、展開中にGFWを横断する必要がなくなります。

私の元来の計画は、aws cpのS3からピップキャッシュへのパッケージですが、(私が何かを忘れていない限り)これはいくぶん驚くほど単純ではないようです。

プランBのように、パッケージをインスタンス上のローカルディレクトリにリダイレクトしています。これはうまくいっていますが、pip installは、パッケージをpypiからダウンロードするのではなく、ローカルディレクトリから取得することができません。

pipドキュメントの後、私はPIP_FIND_LINKS環境変数を私のパッケージディレクトリに指定すると、ピップ "pipi"ではなく、自分のディレクトリからパッケージを "自然に"プルすることを期待しました。これは、EBビルドスクリプトに対して変更を透過的にするものであり、なぜこれが合理的な解決策であろうと思ったのですか?

は、これまで私が試してみました:

1)運と、PIP_FIND_LINKS = /パス/に/パッケージをエクスポートコマンド。これは、異なるセッションから呼び出される展開工程によるものであったと仮定したので、私は、次に試した:

2)エクスポートPIP_FIND_LINKS = /パス/への追加前の輸出に加えて()コマンド/package〜〜。/ profileを新しいセッションに適用しようとします。

私はec2_userとrootの両方でコマンドを発行しようとしましたが、いずれも動作しません。

私は、これで棒をつけ続けるのではなく、もう少しEB、ピップなどのニュアンスを経験した人が何らかのガイダンスを提供できることを期待していました。

+0

問題の原因となったpypiライブラリはどれですか?時には私のrequirements.txtには、pypiではなくsetup()経由でリポジトリからインストールされたライブラリが含まれています。これにより、展開で障害が発生しました。私の周りの方法は、要件を修正し、代わりにドッカー環境を使用して、展開スクリプトをより詳細に制御することでした。 –

+0

失敗したライブラリは実行ごとに異なり、場合によっては失敗もありません。これは実際にはGFWを横断するときにはかなり一般的なランダム接続ブロッキングに関連しているように見えます。なぜ自分の依存関係をローカルに格納したいのですか?また、この要件ファイルのスーパーセットが問題なく中国以外で1年以上使用されていたことにも触れておきます。 – gary

答えて

1

私は、pip config fileが環境変数よりも信頼性の高い解決策でなければならないと考えました。

これは.ebextensionsで簡単に実装できることが判明しました。私が最初にvirtualenvのフォルダに直接設定ファイルを作成し、ダウンロード・スクリプトを作成します。

commands: 

    03_download_packages: 
    command: bash /home/ec2-user/download_packages.sh 

ワン:

files: 

    /home/ec2-user/download_packages.sh: 
    mode: "000500" 
    owner: root 
    group: root 
    content: | 
     #!/usr/bin/env bash 

     package_dir=/path/to/packages 

     mkdir -p $package_dir 
     aws s3 sync s3://bucket/packages $package_dir 

    /opt/python/run/venv/pip.conf: 
    mode: "000755" 
    owner: root 
    group: root 
    content: | 
     [install] 
     find-links = file:///path/to/packages 
     no-index=false 

は最後に、コマンドは、先ほど作成したスクリプトを呼び出すために使用されます潜在的な問題は、ピップがローカルのパッケージディレクトリをバイパスし、私たちのプライベートgitリポジトリに格納されているパッケージをダウンロードするので、タイムアウトエラーが発生する可能性がありますが、インストールする必要のあるパッケージのほんの一部です実行可能な

これが長期的な解決策になるかどうかはまだ分かりませんが、非常に簡単で(1日のテスト後に)失敗率は50%〜100%から0%に低下しました。

関連する問題