maco's life

主にエンジニアリングと読書について書いていきます。

ECSへCircleCI + ecs-deployを使ってデプロイする

ESCへの自動デプロイの設定をやったのでその備忘録です。ecrにリポジトリを作って、コンソール上から手動プロイできる状態まではできている前提で話します。

circleciへ環境変数を設定する

ますcircleciのwebコンソールのtarget-project -> settings -> Environment Variablesにデプロイに必要な環境変数を設定します。

  • AWS_ACCOUNT_ID
  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_DEFAULT_REGION

以上の4つを設定します。

circle.yml

公式ドキュメントと大体同じです。

自分はとりあえずビルド・デプロイをしたかっただけなので下記のようにしました。

machine:
  services:
    - docker

dependencies:
  post:
    - docker build -t test-app .

deployment:
  prod:
    branch: master
    commands:
      - ./deploy.sh

実際に本番で使う時は公式ドキュメント同様にtestは入れたほうが良さそうです。

deploy.sh

デプロイ処理はecs-deployにまかせています。 自分でデプロイ処理書くのは骨が折れそうなので、OSSでメンテ(されていく|できる)ものを使いました。

#!/bin/sh
set -ex

eval $(aws ecr get-login --region ${AWS_DEFAULT_REGION})
docker tag test-app:latest $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/test-app:latest
docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/test-app:latest
./docker/ecs-deploy -c ap -n test-app -i $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/test-app:latest

こんな感じです。

作ったばかりでまだ問題点とかはこれからでてきそうだけど、とりあえずこれでデプロイできるところまで行けました。

勉強会で登壇してきた話

先日、DevLOVEというエンジニアの外部の勉強会で「越境」をテーマに初めて30min セッションでトークをしてきた。

詳しい内容は会社のブログで書くのでここは書かないが、勉強会に登壇した思いだけ残したい。

この半年の自分の目標として、「アウトプットしていく」という課題があった。アウトプットというと少し抽象的だが、自分がやろうとおもったアウトプットは「OSS活動を頑張る」、「ブログ、勉強会等でやっていることを出していく」ということを主に掲げていた。そんな中、CTO経由で「勉強会登壇の話があるんだけどどうかな?」というありがたいお話を頂いた。その時期は少し忙しく、うーーーんと迷ったのだが、目標にもかがけてるし、せっかく頂いた有難いお話なので、全力で乗っかるかという気持ちで「やります!」と答えた。

やってみて結局資料の作成もギリギリになってしまったけど、イメージした形に近い発表はできたし、その会場で他の方の様々な学びある発表を聞けたので今となっては良かったと思う。 発表の前とか緊張するし、不安な気持ちはあったのだけれど、自分が話したことが誰かのためになるならいいやという心境で、悔いなく話すよう努められた。

また余談だが発表の時間配分もうまくいったし、質問もたくさん出たので、初めての登壇にしては発表はそこそこうまくできたのではないだろうか。

とまあ、振り返りとしてはこんな感じ。 目標を目指すべきところとしておいておくだけでなく、しっかり実現していけるように軽いフットワークで今後も頑張っていきたい。

ポエムになってしまったけどそんな気持ち。

バックエンドエンジニアとしての行いと評価

ちょっと前だけど自分が主担当ではないサービスのログ監視を強化したことがあった。強化しようとおもったきっかけは垂れ流しになっている5xxエラーを見て、これらのエラーはユーザに取って良くないという意識というか空気づくりとサービス品質の向上のためだった。

監視をするとやはりある程度の5xxエラーを検知したという通知が飛んできた。ユーザにとってよくない体験が起こっているので、優先度高めで修正するほうがいいと思うけど長く放置されているエラーだとユーザから問い合わせがなかったら「シュッと直すぞ!」っという空気にはなかなかなりにくい。またこれも差し込みのタスクだし、他の予定されたタスクがあれば尚更だと思う。一時期は自分が関わっていたサービスだから自分の責任もあるだろうし、自らやった反面急いで直したほうがいいと力説するのも違うなと思い、とりあえずエラーを修正したPRを出した。翌日主担当のエンジニアに修正を取り込んでもらって本番化され、しばらくの期間動いてなかった機能がちゃんと動くようになった。5xxエラーも減ったし良かったと思う。 

そんな感じでちょっとずつサービス品質向上させねばと努めていた時期があった。自分としては

  • エンジニアのエラーログに対する意識向上
  • アプリケーションの異常検知する体制の強化
  • エラーでサービスの一機能に満足に使えなかったユーザの体験を変えた

などの効果はあったんじゃないかと思うし、個人的な振り返りとしても今思うとアンテナ張って能動的に取り組んめてたとは思う。自分で良かったと思うことなので自己満かもしれませんが。

とまあその話を酒の席でする機会があったのでしてみたら「それじゃダメで、みんながそれをできるようにならないとそこまでの行為とは言えない」というお言葉を頂いた。そういう見方もあるのかと思いつつも、そこまだダメかなーってしっくり来なかったのであたまの片隅でもんもんと考えていた。

しばらく考えて自分なりにこうなのではみたいなのが考えがまとまったので忘れないようにブログに書いておく。

