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

HANDS LAB

HANDS LAB ENGINEERS BLOG

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

Standard Queue から FIFO Queue へ移行した話

Pocket

この記事は ハンズラボ Advent Calendar 2017 13日目の記事です。
こんにちは、最近、社会人1年目が過ぎた村上です。

今回システム的な問題を解決すべく、ECサイトハンズネットの裏側で動いているSQS(Simple Queue Service)のスタンダードキューの一部をFIFOキューへ移行した話を書きたいと思います。
Tokyoリージョンは2017年上旬予定と聞いたのですが、AWSコンソールを見てみると2017/12/15現在、未だリリースされていないようです。オレゴン、オハイオ、バージニア北部、EU(Ireland) のリージョンは利用できます。
細かい説明はAWS公式に任せて、スタンダードキューとFIFOキューの主な違い、移行の経緯やFIFO特有の設定についてお話しできればと思います。

 

スタンダードキューとFIFOキューの主な違い

 
まずは簡単にスタンダードキューとFIFOキューの違いについて触れます。

上記表にあるように順番についてはスタンダードはベストエフォートとあり、まれに順番を守れない事があります。「大量の画像データをある形式に従って変換する」といった処理の順番を気にしない用途には向いていると思います。しかし、今回の改修対象についてですが、順番を誤ってはいけない場所で使われています。詳しくは次節で。

また、メッセージの配信回数なのですが、スタンダードキューはまれに同じメッセージが複数回配信されることがあるので注意が必要です。

 

なぜFIFOに移行したのか

 

ユーザからの不具合報告

一般的なECサイト同様、ハンズネットで注文した後に、注文済みの商品の数量変更やキャンセルができます。それらの操作が注文履歴画面に反映されないという不具合がユーザから報告される事が定期的にあったため調査しました。その結果、SQSのスタンダードキューを使ったデータ連携が怪しく、部分的にFIFOキューへ移行することにしました。

スダンダードキューは順番を守れないことがある

このシステムの注文データの反映方法は2通りあります(なぜ、二通りあるのかは一口では語れないです 汗)。

(1) 注文後、リアルタイムでDynamoDBを更新
(2) テキスト形式のデータが、SQSのスタンダードキューを通ってDynamoDBへ反映(非同期)

[改修後イメージ、スタンダード、FIFOが共存]

 

(2)についてですが、スタンダードキュー内で注文データの順序が守られていないのではないかという懸念がありました。このDynamoDBの注文レコードは上書きされる仕様となっていたため、順序を誤ると古いデータが最新の状態として画面に表示されることになっていました。
以前は注文データは画像上部のスタンダードキューを通っていましたが、今回画像下部のFIFOキューを追加し、問題のあった注文データのみFIFOキューを通るように変更しました。FIFOであれば、キューへ送った順に取り出されるので注文データが順番を誤まる心配がなくなるというわけです。

次節以降ではFIFO特有の設定とについて少し書きます。

【補足】 ハンズネットがユニケージ開発手法で開発され、そこから移行しようとしている(Bash→PHP, ファイル→DB)という特殊な事情もあり、少し複雑なシステムとなっています。いずれは上記の(2)のテキスト形式レコードをDynamoへ反映する処理は無くしたいと考えています。

 

FIFO特有の設定

 
FIFO Queueの作成自体は設定を気にしなければ数秒で終わりますが、導入する際は最低でもメッセージ重複排除IDと、メッセージグループIDについては少し考慮した方が良さそうです。

メッセージ重複排除ID

適宜、公式より説明を拝借します。

メッセージ重複排除ID: 送信されたメッセージの重複排除に使用するトークン。特定のメッセージ重複排除 ID を持つメッセージが正常に送信された場合、同じメッセージ重複排除 ID を持つ送信メッセージは正常に受け付けられますが、5 分間の重複排除間隔の間は配信されません。

 
とAWS公式に書いてありますが、この説明は私にはわかりづらく、もう少し読むと

スタンダード キューとは異なり、FIFO キューでは重複メッセージがありません。FIFO キューを使用すると、重複をキューに送信することを防止できます。5 分間の重複排除間隔内に SendMessage アクションを再試行しても、Amazon SQS ではキューに重複を挿入しません

 
とのことです。要するに、「同一の重複排除IDが設定されたメッセージをキューへ送っても5分間の間は受付けられない」ということのようです。

ちなみに、重複排除IDの設定についてですが、二通り方法があります。
(1) FIFO作成時に設定
(2) sendMessage時にDeduplicateIdを指定

(1)の方が楽だったので、以下のようにFIFO作成時に設定しました。

メッセージグループID

AWS公式より

メッセージグループID: 特定のメッセージグループに属するメッセージを指定するタグ。同じメッセージグループに属するメッセージは、メッセージグループに相対的な厳密な順序で、常に 1 つずつ処理されます (ただし、別のメッセージグループに属するメッセージは、入れ替わって処理される場合があります)。

 
との事です。こちらも少し分かりづらいですが、「グループ内の順序は厳密に守られるが、他のグループのメッセージとは順番が前後する場合がある」と理解しました。
今回はキューに入れた順に取り出されれば良かったので、特にグループは気にせず、以下のようにMessageGroupIdには定値を入れました。

