env-injectorを階層化パラメータに対応させた

引き続きコレの件。

github.com

最初に

前のエントリの追記で、 ENV_INJECTOR_MODE に対応とか書いてたけど、どうも git push を忘れていた模様。orz…

今回の修正で大体ユースケースカバーできそうなので、もうこのままなかったことにします(ぉ

階層化パラメータ

DescribeParametersでは対象のパラメータをIAMでリソース制限できないのがちょっとアレかなぁと思って 今までのenv-injectorは、inject対象リスト作成のためにあえて事前に空の環境変数を用意するようにしてました。

でもアップデートで対応された階層化されたパラメータに対してGetParametersByPathを使えば必要なパラメータだけに絞ったアクセス許可をIAMで設定できます。

というわけでenv-injectorでも対応してみました。

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

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetParametersByPath"
            ],
            "Resource": [
                "arn:aws:ssm:ap-northeast-1:123456789012:parameter/prod/wap"
            ]
        }
    ]
}

こんなカンジでパラメータが設定されているときに

$ aws ssm get-parameters-by-path --with-decryption --path /prod/wap
{
    "Parameters": [
        {
            "Type": "String",
            "Name": "/prod/wap/DB_USER",
            "Value": "scott"
        },
        {
            "Type": "SecureString",
            "Name": "/prod/wap/DB_PASSWORD",
            "Value": "tiger"
        }
    ]
}

ENV_INJECTOR_PATH を指定して実行するだけ。

$ ENV_INJECTOR_PATH=/prod/wap env-injector printenv | grep DB_
DB_USER=scott
DB_PASSWORD=tiger

DescribeParametersのような制限の効かないパーミションも不要ですし、AWS的にも階層化されたパラメータ推しっぽいので今後はこっちを使うとイイトオモイマス。

意図しないパラメータがinjectされるかも、、、という懸念は残りますが、、、ま、いっか、ということで。(;・∀・)

そんなわけで今後もenv-injectorをよろしくお願いします。

AWS環境下で動かすDockerのイメージのENTRYPOINTに仕込んでおくと本当に便利なので、是非使ってみてください