Amazon Elastic Beanstalk(AWS EBS)でカスタム環境変数をどのように渡しますか?


121

Amazon Elastic Beanstalkの宣伝文はこう述べています。

Elastic Beanstalkを使用すると、「フードを開く」ことができ、完全な制御を維持できます。ElasticBeanstalkコンソールを介して環境変数を渡すこともできます。

http://aws.amazon.com/elasticbeanstalk/

Elastic Beanstalk構成の環境変数以外の環境変数を渡す方法は?


4
これに関する承認済みの回答を変更することを検討してください
フィリップ2013年

回答:


136

この.ebextensions/*.config方法を使用するすべての人に向けて:現在、Elastic Beanstalk Webインターフェイスで環境変数を追加、編集、削除できます。

変数は、[構成]→[ソフトウェア構成]にあります。

環境プロパティ

Onemaの答えの.ebextensionsように変数を作成しても機能します。

たとえば、後で別の環境にデプロイして手動で設定するのを忘れる場合や、値をソース管理にコミットすることに問題がない場合など、さらに望ましい場合もあります。両方を混ぜて使っています。


2
または、構成を保存し、その構成を使用して新しい環境を起動することもできます。
Michael Gallego 2013

1
うん、私はそれが最良の選択肢だと思います。私はそれを忘れ続け、新しい環境を自由に立ち上げます。:)
ライム

1
@dingdong:はい、特にアプリケーションでそれらにアクセスできます。たとえば、RailsでENV["CUSTOM_ENV"]戻り"something-something"ます。
ライム

3
新しいプロパティを追加したり、プロパティ値を変更したりした場合、それらはすぐに利用できますか、再起動する必要がありますか?最近、自動スケーリンググループのサイズを変更しました。AWSは、インスタンスの40近くすべてを終了し、45の新しいインスタンスを作成しました。既存の環境に新しいプロパティを追加した場合、このようなことが発生したくありません。何か案は?
Engineer81

4
最近の変更に注意してください。この回答に従って、それらは環境変数として渡されません。システムプロパティとしてのみ渡される
James

107

制限している値は5つだけです。または、カスタム環境変数名を使用することもできます。これは、構成ファイルを使用して行うことができます。というプロジェクトのルートにディレクトリを作成します

.ebextensions /

次に、environment.configという名前のファイルを作成し(このファイルは任意の名前を付けることができますが、拡張子は.configにする必要があります)、次の値を追加します。

option_settings:
  - option_name: CUSTOM_ENV
    value: staging

アプリケーションをデプロイした後、環境の詳細->設定の編集->コンテナの下にこの新しい値が表示されます

詳細については、こちらのドキュメントを確認してください:http : //docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#customize-containers-format-options

更新

APIキーやシークレットなどのリポジトリ値へのコミットを防ぐために、プレースホルダー値を置くことができます。

option_settings:
  - option_name: SOME_API_KEY
    value: placeholder-value-change-me

後でAWS管理パネル(環境の詳細->構成の編集->コンテナー)に移動して、そこで値を更新できます。私の経験では、これらの値はその後の展開後に変更されません。

Update 2 @Benjaminがコメントで述べたように、新しいルックアンドフィールは2013年7月18日にリリースされたため、コンソールから直接、任意の数の環境変数を定義できます。

Configuration > Software Configuration > Environment Properties


2
@Onema-新しいキーを構成ファイルに追加する方法を教えてください。更新されたファイルをプッシュすると、以前に設定されたすべてのキーがプレースホルダー値で更新されますか?
Tabrez 2013年

1
@Tabrez、以前に設定されたキーはすべてその値を保持します。
Anarchtica 2013年

2
@Tabrezさん、申し訳ありません。これまでこれを調べる機会がありませんでした。Anarchticaの回答に追加するために、いくつかのテストを実行したところ、プレースホルダーを使用し、実際のキーを使用してAWSコンソールで値を更新した後、構成ファイルでプレースホルダーの値を更新してプッシュすると、キーが新しいプレースホルダーに置き換えられました。これは少し奇妙だと思いますが、コンソールですべてのenv値を管理することを強制されるため、これは歓迎すべき動作だと思います。
Onema 2013年

7
@Anarchtica、私はこの動作についてAWSサポートに質問しました。コンソールで値を更新すると、それらが優先され、構成ファイルを使用して値を変更することはできなくなると彼らは言った。コンソールで値を変更しない場合、構成ファイルで行われた変更はすべて更新されます。
Onema 2013年

1
container_commandsの構成ファイル内で環境変数を使用する方法を誰かが知っていますか?私が試したcommand: "nrsysmond-config --set license_key={$NR_INSTALL_KEY}"
colllin

29

2016 Java8 Tomcat8 AMIでは、ElasticBeanstalkはWeb設定から環境変数を設定できません。代わりにjvm -Dプロパティを実際に設定しています。

-「次のプロパティが環境変数としてアプリケーションに渡されます。詳細。」

このステートメントは、Java Tomcat amiでは正しくありません。アマゾンはしませこれらを環境変数として設定。これらは、jvmの-DプロパティとしてコマンドラインでTomcatに渡されるシステムプロパティとして設定されます。Javaで環境変数を取得する方法は、プロパティを取得する方法とは異なります。System.getenvとSystem.getProperty

私は箱にsshして、環境変数が設定されていないことを確認しました。ただし、tomcatログでは-Dプロパティが設定されていることがわかります。

回避策として、両方の場所を確認するようにコードを変更しました。


また、.Netの場合、それらは、stackoverflow.com / a / 33465765/1991614のように、環境変数ではなく、web.configファイルに挿入されます。さらに問題を混乱すると、そのキーが既に:( web.confgに存在する場合、それらが挿入されていないということです
bitcoder

あなたは私のヒーローです!Tomcat 8の-Dプロパティのマッピングにご
注意

1
実際にシステム環境変数を設定する必要がある私のような人のために、組み込みのbeanstalkスクリプトを使用してそれらの環境プロパティを取得できます。:詳細はこの回答を参照してください serverfault.com/a/770736/292741
BoomShadow

1
Amazon Linux 2017.03 v2.5.4 with Java8また、envも設定しません。
Sanoob

2
ボックスにSSH接続して変数を表示することはできません。これらは、アプリを実行したシェルでのみ設定されます。docs.aws.amazon.com/elasticbeanstalk/latest/dg/… In general, however, environment properties are passed only to the application and can't be viewed by connecting an instance in your environment and running env.変数は、などのログインスクリプトで設定されていません.bashrc。ただし、Tomcat変数はプロパティとして渡されます。(リンク先のページの上部を参照してください。)
クロエ

18

AWSは、環境変数のCloudFormationテンプレート文字列を解釈します。これを使用して、アプリケーション内のEB環境に関する情報にアクセスできます。

AWSウェブインターフェースでは、以下が環境の名前として評価されます(バックティックに注意)。

`{ "Ref" : "AWSEBEnvironmentName" }`

または、.ebextensions/*.configCloudFormationテンプレートを使用してバックティック( `)でラップすることもできます。

{
  "option_settings": [
    {
      "namespace": "aws:elasticbeanstalk:application:environment",
      "option_name": "ENVIRONMENT_NAME",
      "value": "`{ \"Ref\" : \"AWSEBEnvironmentName\" }`"
    }
  ]
}

3
あいまいですが、私が探していたものだけです。
Eric Walker

1
これに関するドキュメントはありますか?見つけられないようです。
ヤンミルス理論2018


12

または、Elastic Beanstalk CLIを使用して環境変数を設定することもできます。

環境変数を設定するには: eb setenv FOO=bar

環境変数を表示するには: eb printenv



5

これは、Beanstalkで動的な値を使用してENVを設定する唯一の方法のようです。私のマルチドッカー設定で機能する回避策を思いつきました:

1)ビルドする前にこれをDockerfileに追加し、ECSリポジトリにアップロードします。

CMD eval `cat /tmp/envs/env_file$`; <base image CMD goes here>;

2)Dockerrun.aws.jsonファイルにボリュームを作成します。

{
    "name": "env-file",
    "host": {
        "sourcePath": "/var/app/current/envs"
    }
}

3)ボリュームをコンテナーにマウントする

{
  "sourceVolume": "env-file",
  "containerPath": "/tmp/envs",
  "readOnly": true
}

4).ebextensions / options.configファイルに、次のようにcontainer_commandsブロックを追加します。

container_commands:
  01_create_mount:
    command: "mkdir -p envs/"
  02_create_env_file:
    command: { "Fn::Join" : [ "", [ 'echo "', "export ENVIRONMENT_NAME=" , { "Ref", "RESOURCE" }, ';" > envs/env_file;' ] ] }

5)ebデプロイし、ENVSをdockerコンテナーで使用できるようにする必要があります

次のようなcontainer_commandsを追加することで、ENVを追加できます。

  02_create_env_file_2:
    command: { "Fn::Join" : [ "", [ 'echo "', "export ENVIRONMENT_NAME_2=" , { "Ref", "RESOURCE2" }, ';" >> envs/env_file;' \] \] }

お役に立てれば!


命の恩人。動的環境変数がある場合(例:X: '{"Ref": "MyCache"} )コンテナーがアクセスしようとしたとき、デフォルトで'は値は解析されません(値は ' {"Ref": "MyCache"}' のみです)。これにより、そのような動的変数を持つことができます。
Petter Kjelkenes 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.