Carpe Diem

備忘録

ConsulのACLでハマった話2

概要 以前 christina04.hatenablog.com という記事を書きましたが、また別のケースでハマった話を書きます。 今回はACLを有効にしたConsulクラスタのサーバをアップグレードしようとしたら Error joining address 'xxx.xxx.xxx.xxx': Unexpected response co…

ECSとFargateでコンテナの起動順が制御できるようになりました

概要 先日AWSの発表で aws.amazon.com と、コンテナの依存関係が制御できると発表がありました。 何が嬉しいかというと、サイドカー系コンテナに依存している場合アプリケーション側でそのコンテナの起動を待つ処理が必要だったのが、不要になるという点です…

Clean Architecture で実装するときに知っておきたかったこと

概要 developers.cyberagent.co.jp こちらで 課金システムをマイクロサービス化した サービス自体の設計をDDDにした という対応をしました。 当時は試行錯誤の連続でしたが対応から1年程経ち、ある程度設計もfixされてきたので知見をまとめます。

MongoDBでJumboフラグのついたチャンクの分割

概要 シャード構成のMongoDBがチャンクの分割に失敗し、一定サイズを超えるとjumboというフラグが付きます。 普通の環境ではそうそう起きませんが、大量のドキュメントを扱っているとたまに発生します。 今回はそれの解消方法を紹介します。 環境 MongoDB 3.…

npm install する時のnpmのバージョンを固定する方法

概要 npmのバージョンを上げた(v6.x.x)ところ、以下のissueと同じケースに当たってCircleCIのキャッシュが効かない問題が起きました。 github.com 具体的には 開発ではMacを使用している 開発用MacとCircleCIのNode.js、npmバージョンは同一である CircleCI…

Angular のバンドルファイルのサイズを可視化

概要 Angular CLIはTree Shakingだったりbuild-optimizerなど、それだけである程度最適化する事が可能ですが、一方で外部ライブラリなどはどれくらいファイルがあるか見落としがちです。 今回はそういったものを可視化する方法を紹介します。 環境 Angular 7…

context.WithCancel, WithTimeout で知っておいた方が良いこと

Go

概要 christina04.hatenablog.com でも話したcontext.Contextはタイムアウト、キャンセルなどのハンドリングができて便利ですが、使う際に知っておいた方が良いことをいくつかまとめました。 環境 golang 1.12.0 Tips Q. 親・子の両方でWithTimeoutが設定さ…

gRPC の Unary Interceptor の基本的な使い方

概要 gRPCのInterceptorのClient側、Server側の基本的な使い方を紹介します。 環境 golang 1.12.0 grpc 1.18.0 Interceptorの種類 以下の4つがあります。今回はUnaryの方の使い方を説明します。 サーバサイド UnaryServerInterceptor StreamServerIntercept…

Multi Match Queryのtypeの違い

概要 以前Bool Query と Dis Max Query の違いについて書きました。 今回はその中で出てきたMulti Match Queryのtypeの違いについて書きます。 どれも複数のフィールドに対して実行するクエリですが、それぞれ用途が異なります。 環境 Elasticsearch 6.6.0 …

ALBのアクセスログをAthenaで分析

概要 AthenaでALBのアクセスログの分析が非常に簡単にできるので、設定方法とよく使うクエリを紹介します。 手順 ALBアクセスログをS3に保存 新規バケットを同時に作成する場合 バケットポリシーが自動で設定されるので楽なやり方です。 ELBの属性の編集でチ…

gRPCで大きなファイルのやり取りをする

概要 gRPCで4MB以上のデータ転送をしようとすると rpc error: code = ResourceExhausted desc = grpc: received message larger than max (xxxxxxx vs. 4194304) のようなエラーが出ます。この上限はデフォルト値なので変更することもできるのですが、ドキュ…

Circusを使ってgraceful restart

概要 Nginx + GolangのApp という構成をとっている時に、単純にデプロイでGolangだけ更新するとNginxからは [error] 1413#1413: *1 connect() failed (111: Connection refused) [error] 1412#1412: *3 connect() failed (111: Connection refused) [error] …

.proto ファイルの整形に clang-format を使う

概要 gRPCで通信しようとすると.protoファイルが沢山出てきます。 ただ人によってインデントが異なったりするのは良くないので、何かしらformatterが無いかなと探したら github.com こちらのissueで「Googleではclang-formatを使ってるよ」という回答があっ…

VPN接続するとどうして別ネットワークにアクセスできるのか

概要 VPNサーバをAWSに置くことで内部ネットワークに外部からアクセスする手法がありますが、どうしてそれができるのかを知りたくなって調べてみました。 環境 VPNサーバ Ubuntu v18.04 pritunl v1.29.1958.76 クライアント macOS Mojave 10.14.2 ネットワー…

CircleCI 2.1 でconfigの記述をシンプルにする

概要 christina04.hatenablog.com でCircleCIの使い方を説明しましたが、2.1からconfigの記述がよりシンプルになりましたので説明します。 環境 CircleCI 2.1 設定 CircleCI側 まずはAdvanced Settingsで2.1の機能が使えるようにします。 古いプロジェクトだ…