移行後談

 
移行後、半年ほど経ち、その間ハンズメッセというセールも経験しましたが、問題報告はありません。あとは、TokyoリージョンにFIFOがリリースされれば、そちらに移ろうかという所です。

明日は14日目のsho-hitomiさんです。

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

「DeepLens」セットアップしてみました!

Pocket

こんにちは、百木田です。

現在開催中のre:Inventに参加のためラスベガスに来ております!
今朝のキーノートにて「DeepLens」という新サービスが発表されました!!
DeepLensはAWSオリジナルのカメラ付きデバイスを使うことで、エッジでの映像の撮影からリアルタイムな解析までの実装をより簡単にしてくれるサービスです。

サンプルプロジェクトが用意されているのでこれらを使って試すことができます。

  • OBJECT DETECTION
  • HOT DOG NOT HOT DOG
  • CAT AND DOG
  • ARTISTIC STYLE TRANSFER
  • ACTIVITY RECOGNITION
  • FACE DETECTION

DeepLensのwork shopに参加した人にはデバイスを配布されるということで行ってきました!
このデバイス、Amazon.comで$249.00で予約受付がされています。

DeepLens販売ページ

先ほど開封の儀を済ませ、セットアップまでをやってみましたので手順を共有します。

1. DeepLensのコンソールにアクセス

https://aws.amazon.com/jp/deeplens/

スクリーンショット 2017-11-29 22.54.05.png (2.3 MB)
「Get started with your DeepLens」を選択します。

2. デバイスを登録

左上のハンバーガーアイコンをクリック

  • 「Resources」の「Devices」を選択
  • 「Register device」を選択

デバイス名

スクリーンショット 2017-11-29 22.55.02.png (158.3 kB)

必要なIAMロールたちを作成

それぞれのサービスを実行するためにIAMロールが必要なので、「Create a role in IAM」からすべてのロールを作成します。右上の「Refresh IAM roles」を押すと、作成したIAMロールが選択できるようになります。

スクリーンショット 2017-11-29 22.58.19.png (373.2 kB)

証明書をダウンロード

後ほどDeepLensにアップロードします。

スクリーンショット 2017-11-29 22.58.30-2.png (177.0 kB)

3. DeepLens本体を準備・接続

SDカードを挿入

32GBのSDカードが同梱されているのでそれを後ろに挿します

電源に接続

電源アダプタも同梱されています。

電源ボタンを押して電源を入れる

DeepLensのネットワークに接続

電源を入れてから少しすると「AMDC-xxxx」のようなネットワークが出てくるのでそれに接続します。

ブラウザから http://192.168.0.1 にアクセス

DeepLensの設定ページが表示されます。

4. DeepLensをネットワークに接続

