Carpe Diem

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

CircleCI 2.0 でworkflowを使ったtagからのデプロイ

概要 CircleCI 2.0でtagからのビルド&デプロイをできるようにします。 主に使う機能としては workflow cache です。workflowはビルドパイプラインのようなもので、実行ジョブを細かく分けて順に実行させることができます。 上の例ではmasterブランチにマー…

TerraformでNLBを使う

概要 先日新しいL4のロードバランサーであるNLBがAWSからリリースされました。 ALBはL7のロードバランサーであるため、これまでgRPCはCLBの方でしか利用できませんでしたが、これからはNLBを使うことで対応が可能です。 terraform-provider-awsの1.3.1から利…

Travis CIのslack通知のtokenを暗号化

概要 publicなリポジトリもslack通知させたいけど、slackのtokenが見えるのは嫌なので暗号化して設定する方法です。 環境 travis 1.8.8 CLIのインストール Travis CIが出しているコマンドラインツールをインストールします。 $ gem install travis --no-rdoc…

BLPOPで優先順位を付けてタスクキューを実行

概要 タスクキューを操作する時に、特定の処理が他の処理よりも先に実行できるよう優先順位を付けたいケースがあります。 RedisのBLPOPは複数のリストを処理してくれるのでそれを実現できます。 前提 以下の優先度を決めたキューがあるとします。 キュー名 …

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

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

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

概要 IAMグループのポリシーをちゃんと役割に分けて管理しようという話です。 方針 admin, developer, operatorの3つの役割で分け、各グループに適切な権限を与えるようにします。 ただし パスワード変更 MFAの設定 は各IAMユーザができるようにします。 付…

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

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

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

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

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

概要 以前ECSの記事を幾つか書きましたが、 TerraformでECS環境の構築 - Carpe Diem TerraformでECS環境の構築【オートスケール編】 - Carpe Diem 当時のECSは1インスタンス1コンテナにしないとポートが競合して同じ種類のコンテナを載せることはできませ…

goroutineでのpanicのハンドリング

Go

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

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

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

gRPCにおける各RPC方式の実装方法【Bidirectional streaming RPC】

概要 前回の gRPCにおける各RPC方式の実装方法【Client streaming RPC】 - Carpe Diem に引き続き、最後はBidirectional streaming RPCの実装方法を紹介します。 チャットのようなリアルタイム通信や、大きなデータを少しずつ処理したい時、Simple RPCで毎回…

gRPCにおける各RPC方式の実装方法【Client streaming RPC】

概要 前回の gRPCにおける各RPC方式の実装方法【Server streaming RPC】 - Carpe Diem に引き続き、今回はClient streaming RPCの実装方法を紹介します。 こちらは大きなリクエストを分割して送りたい時に有用です。 環境 golang 1.9.2 grpc 1.7.2 protobuf …

gRPCにおける各RPC方式の実装方法【Server streaming RPC】

概要 前回の gRPCにおける各RPC方式の実装方法【Simple RPC】 - Carpe Diem に引き続き、今回はServer streaming RPCの実装方法を紹介します。 サーバ側から複数のレスポンスを送ることができるので、フィードなどをReactiveに取得したい時に使ったり、サー…

gRPCにおける各RPC方式の実装方法【Simple RPC】

概要 gRPCは4つのRPC方式を持っています。 RPC方式 説明 使い所 Unary(Simple) RPC シンプルな1 Request - 1 Response方式 一般的なマイクロサービスなど Server streaming RPC 1 Request - N Response方式 サーバサイドプッシュ・フィードなど Client stre…

protoeasyでprotobufのコンパイルを簡単にする

概要 gRPCなどで使われているprotobufですが、.protoの定義は簡単でもコンパイルにちょっと学習コストがかかります。 gogoprotoやgrpc-gatewayといった他のライブラリも使うと、中々にカオスなコマンドになります。 grpc-gatewayの例 protoc -I/usr/local/in…

TypeScriptのthisでハマった話

概要 AngularでエラーハンドリングをまとめようとしたらTypeScriptのthisの扱いにハマった話です。 環境 TypeScript 2.5.3 Angular 4.4.6 どんな問題が起きていたか APIコールのロジックでエラーが発生した時のハンドリングをまとめることができるよう、共通…

ECSのオートスケール戦略

