18

グラファイト サーバーとポート (メトリックを送信するため) を指定する必要があるスプリング ブート アプリケーションがあります。それが機能するには、 をインストールして構成する必要がありますstatsd。私はebextensionsファイルを使用してそれを行います。

commands:
  01_nodejs_install:
    command: sudo yum -y install nodejs npm --enablerepo=epel
    ignoreErrors: true

  02_mkdir_statsd:
    command: mkdir /home/ec2-user/statsd
    ignoreErrors: true

  03_fetch_statsd:
    command: git clone https://github.com/etsy/statsd.git /home/ec2-user/statsd
    ignoreErrors: true

  04_change_example_config:
    command: "cat exampleConfig.js | sed 's/2003/<graphite-port>/g' | sed 's/graphite.example.com/<my-graphite-server>/g' > config.js"
    cwd: /home/ec2-user/statsd

  05_run_statsd:
    command: setsid node stats.js config.js >/dev/null 2>&1 < /dev/null &
    cwd: /home/ec2-user/statsd

この構成の問題は、ここですべての環境に対して 1 つのグラファイト サーバーしか指定できないことです。

そこで、コマンド 04 と 05 を に移動することにしましたcontainer_commandsENV_NAME Beanstalk コンソール/UI を使用して呼び出される環境変数を定義し、環境に応じてdevqa、またはに設定することをprod考えています。次に、これに基づいて特定の環境に対してのみ 04 および 05 コマンドを実行するtestオプションを使用できます。container_commandsENV_NAME

だから私の問題は - AWS コンソールを使用して環境変数を定義するにはどうすればよいですか? こちらのドキュメントで説明されているように、Beanstalk コンソールを使用して変数を定義しようとしまし たが、うまくいきませんでした。また、このメソッドは JVM プロパティのみを設定し、ENV 変数は設定しないこともわかりました(5 票の回答を参照)。

同じ問題が発生するため、を使用して環境変数を定義ebextensionsできません-異なる環境に対して異なる環境変数を定義できません:)

したがって、次のいずれかについて助けが必要です。

  • ENV_NAMEBeanstalk UI を使用して環境変数を設定します。

または

  • の値に基づいてコマンドを実行するかどうかを条件付けるためENV_NAMEに、 でシステム プロパティを使用する方法を提案します。container_commandsENV_NAME

また、環境ごとに異なる Graphite サーバーを指定するためのより簡単で優れた方法をご存じの場合は、お気軽にお問い合わせください。

4

3 に答える 3

28

これを解決した方法は、開発環境と本番環境でそれぞれENV_NAMEasdevとinを定義し、次の構成を使用することでした。prodebextensions

commands:
  01_nodejs_install:
    command: sudo yum -y install nodejs npm --enablerepo=epel
    ignoreErrors: true

  02_mkdir_statsd:
    command: mkdir /home/ec2-user/statsd
    ignoreErrors: true

  03_fetch_statsd:
    command: git clone https://github.com/etsy/statsd.git /home/ec2-user/statsd
    ignoreErrors: true

container_commands:
  04a_container_change_example_config:
    command: "cat exampleConfig.js | sed 's/2003/<graphite-dev-port>/g' | sed 's/graphite.example.com/<graphite-dev-host>/g' > config.js"
    cwd: /home/ec2-user/statsd
    test: '[ "${ENV_NAME}" == "dev" ]'

  04b_container_change_example_config:
    command: "cat exampleConfig.js | sed 's/2003/<graphite-prod-port>/g' | sed 's/graphite.example.com/<graphite-prod-host>/g' > config.js"
    cwd: /home/ec2-user/statsd
    test: '[ "${ENV_NAME}" == "prod" ]'

  05_run_statsd:
    command: setsid node stats.js config.js >/dev/null 2>&1 < /dev/null &
    cwd: /home/ec2-user/statsd

I を使用すると、Beanstalk 環境で既に定義したプロパティでtestの実行を条件付けることができます。container commandENV_NAME

于 2016-06-22T22:58:47.943 に答える
2

答えはこの Spring documentationにありますが、私の言葉で少し言います: spring-boot アプリケーションを実行しているので、次のようにさまざまな「application.properties」ファイルを作成できます。

ここに画像の説明を入力

各ファイル内に、グラファイト (または何でも) 構成を配置できます。

私のapplication-dev.ymlでは:

ここに画像の説明を入力

そして、私の application-prod.yml では:

ここに画像の説明を入力

ご覧のとおり、環境ごとに構成があります。

アプリケーションをさまざまな Maven プロファイルで実行できます。この場合、dev と prod としましょう。 application-dev.yml 構成。

私のpom.xmlのスニペット

<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <build>
            ...

次に、各プロファイルでアプリケーションを実行すると、目的の .yml ファイルが読み込まれます

私が実行した場合、見てみましょう:

java -jar mywar.war

コンソールが dev プロファイルを読み込みます (これがデフォルトのプロファイルであることを覚えているため)

ここに画像の説明を入力

しかし、prod プロファイルを指定すると、次のようになります。

java -jar mywar.war --spring.profiles.active=prod

コンソールに次のように表示されます。

ここに画像の説明を入力

Elastic Beanstalk で環境変数を設定するには、[Configuration] -> [Software configuration] に移動します。

ここに画像の説明を入力

そしてspring.profile.active、次のように設定します。

ここに画像の説明を入力

最後のコメント:環境プロパティと環境タグを混同しないでください!

于 2016-06-17T22:06:23.363 に答える