AWS上で動かすアプリケーションとクレデンシャル情報
AWSで動かすアプリケーションのクレデンシャル情報ってどう管理してますか?
chefやansibleでプロビジョニングしたりするにしても、平文でgit管理するのもアレだし、暗号化してコミットするのも結局扱いにくいし……と悩ましいですよね?
そんな中、こちらのクラスメソッドさんのエントリを拝見したところ dev.classmethod.jp
「AWS上で動かすアプリのクレデンシャル情報をパラメータストアから環境変数にぶっこんでくれるツールがあればイケてるんじゃね?」と思いついてしまったので、勢いでPoC的に作ってみました。
使い方は、空の環境変数用意しておいてから
$ export DB_USER= $ export DB_PASSWORD=
プレフィックスを指定して、env-injector経由で任意のコマンドを実行します。
$ ENV_INJECTOR_PREFIX=prod.wap env-injector printenv | grep DB_ DB_USER=scott DB_PASSWORD=tiger
するとパラメータストア(この例ではprod.wap.DB_USERとprod.wap.DB_PASSWORD)の値が環境変数に入った状態でそのコマンドが実行されます。
dockerの場合ですと、以下のDockerfileのようにENTRYPOINTで指定するといいんじゃないかなぁ……と。
FROM golang AS build-env RUN CGO_ENABLED=0 go get github.com/okzk/env-injector FROM alpine RUN apk add --no-cache ca-certificates COPY --from=build-env /go/bin/env-injector /usr/local/bin/ ENTRYPOINT ["env-injector"] ENV DB_USER= DB_PASSWORD= CMD ["printenv"]
プレフィックスを指定しなければなんの影響もありませんし、
# docker build -t test . # docker run --rm test | grep DB_ DB_USER= DB_PASSWORD=
環境を切り替えるのもラクチン。
# docker run --rm -e ENV_INJECTOR_PREFIX=prod.wap test | grep DB_ DB_USER=scott DB_PASSWORD=tiger # docker run --rm -e ENV_INJECTOR_PREFIX=stg.wap test | grep DB_ DB_USER=admin DB_PASSWORD=password
アプリケーション本体は普通に環境変数で設定を受け取るように作るだけでOKですので、アプリケーションとパラメータストアが密結合になることもありません。
ECSで動かすアプリケーションも適切にtask roleと組み合わせればクレデンシャル管理もバッチリになる、ということで。