バックエンドエンジニアとしての行いが良かったかどうかみるには

  • サービスの品質向上に努められているか
  • パフォーマンスがでているか
  • 安定・安全に運用していけてるか
  • etc...

など至ってシンプルで、数値(監視グラフなど)として良くなってるかとどうかでも見ることができると思う。そう考えた時に今回悪かった数字が改善されたのだからやった行いとしては間違ってなかったと思う。でも人に教えるという行為も育成という面では大事だともちろん思う。サービスの品質を改善した行為と技術的なことを教えるという行為を一緒に評価するのではなくて、それぞれ別軸で加点要素としてみていったほういいのではないかな。両方できたらパーフェクト文句のつけようの気持ちで前向きにプラスに考えて行きたい気持ち。

kramdownというgemについて調べる

最近kramdownというgemを触る機会が増えてきたのですが、使い方など参考にしようとググっても実際に使ってみた例などあまり多くはないようなので公式のドキュメントを参考にしつつ、実際に使ってみようと思う。長くなりそうなので今回は簡単な紹介だけします。

github.com kramdown.gettalong.org

kramdownとは

githubのdescriptionによると

kramdown is a fast, pure Ruby Markdown superset converter, using a strict syntax definition and supporting several common extensions

と書いてあって、稚拙ながら直訳すると「pure rubyで書かれているmarkdown上位変換機能で処理が早い。厳密な構文を使って、幾つかの共通拡張をサポートしています」みたいな感じに書かれています。「???」みたいな気持ちになったので公式サイトの方を見たらわかりやすい図がありました。

https://kramdown.gettalong.org/overview.png 参照: https://kramdown.gettalong.org/

要するに様々なインプットに対して、様々なアウトプットへの変換をサポートしているらしいです。2017年1月時点だと

以上には対応しているそうです。便利。

簡単ですが最近使っているgemの紹介でした。明日は実際に使ってみた例を書いていきます。

【MySQL】idカラムをとりあえずつくる

f:id:Maco_Tasu:20170107162201p:plain

私は新規で作成するテーブルにはほぼ必ずidカラムを作成しています。定義は以下のような感じです。

`id` int(11) NOT NULL AUTO_INCREMENT, ... PRIMARY KEY (`id`)

自分がidカラムつけるのは主に、データ量が膨大なテーブルを扱う時にシーケンシャルな処理ができることです。 実装をそのidを基準に処理をかけばrow readsが少なくDBに優しい処理をかけます。

例えばPKがある場合

  1. idを1から1000までを取得する
SELECT * FROM hoge WHERE id > 0 ORDER BY id asc LIMIT 1000;
  1. 次に1001から2000までを処理する
SELECT * FROM hoge WHERE id > 1000 ORDER BY id asc LIMIT 1000;

みたいな処理をかけば、row readsは1000になると思います。これが例えばindex key基準に処理した場合そのindexでヒットする件数分row readsになると思うので良くないなという時があります。idを追加した場合のデメリットは、その分のデータ量が増えることかとおもいますがそれを許容できるような条件ならば追加しておいても損はないかなと。

ここ数年でRailsプロジェクトに関わるようになったのですが、Railsもmigrationでテーブル作成するとidカラムは自動でついてくるみたいでちょっぴり嬉しい。

勤怠のChrome拡張を社内向けに公開する

先日勤怠のChrome拡張を作ったというブログを書きましたが、一人でしばらく使ってみて便利だったので今回社内向けに公開しようとおもって調べました。

macotasu.hatenablog.jp

社内向けに公開する方法

社内向け = 一部のユーザに限定して公開とした時に現状以下の選択肢があります。

  • URLを知っている人のみの限定公開
  • Trusted Testerというテスターのメールアドレスを明示的に指定し、彼らにのみ公開
  • <ドメイン>のすべてのユーザに公開

今回は社内向けということでドメイン限定の方が都合がよかったのでこの方法を選びました。 ドメインで縛りをつけて公開する方法は公式ドキュメントのこちらに書いてあるのでそちらを参考にしてください。

すこしハマった点

ドメイン限定にしたい場合は、管理者権限が必須

管理者ユーザの方にコンソール上から「Chromeウェブストアに公開することを許可する」を有効にしてもらわないとドメインの選択肢がでてきません。ドキュメントよく読めばわかることですが、よく読まないと???ってなります。

必須項目のスクリーンショット入れ忘れに注意

ウェブストアに公開にするには1点以上のスクリーンショットが必須らしいのですが、この項目入れないでも公開ボタンが押せます。この項目を入れなかった場合に、ポリシーに反しているよっていう自動メールと思わしきものが飛んできますがどう読んでも文章が繰り返しの表現とか誤解を招く表現とかしか書いてなくスクリーンショットの問題じゃないか気づくのに難儀しましたが現状そこ以外問題なりそうな点はないので間違いないかと。(※スクリーンショットが必須という点は入力時にフォーム付近にカーソルをあてたらhover?で注意書きがでてきます)

2, 3度失敗したら人力によるチェックに移るらしく数営業日待たされるそうです。

. . . . . . . . . . . .

そして私は今待っています。 (泣)

もし急ぐような場合などでは、管理者だと電話やチャットでのサポートが受けられるそうなので、相談してみるといいのかもしれません。