この記事は、ハンズラボ Advent Calendar 2019 15日目の記事です。
CRMチームの倉嶋です。
hands.netの消費税対応について書きます。
2019/09/29の00:00〜14:00にかけて、hands.netおよび外部モールすべてで販売を停止し、消費税率の切り替え対応を実施しました。
東急ハンズでは、出荷した日に売上が計上されるルールです。ですので、出荷した日の消費税率が適用されることになります。また、hands.netは注文日の3日後から配送日を指定できます。12/15の注文では、12/18から配送指定できる、ということです。そして、配送指定日の少なくとも1日前には出荷する必要があります。(発送元が新宿となるため、配送先によっては2日前に出荷する場合もあります)
こちらを踏まえると、9/29に注文を受けた場合、出荷日が必ず10/1以降となるため、消費税率は10%が適用されます。
と、理屈は簡単なのですが、システム側としては種々の苦労がありました・・・。
続きを読む ECサイトの消費税率を2019/09/29に切り替えた話
この記事は、ハンズラボ Advent Calendar 2019 8日目の記事です。
ヘテロジニアスってかっこいい単語だなーと思ったので使ってみました。弊社ECサイトhands.netの在庫管理はDynamoDBとAurora MySQL(以下、Aurora)の2種の異種データベースを利用しています。
CQRSです、と言えるとかっこいいのですが、業務要件と歴史的経緯でこの様になっています。
前提として、hands.netの在庫は主に東急ハンズ新宿店の店頭の商品を在庫としています。他に、メーカーからの直送商品や、後述するハンズメッセ用に外部で倉庫を借りて使うケースもあるのですが、煩雑なので割愛します。
そして、東急ハンズは外部モールへの出店も数多く行っています。
Yahooショッピング、楽天市場、Ponpareモール、Amazonマーケットプレイス、au Wowma!などです。こちらとも在庫数を同期する必要があり、各モールのAPIを使用して注文を取得、在庫を連携する、ということをしています。
続きを読む ヘテロジニアスデータベースによるECサイトの在庫管理
CRMチームのエンジニアリーダー(仮称)の倉嶋です。
(仮称)としているのは、今年度からできた役職で名称がまだ固まってないからです。
チームの組織課題について責任を負っています。
さて。自チームの技術展望について、過去・現在を元に書きます。
免責事項として、社全体の展望ではありません。自チームに閉じたものです。
続きを読む CRMチームの技術展望

こんにちは。クラシマです。
ハンズラボ 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
|
# AWSプロファイルはstg # itemテーブルからGSI:jan-indexのパーティションキー:janに4937751121103を指定でqueryする # 出力はヘッダ付きで空白区切りテキスト(ssv)とし、出力するフィールドはjanとnameに絞る gody query \ --profile stg \ --table item \ --pkey 4937751121103 \ --index jan-index \ --format ssv \ --header \ --field jan,name => name jan つぼキーク 4937751121103 |
自分で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さんです。
倉嶋です。
最近はすっかりPHPerとしてPHP Stormと戯れる日々です。
頭のいいIDE使うと、知識が足りないところが補完されるので頼りっぱなしです。
AWSはまだまだ補完されない領域が多いので、自分で頭を使う必要がありますね。
ということで、Elastic Beanstalkのログ取得でハマったところをご紹介。
ElasticBeanstalkのログ保存方法
↑こちらの記事にあるとおり、Elastic Beanstalkのログは設定すれば定期的に勝手にS3へ格納されるのですが、サーバが減った時に消えちゃいます。
コレは困る。
ということで、シャットダウン時にログ書き出しのスクリプトを動かすようにしました。
Linuxでシャットダウン時に想定した処理が実行されない
こちらを参考に、ランレベル0と6で動作するスクリプトを書きました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
#!/usr/bin/env bash lock_file="/var/lock/subsys/forcelogput" start() { touch ${lock_file} #logrotate sudo /etc/cron.hourly/cron.logrotate.elasticbeanstalk.webapp.conf sudo /etc/cron.hourly/cron.logrotate.elasticbeanstalk.httpd.conf #publishLogs sudo /usr/bin/publishLogs.py --de-dupe --conf-path '/opt/elasticbeanstalk/tasks/publishlogs.d/*' --location-prefix resources/environments/logs/publish/ --num-concurrent 2 } stop() { rm -r ${lock_file} #logrotate sudo /etc/cron.hourly/cron.logrotate.elasticbeanstalk.webapp.conf sudo /etc/cron.hourly/cron.logrotate.elasticbeanstalk.httpd.conf #publishLogs sudo /usr/bin/publishLogs.py --de-dupe --conf-path '/opt/elasticbeanstalk/tasks/publishlogs.d/*' --location-prefix resources/environments/logs/publish/ --num-concurrent 2 } case "$1" in start) start ;; stop) stop ;; *) echo "Usage: $0 {start|stop}" ;; esac exit 0 |
さらに、.ebextensionsで、このスクリプトを配置するスクリプトを用意しました。
この辺がElastic Beanstalk使う時の難しいところですね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
files: "/opt/elasticbeanstalk/hooks/appdeploy/pre/50_logrotate-before-shutdown.sh" : mode: "000777" owner: root group: root content: | #!/usr/bin/env bash . /opt/elasticbeanstalk/support/envvars EB_CONFIG_APP_ONDECK=/var/app/ondeck function log { local message="$1" echo "$(date '+%Y-%m-%d %H:%M:%S') $0 $message" >> /var/app/support/logs/ebextensions.log } # # main # log "INFO: START" # replace default logrotate config file log "INFO: replace logrotate config file" cp -f /var/app/ondeck/config/replace/logrotate.elasticbeanstalk.webapp.conf /etc/logrotate.elasticbeanstalk.hourly/ cp -f /var/app/ondeck/config/replace/logrotate.elasticbeanstalk.httpd.conf /etc/logrotate.elasticbeanstalk.hourly/ touch /var/lock/subsys/forcelogput cd /etc/init.d # set logrotate to /etc/init.d/ log "INFO: set logrotate file to /etc/init.d/" cp -f /var/app/ondeck/config/replace/forcelogput.sh /etc/init.d/ # set logrotate-symlink to /etc/rc0.d/ & /etc/rc6.d/ log "INFO: set logrotate-symlink file to /etc/rc[06].d/" cd /etc/rc0.d/ && ln -s /etc/init.d/forcelogput.sh ./K00forcelogput cd /etc/rc6.d/ && ln -s /etc/init.d/forcelogput.sh ./K00forcelogput # change logrotate daily to hourly mv /etc/cron.daily/logrotate /etc/cron.hourly/ log "INFO: FINISH" true #----- end of script ----------------------- |
これで、サーバ起動時・終了時に強制的にlogrotate→S3へログを転送することができます。
(logrotateのconfも書き換えていますが、こちらは割愛)
fluentdあたりを使えば悩む必要ないかもですが、この辺りまでElastic Beanstalkのデフォルトで面倒見てほしいなぁ。。。
<追記>
|
/var/app/support/logs/* { size 1 rotate 10 missingok compress notifempty copytruncate dateext dateformat %Y%m%d-%s olddir /var/app/support/logs/rotated } |
喉もとすぎれば熱さを忘れるわけで、割愛と書いた中にもハマリポイントが。
logroateのデフォルトのconfでは、size 10MB指定になっています。
この場合、10MBを超えていないとlogrotateしません。rotateしないとS3へも配信されないので、sizeを1にしています。