AWS
docker
ECS
credstash

credstash を使って Docker にクレデンシャル情報を渡す例2つ

Docker の起動スクリプトや docker-compose.yml を git で管理していると、パスワードなどのクレデンシャル情報の扱いに困ることがよくあります。

もし実行環境がAWSにあるのなら、credstash というツールを使うとクレデンシャル情報の管理が簡単にできます。AWS以外の環境ではあまり使えません。

credstash はクレデンシャル情報を KMS を用いて暗号化した上で DynamoDB に保存してくれるツールです。
KMS や DynamoDB にアクセスする権限は IAM Role により制御できるため、例えば ansible vault のように、マスターパスワードを持つ必要がありません。

credstash については https://qiita.com/winebarrel/items/71e534f294a10224cbd3 などで詳しく紹介されているので、こちらをご覧ください。

この記事では docker と credstash を組み合わせて使う例を2つほど紹介します。

その1 ~ docker コマンドから渡す

docker run コマンドは -e オプションで環境変数を渡すことができます。

例えば、次のような起動スクリプトを書くことができます。

run.sh
docker run -e MY_PASSWORD=$(credstash get my-password) my-image

その2 ~ CMD 内部で取得する

docker 起動時にコンテナ内部でクレデンシャル情報を取得する方法です。

コンテナ内部から credstash を利用する場合、 credstash のGo版である gcredstash がバイナリ1つでインストールできるので便利です。

FROM ubuntu
...
RUN curl -L https://github.com/winebarrel/gcredstash/releases/download/v0.3.5/gcredstash-v0.3.5-linux-amd64.gz > /usr/local/bin/gcredstash \
 && chmod +x /usr/local/bin/gcredstash
...
CMD MY_PASSWORD=$(gcredstash get my-password) \
    ./run-my-app

docker build 時ではなく、コンテナ起動時に gcredstash を呼び出すため、ENV コマンドではなく CMD コマンドでクレデンシャルを取得する必要があることに注意です。

この方法は、特に docker-compose で ECS の実行環境を管理している場合に便利です。

例えば、次のような docker-comose.yml を用いると、dockerイメージに手を加えることなくクレデンシャルを渡すことができます。
ECS コンソールにもクレデンシャル情報は表示されません。

service: '2'
---
services:
  app:
    ...
    volumns:
    - /path/to/gcredstash:/usr/local/bin/gcredstash
    command: |
      bash -lc '
      MY_PASSWORD=$$(gcredstash get my-password) \
      ./run-my-app
      '