AWSの話題を中心に、日々の業務やプログラミングの徒然を綴るエンジニアブログです。

HANDS LAB

HANDS LAB ENGINEERS BLOG

ハンズラボエンジニアブログ

作者別: KurashimaWataru

CRMチームの技術展望

Pocket

CRMチームのエンジニアリーダー(仮称)の倉嶋です。
(仮称)としているのは、今年度からできた役職で名称がまだ固まってないからです。
チームの組織課題について責任を負っています。

さて。自チームの技術展望について、過去・現在を元に書きます。
免責事項として、社全体の展望ではありません。自チームに閉じたものです。

過去 (2015年度以前)

  • 外部ベンダ製のパッケージから内製化への移行期。
  • オンプレミスなサーバからAmazon EC2へ移行。
  • Web・Web API・バッチの全てをユニケージ開発手法(以下、ユニケージ)で開発。
  • 開発・運用とも元販売員エンジニアが実施。

現在 (2015年度〜2018年度)

  • ほぼ内製移行が完了。AWS移行も完了。EC2以外のサービス利用が増加。
  • ユニケージが不向きと判断したシステムについては言語をPHP/Node.jsへ、データストアをDynamoDB/RDSへ移行。
  • 東急ハンズ出向者が減り、中途採用の専業エンジニアによる開発・運用。
  • ハンズラボ社としての新卒採用を開始。

過去と現在の差分

  • 内製化により、ブラックボックスとなっている箇所がごく少ない状態になった。
  • AWS化により機器故障等のハードウェア運用作業がほぼゼロになった。
  • AWS化・多言語化・NoSQL/RDB化により、必要な技術知識の幅が大きく広がる。
  • 「業務知識>技術知識」な開発者から「業務知識<技術知識」な開発者へ。

近い未来

  • 開発者が業務知識を持つ状態から、コードが業務知識を表す状態へ遷移する。
  • コードレビュー・モブプログラミングによる暗黙知の継続的な転移。
  • コンテナ技術の利用による開発言語・ツールの選択肢の増加とdeploy単位の細分化。
  • 新規参画メンバーの早期戦力化のためのオンボーディングプロセスの改善。

まとめ

より、エンジニアにとって魅力あるチームへ変えていくことが自身のミッション、と捉えています。
自チームを「参画すると成長できる」「他社・他チームから入りやすい」「休みやすい・在宅勤務しやすい」「自分が選んだ技術を使える」ものへ変えていきたいです。
先日の清水の記事「バッチ処理をECSに移行した話(GitHubActionsもあるよ)その1」はその実践の一つです。

まだ残っている2015年度以前に開発したアプリケーションもあり、順次マイグレーションを進めています。開発プロセスの改善を継続しながら、近い未来をより早く引き寄せるために、マイグレーションの速度も加速させていきたいです。

まだ、「遠い未来」については描けてはいませんが、チームのメンバーと一緒に考えていきます。
新規メンバーの募集と受入のため、「チームのJobDescriptionの作成」「OnBoardingプロセスの文書の作成」を並行して作成しています。
こちらも、いずれ公開したいです。
生煮えのプライベートリポジトリ版にご興味のある方は、ぜひ中途採用にご応募ください。その時点の最新版をお渡し致します。

※アイキャッチはフリー写真素材ぱくたそhttps://www.pakutaso.comさんの画像です。

Pocket

GolangでDynamoDB CLIを書く話

Pocket

gopherくん

こんにちは。クラシマです。
ハンズラボ Advent Calendar 2017 4日目の記事です。

もう随分前になりますが、井上がGolang製のDynamoDB用のCLIを探していたことがありました。

ネットストアのセールに向けて行った負荷対策について/ハンズアラボエンジニアブログ

結局見つからなかったのでNode.jsで井上本人が書き、現在もECサイトの本番環境で使っています。
↓それがこちらのbikkeです。
https://github.com/inouet/bikke

10月末くらいから趣味プロジェクトでGolangを書いていたのですが、
井上の記事を思い出したのでDynamoDB用のCLIを書くことにしました。
できあがったものが↓これです。
https://github.com/watarukura/gody

自分でCLIのツールを書くのは初めてなので三歩進んで二歩下がりながら進めています。
個人的にJSONを手で書くのが苦痛なので、JSONをオプションに使わない、というのがコンセプトです。
まだlist/get/query/scanしかできないので、put/update/deleteができるようになったら本番環境で使えないか検証したいところです。
put/updateのオプションをどうするか、今も悩んでいます。
テストもあまり書けてないですし・・・。
趣味プロジェクトから業務プロジェクトに反映するにはもう少し時間がかかりそうです。

