env-injectorをSecrets Managerに対応させました。

AWS Secrets Managerリリースされましたね。
そんなわけでenv-injectorをSecrets Managerに対応させました。

ダウンロードはgithubのリリースページからどうぞ。

使い方は、こんなカンジでSecretが登録されている状態で

$ aws secretsmanager get-secret-value --secret-id prd/db --query SecretString --output text
{"DB_USER":"scott","DB_PASSWORD":"tiger"}

ENV_INJECTOR_SECRET_NAME を指定して任意のコマンド実行すれば、環境変数が設定された状態でそのコマンドが実行できます。

$ export ENV_INJECTOR_SECRET_NAME=prd/db
$ env-injector printenv | grep DB_
DB_USER=scott
DB_PASSWORD=tiger

必要なIAMのポリシーはこんな感じです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue"
            ],
            "Resource": [
                "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:prd/db-*"
            ]
        }
    ]
}

もちろん今まで通り、ENV_INJECTOR_PATHENV_INJECTOR_PREFIX での指定も引き続き有効です。


まあココまでだとシンプルなんですけど、Secrets ManagerはRDS等対象コンポーネント毎にシークレットを管理するものっぽいので env-injectorの「アプリケーションで使うシークレットを管理する」という方向性とちょっとズレがあります。

というわけで、複数のSecretやパラメータストアと組み合わせるような機能も追加しました。

以下のようにSecretやパラメータストアの設定のyamlをパラメータストアに保存しておいて

$ aws ssm get-parameter --name /meta/prd/wap.yaml --query Parameter.Value --output text
# secretの名前を指定
- secret_name: prd/db1

  # RDSのsecretとかだと同じkeyでクレデンシャルが保存されるので、
  # 複数になったときに区別をつけるためのprefix(オプション)
  env_prefix: db1

  # 環境変数にする際にkeyを大文字化したい場合に指定する(オプション)
  capitalize: true

- secret_name: prd/db2
  env_prefix: db2
  capitalize: true

# その他、パラメータストアからも読み出し可能
# (ENV_INJECTOR_PATHで指定するのと同じ機能)
- parameter_store_path: /prod/wap

あとは ENV_INJECTOR_META_CONFIGyamlのパスを指定して任意のコマンドを実行するだけ。

$ export ENV_INJECTOR_META_CONFIG=/meta/prd/wap.yaml
$ env-injector printenv
DB1_USERNAME=alice
DB1_PASSWORD=hogehoge
DB1_HOST=xxxx.ap-northeast-1.rds.amazonaws.com
DB1_PORT=3306
(中略)
DB2_USERNAME=bob
DB2_PASSWORD=mogemoge
DB2_HOST=yyyy.ap-northeast-1.rds.amazonaws.com
DB2_PORT=3306
(中略)
SOME_OTHER_CONFIG_FROM_PARAMETER_STORE=hogeohge

これで既にパラメータストアで管理していたクレデンシャルのうち、一部をSecrets Managerに移行する、とかもできるようになりました。

そんなこんなで、引き続きご利用いただけると、ウレシイですー


……対応しといてアレなのですが、Secrets Managerってパラメータストアと違ってオカネかかるし、機能的にも大きく変わらない(lambdaでローリング更新するのはパラメータストアでもできる)し、ぶっちゃけパラメータストアでええのんちゃうん?という気がしています。(;・∀・)

はてさて、どーなんすかね?