goroutineでのpanicのハンドリング その2

Go

概要 christina04.hatenablog.com で書いていなかったことの追加です。 環境 golang 1.11.4 recoverしたあとのエラーハンドリングをどうするか panicをrecoverしたものはいいものの、 func f() { defer func() { if r := recover(); r != nil { fmt.Println(…

ConsulでService登録をした時のACLでハマった話

概要 Consulではserviceを登録することでService Discovery機能を活用することができます。 例えば "service": { "name": "payment", "port": 9090, "tags": ["development"] } のように設定をすると、 $ dig @localhost -p 8600 payment.service.consul でp…

Assume Roleの用途・メリット

概要 sts:Assume Roleは第三者に自分のAWSアカウントのAPI権限を委譲する仕組みです。 ここで言う第三者というのは EC2/IAM/KinesisといったAWSサービス 他AWSアカウント Googleアカウント のように様々なモノに委譲が可能です。 sts:Assume Role どういう用…

ConsulのACLを後から有効化する

概要 christina04.hatenablog.com ではConsulのACLの基本的な設定方法を説明しました。その時は "default_policy": "deny"のようにデフォルトで全リソースのアクセス禁止にしてwhitelist形式で扱っていきます。 と言いましたが、そもそもACL未設定なConsulを…

CloudWatch LogsのログをS3へ【Kinesis Firehose編】

概要 前回 christina04.hatenablog.com にてCloudWatch Logsの過去ログをS3へエクスポートする方法を説明しました。 今回はリアルタイムにS3に転送する方法を紹介します。 手順 管理ポリシーではないIAMポリシーが何度も出てくるので、自動生成してくれるWeb…

VaultのPolicyでハマったこと

概要 christina04.hatenablog.com で説明したようにVaultでは柔軟な権限設定ができますが、触っていて「え、こういう挙動・設定なの?」とハマった事がいくつかあったのでまとめます。 環境 vault v0.11.5 ハマったところ pathは前方一致 例えば path "secre…

CloudWatch LogsのログをS3へ【エクスポート編】

概要 CloudWatch LogsはAWSでは一番簡単に用意できる検索可能なログ基盤だと思います。 一方で 詳細な検索がしにくい(クエリやUI的に) ログが大量に増えると料金も嵩んでくる Terraformや操作ミス(保持期間の誤設定など)で間違って消してしまうリスク と…

Dockerの--initフラグについて

概要 dockerのコンテナは指定したコマンドがPID 1で起動されており、使い方によってはシグナルハンドリングできないことがありますよ、という話です。 それによってプロセスをGracefulに終了できなかったりリソースリークが起きたりするので注意する必要があ…

ConsulのACLでアクセス制御

概要 ConsulにはACL(Access Control List)といって、AWSのIAMに似たアクセスコントロールの仕組みがあります。 今回はそれの設定方法を説明します。 環境 Consul v1.4.0 Consul ACL ACL System 大きく分けて ACL Policies ACL Tokens というコンポーネントが…

TerraformでECSのService Discoveryを使う

概要 少し前にECSのサービスディスカバリが東京リージョンにも登場しました。 Amazon ECS Service Discovery がフランクフルト、ロンドン、東京、シドニー、シンガポールの各リージョンで利用可能に 今回Terraformでの使い方を説明します。 環境 Terraform v…

OpenSSH 7.8p1でCA認証によるsshができない

概要 christina04.hatenablog.com でCA認証をしていたのですが、ある日急にsshできなくなったので原因を調査したところOpenSSH側のバグでした。 bugs.launchpad.net 環境 OpenSSH 7.8p1 macOS Mojave 10.14.1

VPNで特定のサーバに繋がらない

概要 先日VPNサーバを再起動したところ、基本的に内部ネットワークに接続できるものの特定のサーバに対し 疎通(ncコマンド)自体はできる 3 way handshakeもできる Webページは見れない 会社からのアクセスだとWebページも見れる という状況に陥ったのでその…

Golangの良いところ

Go

概要 Golangの良いところってなんだろう?と思ってまとめます。 多分新しいことを知ったら追記していきます。 よく言われるところ コンパイルが速い JavaやC++に比べてかなり高速です。 メモリ安全 golangはC言語に近いですが、C言語で問題になっていたメモ…

goroutineはなぜ軽量なのか

Go

概要 以前の記事で christina04.hatenablog.com golangはスレッドよりはるかに軽量なgoroutineでC10K問題を解決する、という話をしましたが、goroutineが軽量なのはなぜか?という理由を深掘りしたことがなかったのでしてみました。 環境 golang 1.11.1 Darw…

Golangのpprofの使い方【メモリ編】

概要 前回 christina04.hatenablog.com にてpprofのコマンドラインツールの使い方を説明しました。 今回はメモリについて このバッチ処理、メモリすごく喰うけどどこが原因? メモリリークしてない? といったところの調査方法を説明します。 環境 golang 1.…