Golang、いいですね!
低レイヤーの知識がないと速いプログラムが書けない、というところも魅力です。
日頃はPHPを書いていて、ポインタやバッファを気にすることはなくて、この辺りの扱いはさっぱりです。
今のところも並行処理的な機能をほぼ使ってないので、速くなる余地が随分残っている気がします。
あとは、JSONの扱いが楽なのがモダンな言語という感じがします。
弊社、ユニケージ開発により大量のBashスクリプトが稼働していますが、JSONの扱いは特に困るところです。
DynamoDBをデータストアの1st Choiceにするプロジェクトはそれなりにあるので、
そこでJSONを経由せずにDynamoDBを扱えるようになると、楽ができる部分は結構増えます。
ECサイト以外でも、ハンズラボ全体で使えるツールになるといいなぁと夢想しています。

AWS LambdaのGolangサポートも発表されましたし、今後ますますGolangを使うシーンが増えそうです。
折よく、開発に使っていたGoLandも販売開始になりました。
PHPStormユーザがGolangを書くならGoLandで決まりですね!

ハンズラボ Advent Calendar 2017 の5日目は、青木さんです。

Golangの学習には以下の書籍とサイトに大変お世話になりました。
この場を借りてお礼申し上げます。

※ アイキャッチのGopherくんの原著作者はRenée Frenchさんです。

Pocket

Elastic Beanstalkスケールイン時にlogが消えちゃう問題

Pocket

倉嶋です。
最近はすっかりPHPerとしてPHP Stormと戯れる日々です。
頭のいいIDE使うと、知識が足りないところが補完されるので頼りっぱなしです。
AWSはまだまだ補完されない領域が多いので、自分で頭を使う必要がありますね。
ということで、Elastic Beanstalkのログ取得でハマったところをご紹介。

ElasticBeanstalkのログ保存方法
↑こちらの記事にあるとおり、Elastic Beanstalkのログは設定すれば定期的に勝手にS3へ格納されるのですが、サーバが減った時に消えちゃいます。
コレは困る。
ということで、シャットダウン時にログ書き出しのスクリプトを動かすようにしました。

Linuxでシャットダウン時に想定した処理が実行されない
こちらを参考に、ランレベル0と6で動作するスクリプトを書きました。

さらに、.ebextensionsで、このスクリプトを配置するスクリプトを用意しました。
この辺がElastic Beanstalk使う時の難しいところですね。

これで、サーバ起動時・終了時に強制的にlogrotate→S3へログを転送することができます。
(logrotateのconfも書き換えていますが、こちらは割愛)

fluentdあたりを使えば悩む必要ないかもですが、この辺りまでElastic Beanstalkのデフォルトで面倒見てほしいなぁ。。。

<追記>

喉もとすぎれば熱さを忘れるわけで、割愛と書いた中にもハマリポイントが。
logroateのデフォルトのconfでは、size 10MB指定になっています。
この場合、10MBを超えていないとlogrotateしません。rotateしないとS3へも配信されないので、sizeを1にしています。

Pocket

SlackBot大量生産中。

Pocket

HHBot

BooklogBot作った倉嶋です。
↑は昨日・今日で作った社長の予定を通知するHHBotです。(Hideki Hasegawa Botの略)
今日はLambda+PythonじゃなくてGoogle Apps ScriptでSlack Bot作った話をば。

おかげ様で前回の投稿は好評いただいたのですが、Lambdaで作ると大量生産には向きません。
もっと遊びたい 基、Slack生活向上のため、もっと簡単に作りたい。
ちょっと調べてみたところ、Google Apps Scriptで作るのが良さそうだ、ということでいくつか作ってみました。

ざっくりお昼休み2,3回に1つくらいのペースでBotが作れます。
以下、作ったBotを順不同に。

  • 今日の予定通知Bot
  • 社内ポータル更新通知Bot
  • 今日のオススメランチBot
  • Slackに新しいチャンネルできたよBot
  • Slackのスターをつけたよ消したよBot
  • 社長の予定通知Bot new!

Google Apps Scriptのいいところ

  • Googleのサービスとの連携が簡単
  • Slack連携のライブラリを公開してくれている方がいる
  • Javascriptで書ける
  • 勝手に版管理してくれる

