production.log

株式会社リブセンスでエンジニアをやっている星直史のブログです。

Snapmart

InstagramグラフAPIのプラットフォーム利用規約違反対応をしました

SnapmartアプリではInstagramグラフAPIを使用しているのですが、8月下旬にMeta社より「プラットフォーム違反しているからAPI利用停止するね」とお達しがありました。この記事では、InstagramグラフAPIのプラットフォーム利用規約違反対応内容を紹介していき…

AWS Elasticsearch Service(AES)のシャードの未割り当て(UNASSIGNED)が原因でクラスター状態が黄色になってしまった場合の対応方法

タイトルの通り、ある日突然Amazon Elasticsearch Service(以下AES)のクラスター状態が黄色になってしまいました。 今回はクラスター状態が黄色になった場合の対処方法について、紹介します。原因は、シャードのいくつかが、ノードに割当されなくなってしま…

AWS Elasticsearch Service(AES)のデータノードが消失しStatusがRedになった場合の対応方法

私が運用しているサービスの一つであるSnapmartで障害が発生しました。 原因はAmazon Elasticsearch Service(以下AES)のデータノードが消失しStatusがRedになったためです。 Elasticsearchのデータノードが消失しているので、検索周りで多大な影響が出てしま…

VPCにあるAWS Elasticsearch ServiceのPrivate IPをALBに追加するシェルスクリプト

Snapmartの検索サーバーはAmazon Elasticsearch Service(以下ESS)で運用しているのですが、Kibanaを使ってデータ分析をしたくなりました。ESSはVPC内にあるため、アプリケーションサーバーからElasticsearch APIで検索実行は問題なく行えますが、管理者PCか…

Managed workflowのExpoアプリに導入するE2Eテストフレームワークの比較と導入

運用しているアプリの規模が大きくなってくると、ちょっとした修正が思わぬところに影響してしまったり、ツールのバージョンアップをする際に組織全体を巻き込んだ大規模な手動テストを行わなければならないことがしばしばあります。 自分が運用しているSnap…

SnapmartアプリにFirebaseAnalyticsを導入しました

SnapmartアプリはReact Native + Expoで動いています。 2019年5月にAndroid版をリリースし、2019年12月にiOS版をリリースしました。 リリース当初は不具合や非機能要件を満たせないことが多かったため、その対応に追われることが多かったのは記憶に新しいで…

Expo SDK v36.0.0で追加されたMediaLibraryのお気に入り写真の読み込みが遅い問題と回避策

React Native 0.61からCameraRollが削除されました。 そのため、Expo SDK v36.0.0以降でExpoマネージドアプリを作成している場合は、MediaLibraryを使用して写真を読み込まなければならなくなりました。 CameraRolleでは、「お気に入り」がアルバムの一つと…

Snapmartアプリで使用しているReact Navigationをv4からv5にアップグレードした際の対応

2020年2月にReact Navigationのv5がリリースされました。Snapmartアプリでは、React Navigation v4を使用しています。 React Navigation v4では、Stack NavigatorにJavaScriptを使用していましたが、ネイティブのような感覚とパフォーマンスが低下する場合が…

SnapmartアプリのExpo SDKのバージョンをv35.0.0からv37.0.0にアップグレードで対応したこと

4月1日にExpo SDK v37.0.0がリリースされました。自分が開発に携わっているSnapmartアプリではExpo SDK v35.0.0を使用していました。 Expo SDK v36.0.0がリリースされた際は、Snapmartアプリにとって、アップグレードを行う強いモチベーションがなかったので…

AWS EC2上でReact Native + Expo アプリを動かし、手元のスマホに配信する方法

React Native + Expoを使用すると、エミュレータだけではなく、実機でも手軽にアプリの動作を確認することができます。 ただし、制約もあります。 * 実機への配信は、同一のネットワークからでなければ配信することができない * 配信元はローカルのPCとなる…

ReactNativeでカメラロールから写真を複数枚選択する処理の実装

自分が作っているプロダクトであるSnapmartは、スマホのアプリから誰でも手軽に写真を売り買いできるサービスです。 スマホアプリでは、カメラロールの中から写真をアップロードをする機能があります。 この写真をアップロードする機能ですが、カメラロール…

ReactNative製AndroidアプリからさらにiOSアプリ実装が終わったのでKPTを行う

SnapmartのAndroidアプリはReact Nativeで実装されています。iOSアプリはSwiftで実装されているのですが、この度、React Nativeで置き換えることにしました。手順は、まずAndroidアプリを作り、それからiOSアプリを置き換えることにしました。((当初そもそも…

React Native + ExpoによるiOSアプリ審査申請時の広告ID(IDFA)設定

iOSアプリの審査申請時、広告ID(IDFA)を選択するように言われます。間違った選択をすると審査で落とされてしまうのですが、毎度毎度「どの設定したらいいんだっけ?」と悩まされます。今回は自分用にReact Native + ExpoによるiOSアプリ審査申請時の広告ID(I…

SnapmartのブログサーバーのSSL証明書をLet's EncryptからAWS Certificate Manager (ACM)に移管しました

先日、SnapmartのブログサーバーのSSL証明書が有効期限切れになってしまい、アクセスすることができなくなってしまいました。これまでSnapmartのブログサーバーではLet's Encrypt という証明書を無料で発行しているサービスを使っていました。しかし、このLe…

【React Native】Expo SDK v33.0.0 へのアップグレード手順

今年の1月にGoogleが「今後Androidアプリは64bit対応してないとダメだよ!8月1日以降32bitのアプリはリリースできないからね!」というアナウンスをしました。SnapmartアプリはReactNativeで実装しており、開発ツールとしてExpoを使っています。ExpoはSDKの…

ReactNative 0.59.8のCameraRoll.getPhotosでInvalid filter option: '(null)'. Expected one of 'photos','videos' or 'all'.が発生した場合の回避方法

タイトルの通り、ReactNative 0.59.8において、`CameraRoll.getPhotos({first:1234})`がエラーになってしまいます。また、これはiOSのみで発生します。エラー文を見た感じ、optionとしてassetTypeに何かしら指定すれば良さそうです。ただ、ドキュメントを見…

SnapmartにPull Pandaを導入しました

6月18日(火)にGitHubがPull Pandaを買収したと話題になったので、早速Snapmartにも導入しました。今回は簡単にPull Pandaの紹介をします。

ReactNative版Snapmartアプリ開発の舞台裏

先日、SnapmartのスマホアプリをReactNative + Expoで実装を行いました。ピクスタ開発ブログに書いた内容だと、カッコ良いところしか書けなかった気がするのと、協力してくれた方々について全く触れることができなかったので、この記事では「当時の心境や協…

ReactNative + Expo製アプリをiOS / Android(Genymotion)エミュレーターで動作させる手順

業務やプライベートでReactNative + Expo製アプリをpullしてきた場合、コードを読むだけではなく、サクッとエミュレーターで動かしたいとことが多くあると思います。 今回は、ReactNative + Expo製アプリをiOS / Android(Genymotion)エミュレーターで動作さ…

SnapmartのWebサーバーにmonitを導入してunicornを不死鳥にした

Webサービスを運営していると、夜中にWebサーバーのプロセスが突然死してしまい、朝に気づくということが多々あります。 流石に人間が24時間365日監視しているのはツラいので、ある特定のプロセスが落ちたら自動で検知と再起動という処理を行いたいです。 今…