web-dev-qa-db-ja.com

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

Amazon Elastic Beanstalkの宣伝文句:

Elastic Beanstalkを使用すると、「フードを開く」ことができ、フルコントロールを維持できます。環境変数をElastic Beanstalkコンソールに渡すこともできます。

http://aws.Amazon.com/elasticbeanstalk/

Elastic Beanstalk設定内の環境変数以外の他の環境変数を渡す方法は?

112
Ben

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

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

Environment Properties

オネマの答え のように.ebextensionsで変数を作成しても、引き続き機能します。

それも好ましい場合があります。後で別の環境に展開し、それらを手動で設定するのを忘れる場合、または値をソース管理にコミットしても問題ない場合。私は両方を組み合わせて使用​​します。

130
lime

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がコメントで述べたように、新しい look and feel が2013年7月18日にリリースされたため、コンソールから直接環境変数をいくつでも定義できます:

Configuration > Software Configuration > Environment Properties

105
Onema

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

-「次のプロパティは、環境変数としてアプリケーションに渡されます。詳細をご覧ください。」

Java Tomcat AMIの場合、このステートメントは正しくありません。 Amazonはnotを環境変数として設定します。これらは、jvmの-DプロパティとしてコマンドラインでTomcatに渡されるシステムプロパティとして設定されます。環境変数を取得するJavaのメソッドは、プロパティを取得する場合と同じではありません。 System.getenvとSystem.getProperty

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

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

27
Ed J

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

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

`{ "Ref" : "AWSEBEnvironmentName" }`

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

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

環境の詳細->構成の編集->コンテナ

enter image description here

9
Ben

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

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

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

9
trex

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

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

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 deployと、ENVSがdockerコンテナーで使用可能になっている必要があります

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

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

お役に立てれば!

5
dsorensen