Carpe Diem

備忘録。https://github.com/jun06t

データ毎に実行スケジュールが異なる場合の実装方法を考えてみる

概要

Stripeの定期購読を使っていると、各ユーザの定期購読の更新タイミングでWebhook eventがちゃんと飛んできます。
ほぼリアルタイムで届くのでこのwebhookを使う側としては非常に助かる機能ですが、提供する立場から考えるとどうやるんだろう?と悩んだので幾つか自分でケースを考えてみました。

課題

今回やりたいことを実現する上で問題になるのは主に以下です。

  • タイムスケジューラをどうするか
  • データ量が増えたときにスケール可能か

cronのようなスケジューラだと、今回のような個々のデータに対するスケジューリングはできません。
またバッチ処理で扱おうとすると、データ量が増えた時に処理対象がどんどん増えるため、対象の抽出や処理自体に時間がかかって実行頻度を上げることが難しくなります。

手段

浮かんだのは以下の4つでした。

  1. 全ユーザの更新期限を毎回チェックしてイベントを飛ばす
  2. 更新日を迎えるユーザをあらかじめ別の場所に保持しておいて、それを定期的に処理
  3. Redisのzsetを使う
  4. Redis Keyspace Notificationsを使う
続きを読む

IAMグループのポリシーの管理

概要

IAMグループのポリシーをちゃんと役割に分けて管理しようという話です。

方針

admin, developer, operatorの3つの役割で分け、各グループに適切な権限を与えるようにします。
ただし

  • パスワード変更
  • MFAの設定

は各IAMユーザができるようにします。

付与する権限

グループ 権限
admin AdministratorAccess
developer PowerUserAccess
IAMUserChangePassword
AllowUsersToUseMFA
operator ReadOnlyAccess
IAMUserChangePassword
AllowUsersToUseMFA
続きを読む

ネットワークの疎通を確認する方法

概要

インスタンスのヘルスチェックに失敗したり、リクエストが届かなかったりするケースの調査のためにネットワークの疎通を確認する機会は多々あります。
今回はその中でよく使うコマンドをまとめてみました。

環境

  • Ubutnu 16.04

コマンド

ping

pingはICMPのエコー要求/応答機能を使った診断コマンドです。

疎通確認

$ ping google.com
PING google.com (216.58.200.206): 56 data bytes
64 bytes from 216.58.200.206: icmp_seq=0 ttl=54 time=2.329 ms
64 bytes from 216.58.200.206: icmp_seq=1 ttl=54 time=2.744 ms

ちなみにICMPはL3のプロトコルなのでポートは関係ありません

続きを読む

AWSのCost Explorerをスクレイピングして毎日の利用料金をslackへ通知

概要

使っていないインスタンスが起動しっぱなしだったせいで、AWSの利用料がいつの間にか大きくなっていたことがきっかけです。
一方毎日CostExplorerを見に行くのも手間が多いので、slackに通知するようにしたいと思い作ってみました。
また環境構築が面倒なので、docker化してどこでも実行できるようにしました。

成果物

今回作ったものはこちら。

github.com

環境

  • Ubuntu 16.04
  • chrominum 62.0.3202.94
  • chromedriver 2.33.506092
  • python3
続きを読む

TerraformでECSを動的ポートマッピングに

概要

以前ECSの記事を幾つか書きましたが、

TerraformでECS環境の構築 - Carpe Diem

TerraformでECS環境の構築【オートスケール編】 - Carpe Diem

当時のECSはインスタンス1コンテナにしないとポートが競合して同じ種類のコンテナを載せることはできませんでした。
しかし今ではALBが導入され、動的ポートマッピングといってコンテナ側のポートは80で、ホスト側にマッピングする際は動的に変えてよろしくやってくれる。ALBはその動的なポートに紐づくという機能が付いています。
これによって1インスタンスに同じ種類のコンテナがいくつもたてられるようになりました。

環境

  • terraform 0.11.0
  • terraform-provider-aws 1.3.1

成果物

今回のコードはこちら

github.com

続きを読む

goroutineでのpanicのハンドリング

概要

goroutineを使った時のpanicのハンドリングについて調べてみたのでまとめ。
golangはgoroutineで簡単に並列処理を書けますが、エラーハンドリングをきちんとしていないと後で困ることになるという話です。

環境

通常

recoverがどうなるか確認します。

同じ関数内でのpanic

func main() {
    fmt.Println("Calling f.")
    f()
    fmt.Println("Returned normally from f.")
}

func f() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered in f", r)
        }
    }()

    panic("panic")
}

The Go Playground

続きを読む

grpc-gatewayでgRPCサーバをRESTで叩けるようにする

概要

gRPCはProtocol Buffersを喋るもの同士ではメリットが大きいですが、RESTしか叩け無いものや、curlでRESTを叩くようにサクッと検証したかったりするときに不便です。
そんな問題を解消してくれるのがgrpc-gatewayで、protobuf定義からREST APIを提供するリバースプロキシを生成してくれます。

github.com

環境

続きを読む