Hakoを使い始めた

github.com

最近Hakoを使い始めたのでノウハウをためていく

Hakoとは??

Dockerコンテナをデプロイするためのツールです
Hakoがうまれた背景はECS を利用したデプロイ環境 by Kohei Suzukiによると

ECSを利用しつつ、秘匿値の注入や関連するリソースや設定を操作するデプロイツールが必要

だったからだそうです

今回のHakoの使い方

Dockerコンテナをデプロイする hako deployの他に hako oneshotというECSのRunTaskAPIを呼び出し単発の実行を行うものがあるのですが、今回はこのhako oneshotを使います

今回試すものとしては

  • 実行中のログをCloudWatch Logsになげる
  • 秘匿値の管理方法

の2つを確認していきます
なお今回ECSのクラスター名はtest-clusterというものを使用したとします

実行中のログをCloudWatch Logsになげる

まずコンテナのlogをCloudWatch Logsになげる設定に関しては公式のこちらを参考にします

test.yml

scheduler:
  type: ecs
  region: ap-northeast-1
  cluster: test-cluster
app:
  image: busybox
  log_configuration:
    log_driver: awslogs
    options:
      awslogs-group: test
      awslogs-region: ap-northeast-1

コマンドライン

$ hako oneshot test.yml echo TEST!

と実行するとCloudWatch Logsのtestというロググループの中に下記のようなログが出力されます

f:id:hatappi1225:20170516194216p:plain

秘匿値の管理方法

コンテナを立ち上げる時にENVで情報を渡すことが出来る
例えばコンテナ内でDBにアクセスする必要がありコンテナ起動時にパスワードを渡したいとする

test.yml

scheduler:
  type: ecs
  region: ap-northeast-1
  cluster: test-cluster
app:
  image: my-app
  env:
    DB_PASSWORD: hogehoge
  log_configuration:
    log_driver: awslogs
    options:
      awslogs-group: test
      awslogs-region: ap-northeast-1

このようにenvを追加して

$ hako oneshot test.yml printenv

とすればCloudWatchLogsで確認すると

f:id:hatappi1225:20170516194605p:plain

DB_PASSWORD環境変数としてわたっていることが確認できた
ただこれはちょっと微妙でyamlファイルはgitで管理していくのでDB_PASSWORDのhogehogeという秘匿値は含めたくない

これの解決策としてもHakoが提供してくれている

test.env

db_password=hogehoge

このようなgitで管理しない秘匿値を定義したファイルを用意して

test.yml

scheduler:
  type: ecs
  region: ap-northeast-1
  cluster: test-cluster
app:
  image: my-app
  memory: 256
  env:
    $providers:
      - type: file
        path: test.env
    DB_PASSWORD: '#{db_password}'
  log_configuration:
    log_driver: awslogs
    options:
      awslogs-group: test
      awslogs-region: ap-northeast-1

とすると実行時にtest.envをよみにいってそれを使って環境変数として渡せるようになる
これでymlだけをgitの管理下において安心して管理できる
今回はファイルベースで管理をしていたが
Hako作者の@eagletmtリポジトリを見ると

Vaultを使って管理する

github.com

etcdを使って管理する

github.com

があるようです

最後に

Hakoを使うことで自分でAWS APIを何回も叩かなくてよくなりました