東急ハンズはGoogle Apps for Businessを全社的に導入していますので、メールはgmail、カレンダーはgoogle calendar、忘年会の出欠簿はgoogle spreadsheetです。
(MS Officeも使っていますが、ハンズラボメンバーはMacユーザも多く、それほど使用頻度は多くないです)
おかげで、gmailやgcalと連携してほしい情報をjsonなどで取ってきて、ちょっと体裁を整えてSlackに投げればBotがすぐに作れます。
Google Apps Scriptの拡張子は.gsですがほぼJavascriptなので、Javascriptの勉強にもなります。

Google Apps Scriptのもう少し・・・なところ

  • Editorが組み込みオブジェクトのメソッド・プロパティは補完してくれない
  • プロジェクトが個人のmailアドレスに紐づくので、作った人が退職したら「権限の譲渡」とかしないと読めなくなる
  • npmなどでライブラリの追加ができない
  • 時間帯指定では起動できるが、時刻指定はできない

var dt = new Date(); とかしたらDateオブジェクトのメソッドとか補完してほしいじゃないですか!
あとはECMAScript2015対応とかどうなるんですかね?

Google Apps Script、お気軽に作れておすすめです。社内のJavascript勉強会で作り方を共有したので、倉嶋以外が作ったBotもドンドン作られるはず。どんなBotが出てくるか、楽しみです!

— 追記 —

参考にさせていただいたサイトは以下のとおりです。ありがとうございます!

Slack BotをGASでいい感じで書くためのライブラリを作った
今日の予定をまとめて教えてくれるslackの秘書BOT

Pocket

ハンズラボ本棚の更新通知をSlackに流したい!

Pocket

はじめまして。ハンズラボ歴3ヶ月、pythonista歴3日の倉嶋です。

ハンズラボでは技術書は経費で落ちますので、みんなドンドン買ってきます。
総務担当がポチポチGoogleスプレッドシートに蔵書登録していたのですが、登録が間に合わず、未登録の蔵書が散見されるようになりました。
解決のため、BooklogにWeb本棚を作りました。
BookLog

モバイルアプリからもバーコードで登録できて便利!各自で登録できる!
ついでに新規登録した蔵書をSlackに流したい!ということでBooklogのRSSフィードを使って作りました。
ハンズラボっぽい縛りは以下のとおりです。
* せっかくだからAWS使おう。新機能のLambdaのScheduledEventだ!
* Lambdaでpython使えるようになったし、pythonで書いてみよう!

・・・と勢いこんで作ってみたはいいものの、python+lambdaの落とし穴にハマるハマる。
* python書くの初めてで、標準ライブラリか外部ライブラリかがわからない。
* 外部ライブラリはzipアップロード時に含める必要あり。pipで落とすときに-tオプション使ってディレクトリ指定する。
* 「1時間前の時刻を取得したい」ところなんですがRSSの時刻表記をYYYYMMDDにしたり時間計算したりがうまくいかない・・・。
* Lambdaのpythonは2.7なので、UTF-8文字列は明示的にu’’。
* UTF-8文字列のURLエンコードでハマる。asciiじゃないよエラーいっぱい出て泣く。
* AWSコンソールでは日本語文字列使えないぽいので、zipで固めてuploadする。(Lambdaのコンソールでコード書いてsaveすると文字化けする。コメントもろとも)
* zipファイルアップロード時に「fileb://」ってつけないとNG。
aws lambda update-function-code --function-name check_booklog_tl --zip-file fileb://booklog2slack.zip
* アップロード時、本体のファイル名はlambda_function.py固定。
* def lambda_handler(event, context)がないと動かないのでローカルでのテスト時にいちいち書き換えないといけない。
* Scheduled Eventの登録で謎のエラー・・・いつの間にか登録できてたのでエラーの原因がわからん・・・。

半日くらいの見込みだったのですが80行のコードに2日位かかって、ようやく完成しました。
github

Booklog_Lambda_Slack_IF
おかげさまで社内ではそれなりに好評です。
反省点は、「公式ドキュメント、大事」「似たようなことやってる人を探すの、大事」です。
いきなりやりたいことをやる前に、公式のサンプルプロジェクトをやっておけば半分の時間で完成できた気がします。

ちなみに、シェルスクリプトで作った参考実装は1時間くらいでできました。Lambdaでbashが動いてくれれば・・・。

Pocket