[小ネタ] ElasticBeanstalkのアプリケーション環境変数をCSVで出力

こむろ@大体EB職人です。

やりたいこと

ElasticBeanstalkのアプリケーション環境変数って結構数があるといちいち取得するのは面倒です。ドキュメントに設定値を記載したい場合等、いちいちコンソールから取り出すのが面倒なので、とりあえずAWSコマンドでCSVとして環境変数を取得するためのコマンドを確認しました(単純なAWS CLIコマンドとjq)

前提

  • aws-cli/1.16.53 Python/3.6.1 Darwin/17.7.0 botocore/1.12.43
  • jq-1.5

コマンド

$ aws elasticbeanstalk describe-configuration-settings \
      --profile <YOUR_PROFILE> \
      --application-name <APPLICATION_NAME> \
      --environment-name <ENVIRONMENT_NAME> | \
      jq -r '.ConfigurationSettings[0].OptionSettings | map(select(.Namespace == "aws:elasticbeanstalk:application:environment")) | .[] | [.OptionName, .Value] | @csv'

これを実行すると以下のようなCSVが出力されます。

"XXXXX_EVENT_TOPIC_ARN","arn:aws:sns:ap-northeast-1:xxxxxxx:hogehogeTopic"
"XXXXX_ASSETS_BUCKET_NAME","hogehoge-assetsbucket"
"XXXXX_REDIS_CACHE_CLUSTER_ID","hogehoge-cluster"
"CFN_STACK_NAME","dev-hogehoge"
"ELASTIC_BEANSTALK_ENV","true"
"LOG_BUCKET_NAME","dev-hogehoge-logbucket"

環境変数のリストが簡単に取得できました。

コマンド要素

必要な箇所を抜粋して解説します。

describe-configuration-settings

AWS CLI Command Reference - aws elasticbeanstalk#describe-configuration-settings

EBの環境設定のパラメータを引っ張ってきます。以下のようなResponseが取得できます。

{
  "ConfigurationSettings": [
    {
      "SolutionStackName": "64bit Amazon Linux 2018.03 v2.12.4 running Docker 18.06.1-ce",
      "PlatformArn": "arn:aws:elasticbeanstalk:ap-northeast-1::platform/Docker running on 64bit Amazon Linux/2.12.4",
      "ApplicationName": "<APPLICATION_NAME>",
      "EnvironmentName": "<ENVIRONMENT_NAME>",
      "DeploymentStatus": "deployed",
      "DateCreated": "2018-11-13T05:25:16Z",
      "DateUpdated": "2018-11-16T03:01:03Z",
      "OptionSettings": [
        {
          "ResourceName": "AWSEBAutoScalingGroup",
          "Namespace": "aws:autoscaling:asg",
          "OptionName": "Availability Zones",
          "Value": "Any"
        },
        {
          "ResourceName": "AWSEBAutoScalingGroup",
          "Namespace": "aws:autoscaling:asg",
          "OptionName": "Cooldown",
          "Value": "360"
        },
     .....
     }
  ]
}

環境変数等の設定は OptionSettings 以下に記載されています。

jq -r

ダブルクォーテーションが残ると鬱陶しいので -r で消しておきます。

.ConfigurationSettings[0].OptionSettings

ConfigurationSettingsは配列ですが要素は一つだけなのでIndex 0を直値で取得します(まあ、Iterationしても良い気がしますけど)。その中の OptionSettingsの配列を取得します。

map(select(.Namespace == "aws:elasticbeanstalk:application:environment"))

Namespace の名称が aws:elasticbeanstalk:application:environment となっているパラメータのみ取り出して配列を再構成します。

[
  {
    "Namespace": "aws:elasticbeanstalk:application:environment",
    "OptionName": "XXXXX_EVENT_TOPIC_ARN",
    "Value": "arn:aws:sns:ap-northeast-1:xxxxxxx:hogehogeTopic"
  },
  {
    "Namespace": "aws:elasticbeanstalk:application:environment",
    "OptionName": "XXXXX_ASSETS_BUCKET_NAME",
    "Value": "hogehoge-assetsbucket"
  },
  {
    "Namespace": "aws:elasticbeanstalk:application:environment",
    "OptionName": "XXXXX_REDIS_CACHE_CLUSTER_ID",
    "Value": "hogehoge-cluster"
  },
  ...
]

.[] | [.OptionName, .Value] | @csv

配列の中身を取り出してIteration。1つ目の要素をOptionName, 2つ目の要素をValueのTupleとしてCSVを再構成します。

"XXXXX_EVENT_TOPIC_ARN","arn:aws:sns:ap-northeast-1:xxxxxxx:hogehogeTopic"
"XXXXX_ASSETS_BUCKET_NAME","hogehoge-assetsbucket"
"XXXXX_REDIS_CACHE_CLUSTER_ID","hogehoge-cluster"
"CFN_STACK_NAME","dev-hogehoge"
"ELASTIC_BEANSTALK_ENV","true"
"LOG_BUCKET_NAME","dev-hogehoge-logbucket"
...

これでEBのアプリケーション環境変数のパラメータリストを取得できました。

それEBコマンドでできるよ

ElasticBeanstalkの場合、ebコマンドを利用することもあります。ebコマンドの場合は printenv で簡単に環境変数のダンプを取れるようです。

こっちのほうがお手軽そうなのですが、ebコマンドは事前にinitしてないといけなかったりと、それなりに準備が必要になります。基本的にebコマンドでやりよりもaws CLIでやったほうがやれることが多いような気がしているので自分はあまり利用していません。

まとめ

EBのアプリケーション設定値が結構膨大だったのでCLIで一気に取得するようにしました。

EBの設定値周りは結構複雑で数も多いため、コンソールで確認するよりCLIで確認した方が良さそうです。さらに結構パラメータが多いのでjqを使って適度にフィルタリングしてうまく確認しましょう。

ではまた。

参照