GAE/Pythonでサービスアカウントキーファイルを使わないようにした

こんにちは。ピリカ開発チームの伊藤です。

GCPの各種サーバーレスサービスにアクセスするには、認証情報が必要となります。App EngineやCloud Functions上で動作している場合は、GCPの各種ライブラリを使っていれば特に何もしなくても認証が通った状態となり、FirestoreやCloud Storageなどを扱うことができるようになっています。

しかし、ローカルでの動作確認を行う場合など、GCP外で動く場合には認証情報を渡す必要があります。 これまで、ローカルでの認証のためには「サービスアカウントキー」というJSONファイルを取得することが多かったのですが、サービスアカウントキーファイルが漏洩した場合に検知が難しいなどの問題があり、最近は非推奨となっています。

では具体的にどのようにすれば良いのかというと、あまりまとまった情報がありませんでした。

今回は、GAE/Pythonをメインに運用しているピリカでとったサービスアカウントキー排除の手法をご紹介します。

続きを読む

Androidアプリ Realmでモデルパラメータを追加するとき、過去バージョン全てに渡ってパラメータ有無を考慮する必要があった話

こんにちは、ピリカ開発チームの九鬼です。

SNSピリカのAndroidアプリについて、段階公開していたv5.4.13, v5.4.14リリースで起動クラッシュが発生する問題がありました。v5.4.13でRealmのバージョンアップおよびRealm操作周りの役割分離を行っており、そのなかでのマイグレーション処理の不備が原因でした。本稿ではその経緯を共有いたします。

続きを読む

GoogleAppEngineでCloud SchedulerからのHTTPリクエストのみを受け付ける

こんにちは、ピリカの開発の冨田です。

ピリカのごみ拾いSNS「ピリカ」は、Google Cloud Platformを利用しています。

その中で、定期実行させたい処理を、Cloud Scheduler→AppEngineで行っています。

Cloud SchedulerからApp Engineに対してHTTPリクエストを送るのですが、その際にApp Engine側ではCloud Schedulerからのリクエストのみを受け取るようにしました。

f:id:kahi0223:20211203122844p:plain
Cloud SchedulerからApp EngineにHTTPリクエストを送る

続きを読む

Pythonのインターン(Intering)・文字列インターン(String Intering)

こんにちは、ピリカ開発チームの冨田です。

Pythonにはインターン(Intern, Intering)という仕組みがあります。

特に文字列のインターンはとても複雑です。

ここでは、インターンとは何か、Pythonインターンが利用されるのはどの様な場合か、文字列がインターンされる条件は何かなど、Pythonインターンについて書いています。

続きを読む

GeoPandasをGoogle App Engine(GAE)上で動かすためには、libspatialindexを事前ビルドする必要がある

※ 2021年4月時点での検証内容であり、ライブラリ側の更新により解消済みの可能性があります。

GAE上でGeoPandasを動かすには、libspatialindexをDebian系x64 OS上でビルドして依存関係に含めておく必要があります。本記事ではその方法を共有します。

続きを読む

Cloud NDBのredisキャッシュでredis-namespaceを使うとキャッシュキーのコリジョンを起こすことがある件

こんにちは、ピリカ開発チームの九鬼です。

SNSピリカのサービスでは、データ永続化用にCloud NDBを使用しています。また、データ取得のスループットを高めるためCloud Memorystore for Redisを利用しています。

f:id:pirika-inc:20211106093447p:plain
SNSピリカ データベース周り概念図

そこで、用途毎でnamespace切り分けるためにredis-namespaceライブラリを使っていました。しかしながら、Cloud NDBで特定のエンティティ間でキャッシュキーが重複してしまい、別エンティティのキャッシュが保存・読み込みされてしまうことがありました。例えばID:1のエンティティを参照したときにID:2のエンティティを参照していました。

続きを読む

pythonの真偽値と条件分岐

こんにちは、ピリカの冨田です。

pythonで、Noneかどうか、空文字列かどうか、空配列かどうか、空辞書かどうかの判定とその時の処理の書き分けで迷いがちの冨田です。

それらを正しく書き分けるためには、何がNoneで何がTrue/Falseで、それらがどうやってやif文や比較演算子で処理されるのかをちゃんと理解する必要があると思っています。

そこで、ここでは、python3の真偽判定とその時の条件分岐について書こうと思います。

続きを読む