ここからはDeepLensがホストする設定ページ( http://192.168.0.1 )での作業になります。
DeepLensをつなぐネットワークをプルダウンメニューから選択し、Wi-Fiパスワードを入力して「Save」します。
スクリーンショット 2017-11-29 23.15.03.png (134.8 kB)

5. アップデートプログラムをインストール・再起動

右下の「Install and reboot」を選択します。
今回の場合は5分くらいかかりました。
スクリーンショット 2017-11-29 23.15.24-2.png (252.9 kB)

アップデート中はランプが点灯します。アップデート、再起動が終了すると点滅に変わるので再度DeepLensのネットワークに接続して http://192.168.0.1 にブラウザからアクセスします。

6. 証明書をアップロード

手順1の際にダウンロードした証明書をアップロードします。
スクリーンショット 2017-11-30 0.35.38.png (133.2 kB)

7. デバイスの設定

デバイスの設定をします。今回は以下のような設定にしてみました。
スクリーンショット 2017-11-30 0.36.29.png (228.5 kB)

8. 設定の確認

スクリーンショット 2017-11-30 0.38.46.png (140.0 kB)

完了!

正しく設定が完了するとこのような画面が表示されます。
スクリーンショット 2017-11-30 0.38.51.png (77.9 kB)

まとめ

現場からは以上です。
サンプルプロジェクトも試してみたいです。

Pocket

3つのセルフマインドコントロールを駆使してAWS認定資格5冠を達成した話

Pocket

こんにちは、POSチームの人見です。

この度、AWSの資格を5つ取得したことをご報告いたします。

  1. AWS Certified Solutions Architect – Associate (SAA) 取得日:2017-04-17
  2. AWS Certified Developer – Associate (DVA) 取得日:2017-04-24
  3. AWS Certified SysOps Administrator – Associate (SOA) 取得日:2017-04-27
  4. AWS Certified Solutions Architect – Professional (SAP) 取得日:2017-05-29
  5. AWS Certified DevOps Engineer – Professional (DOP) 取得日:2017-11-20

 

以上!

 

 

 

 

 

ということなのですが、

 

 

ということだけではブログにならないので、

どうやって勉強したかの話をしたいと思います。

 

 

私はストイックではないですし、どちらかといえば飽きっぽい方です。

今回もSAP取得までは着々と進めていたのですが、途中で飽きてDevOps取得までは時間が空いてしまいました。

3日坊主という言葉もあるように、本来人間は飽きてしまう生き物です。

そこで使った方法が、セルフマインドコントロール

決して怪しくはないのでご安心ください。。

 

 

 

今回は、これさえ実践すれば合格間違いなしのセルフマインドコントロールを3つ紹介します。

 

 

 

・セルフマインドコントロールその1

「合格できるかできないかギリギリだと思う日程で試験を予約してしまう」

AWSの資格試験の良いところは自分で試験日を決められることです。

試験日を決めないとだらだらと時間が過ぎてしまうため、私は勉強を始めるまえに試験を予約してしまいました。

期間が長いとダレるので、短ければ短いほど良いと思います。

少ない時間で高いパフォーマンスを得るために、パーキンソンの法則を利用するのです。

 

 

 

・セルフマインドコントロールその2

「意識しやすいタイミングで、いつまでに取るかを決める」

私はソリューションアーキテクトプロフェッショナルをAWS Summit前までに取ることに決めて、

DevOpsはAWS re:Invent前までに取ろうと決めました。

理由はともかく、「いつまでに」と目標にできる明確なタイミングがあるとそれに向けて意識しやすくなります。

 

 

 

・セルフマインドコントロールその3

「危機感を与えてくれるものを利用する」

勉強が進んでいない状態で早めに模擬試験を受けて、早めに危機感を持ちました。

勉強途中で飽きてきても、模試の結果を思い返すことで危機感が保てます。

適度な危機感を持つことで、集中して勉強できたと思います。

 

 

 

今度こそ以上です!

いかがでしたか?

セルフマインドコントロールは資格に限らず、仕事でもなんでも使えるので、

2017年やり残したことを達成しましょう!

 

 

 

ちなみにですが、ハンズラボでは資格取得や、勉強会参加など、エンジニアの成長を手厚くサポートしてくれるので、貪欲に上を目指すエンジニアにはものすごく良い環境です。

私が5冠を達成できたのも会社のサポートがあったことが大きいです。本当に感謝しています。

ハンズラボに興味をお持ちの方は、どうぞお気軽にお問い合わせください〜

 

 

さてさて、来週からre:Inventですね。

re:Inventにいく方はぜひぜひ現地でお話ししましょう!

そしてカジノ!!ルーレット当たりますように。。

 

 

Pocket

12月9日、10日開催!キッチンハッカソン2017の見どころを紹介!

Pocket

こんにちは。百木田です。

すでに告知しておりますが2017年12月9日(土)、10日(日)と2日間に渡り、Oisix.daichiさんとハンズラボが共催でキッチンハッカソン2017を実施します!

Connpassイベントページ

テーマはその名の通りキッチン!

Oisix.daichiさんは食材を取り扱っており、ハンズは豊富なキッチン用品を取り扱っているということで、今回はキッチンをテーマにやってみようということになりました。
普段、キッチンに立つ方は、こんなのあったらいいのになー、を実現してみてください!料理をしない方でも、こんなアプリあったら料理するかも?とか、もしくは料理する方のお悩みを聞いて、それならこうできるのでは?とかをこのハッカソンで実現してみてください。
技術テーマは特に設けない予定なので、モバイルアプリ、Webアプリ、IoT、AI、ロボット、フィンテックなど、興味のあるものに挑戦してみてください!

会場はOisix.daichiさんの新オフィス!会社にキッチンだと!?


先日も関係者が集まり、そちらのオフィスにお邪魔してキックオフミーティングをしてきたのですが、とてもおしゃれな空間でテンションあがりました!
そしてなんと同じビルの1階にはキッチンが併設されており、料理ができるようになっているんです!
ミーティング後にキッチンを見学させていただいたのですが、その時も料理をしている最中で、会社の一室で本格的に料理をしている光景に驚きました。
写真はそのキッチンルームに併設されている作業スペースです!このスペースでハックしてもらう予定です!

Oisix.daichiさんの食材を使った手料理!

ハッカソン当日はそのキッチンでOisix.daichiさんのスタッフの方々が調理し、料理を振る舞っていただけるとのことで、そちらもハッカソンとともにお楽しみいただけます!

豪華審査員!嬉しい賞品も??

審査員にはOisix.daichi執行役員の奥谷孝司氏、数々のハッカソンを開催したり、大規模なコミュニティとなっているIoTLTのオーガナイザーでもあるdotstudio CEO 菅原のびすけ氏東急ハンズCIO(最高情報責任者)で弊社CEOの長谷川秀樹、他、など豪華メンバーを予定しているのでそちらもお楽しみに!!

優勝チームおよび優秀チームには、Oisix.daichiさんとハンズから、両社ならではの賞品を予定していますのでぜひ優勝目指してハックしてください!

詳細は申し込みページからご覧ください!

Connpassイベントページ

Pocket