AWS
ECS
hako

rcredstash を用いて hako の環境変数を暗号化する

Advent Calendar の季節ですね。
年末の大掃除の心持ちで、なんとなく技術的なメモみたいなものを残していこうと思います。

なお、さだまさしの話は、先日「さだまさし コンサートツアー2017 惠百福(たくさんのしあわせ)」を観覧してきて放心状態なので、今年は割愛します。

ここでは、個人的に簡単に AWS 上にサーバー環境構築を行う際に用いている hako と credstash の組み合わせに関する話を書きます。

hako

https://github.com/eagletmt/hako

hako は AWS ECS (Elastic Container Service) を便利に使うための docker オーケストレーション実装のひとつです。
ドキュメントが極めて少ない印象がありますが、非常に良く出来たツールです。

ECS の API をラップして、以下の機能を実現しています。

  • ECS の環境の包括的な構築処理。設定ファイルは DSL(yaml) で記述可能
    • task definition
    • service
    • auto scaling
    • alb
  • backend の port direct mapping に対応
  • blue / green deployment を標準でサポート
  • 自動 rollback 機能を標準でサポート
  • hako oneshot という機能で一時的な container 起動が可能
    • バッチ処理などに用いることを想定

ECS 同種のツールとしては他に blox ( https://blox.github.io/ ) というものが有名なのですが、hako の方はコマンドラインだけで完結できシンプルであることや blue / green deployment を完全にサポートしているため便利です。

ドキュメントやサンプル設定ファイルなどは、上述の公式 github の内容が参考になります。

credstash

AWS の DynamoDB と KMS を組み合わせて、情報を暗号化して保存するための仕組みを提供するツールです。
詳しくは、以下の記事などを参照ください。

credstash について

hako-rcredstash

https://github.com/moaikids/hako-rcredstash

hako において、credstash で暗号化した情報を用いて環境変数の情報を設定できるように拡張した実装になります。

こちらを用いると、Ruby 製の credstash ライブラリである rcredstash ( https://github.com/adorechic/rcredstash )を通じて hako で暗号化された情報を扱えるようになります。

install

$ gem install hako
$ gem install rcredstash
$ gem install hako-rcredstash

実際は Gemfile にまとめて bundle install で入れることを推奨します。

set encrypted value using rcredstash

(r)credstash に情報を追加します。
"veryverysecret" という文字列は実際は暗号化されて "AQIBAHidXVv5qOYRYiIP2jXGm3AcDXunTO9…" というかたちで保存されています。

$ rcredstash put encrypted.some_password
secret value> veryverysecret
$ rcredstash get encrypted.some_password
veryverysecret

config hako

credstash で暗号化された値を hako で使う場合は、env_provider で rcredstash を指定すれば OK です。
あとは、使用したい暗号化済みの値を保持している key 文字列を以下のように #{.......} という形で指定すれば、その値が復号化されて使われます。

env:
    $providers:
      - type: rcredstash
    SOME_PASSWORD: ‘#{encrypted.some_password}'

deploy using hako

あとは、通常の hako の使い方と同じです。

まとめにかえて

credstash の記事にも書きましたが、今はこれらの暗号化・復号化処理は Parameter Store を使った方が自然かな、とも感じています。
必要に応じて、 hako-parameterstore みたいなプラグインを書いてみようかな、と思っています。