概要 ECSはコンテナのスケールアウトとインスタンスのスケールアウトのタイミングが重要です。 よく起きる問題としては インスタンスのスケールアウトが遅くてコンテナのスケールアウトも遅くなってしまう しきい値が不適切でインスタンスがスケールアウトせ…

負荷ツールのスレッド数・Ramp-Up期間・ループ回数の関係

概要 負荷ツールで負荷をかける時の説明でよく見るのは 項目 計算式 総テスト回数 スレッド数×ループ回数 1秒あたりのリクエスト数 総テスト回数÷Ramp-Up ですが、例えば分間600アクセスを想定した時に 設定項目 値 スレッド数 600 Ramp-Up期間 60 ループ回…

Fluentdを0.14にバージョンアップした時の対応

概要 Fluentdを0.12から0.14へアップデートしました。 その時にtd-agent.confやらpluginで色々と変更点があったのでその時の対応をまとめます。 環境 fluentd 0.14.21 fluent-plugin-s3 1.0.0.rc6 td-agent.confの変更点 root_dirができた 以前はbuffer毎に <match pattern></match>…

GolangのSliceを関数の引数に渡した時の挙動

Go

概要 Sliceの構造を始め、関数で呼び出した場合の挙動やappendなどsliceを操作した場合どうなるかをまとめました。 環境 golang v1.9.0 Sliceの構造 Sliceは以下のような3つの要素でなりたっています。 配列へのポインタ length capacity 図示すると以下で…

Terraformで過去に作ったリソースを別ディレクトリに分けたい

概要 Terraformを使う上で、DBなどのデータ系のリソースはそうそう変更することはないので、オペミスなどを防ぐために別ディレクトリに分けておくと安心です。 しかし既に作ってしまっていた場合、*.tfとともにその部分のterraform.tfstateを移動しなくては…

AngularのInjectorとProviderとDependencyの関係

概要 過去の記事で christina04.hatenablog.com を書いた時に、AngularのInjectorとProviderとDependencyの関係を理解していないとよく分からないと思ったので追記的にまとめます。 環境 Angular 4.3.5 覚え方 結論から言うと、以下のように考えるとすっきり…

Scratch imageでtime: missing Location

概要 以前以下の記事でscratch imageの作成方法を紹介しました。 christina04.hatenablog.com しかしgolangのコードによっては以下のpanicが起きることがあります。 panic: time: missing Location in call to Time.In 今回はその対応方法です。 環境 golang…

BehaviorSubjectでAPIの結果をキャッシュ

概要 クライアントからのAPIコールは可能であれば避けた方がサーバの負荷も下がり、ユーザの体感速度も上がります。 1度取得すればほぼ変わらないデータなどは、最初にAPIコールした後はできれば避けたいです。 一方でcookieやlocalstorageで管理するほどで…

ScratchイメージでGolangアプリの超軽量イメージをビルド

概要 Alpineベースのイメージが軽量イメージとして認知されていますが、golangの場合は単一バイナリで動くのでイメージ内にgolangが入っている必要はありません。 なので最も軽量と言われているScratch imageを利用することで、dockerイメージを軽量化するこ…

AngularのHttpClientModuleの使い方

概要 Angular 4.3からこれまでのHttpModuleに代わってより軽量かつ使いやすいHttpClientModuleと言うものが出てきました。 今回はその移行作業を書きます。 環境 Angular 4.3.1 angular-cli 1.2.3 成果物 今回の成果物は以下です。 github.com

delveでGolangのデバッグ

Go

概要 Golangでデバッグをする際にdelveというツールがオススメです。 環境 golang v1.8.3 delve 1.0.0-rc.1 インストール brewでもインストールできますが、単体テストの実行の際に上手く動かないことがあったのでgo getの方をオススメします。 $ xcode-sele…

Non-Blocking I/O, I/O Multiplexing, Asynchronous I/Oの区別

概要 各言語がC10K問題をどう解決してきたかを調べてみたところ、Non-Blocking I/O, I/O Multiplexing, Asynchronous I/Oの区別がよく分からなかったので調べてみました。 正直なところ人によってちょこちょこ定義が異なるのではっきりとした答えはなさそう…

GolangでMockを書く時のTips

Go

概要 「GolangはDuck TypeだからMock用意するの大変だよね」とよく言われますが、そんなことはないですよ、という話。 環境 golang 1.8.3 1. interface自体埋め込めば実装済みと解釈してくれる 例えば以下のような複数のメソッドを持つinterfacedoEverything…