AWS上で動かすアプリケーションとクレデンシャル情報

AWSで動かすアプリケーションのクレデンシャル情報ってどう管理してますか?
chefやansibleでプロビジョニングしたりするにしても、平文でgit管理するのもアレだし、暗号化してコミットするのも結局扱いにくいし……と悩ましいですよね?

そんな中、こちらのクラスメソッドさんのエントリを拝見したところ dev.classmethod.jp

AWS上で動かすアプリのクレデンシャル情報をパラメータストアから環境変数にぶっこんでくれるツールがあればイケてるんじゃね?」と思いついてしまったので、勢いでPoC的に作ってみました。

github.com

使い方は、空の環境変数用意しておいてから

$ 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と組み合わせればクレデンシャル管理もバッチリになる、ということで。