Carpe Diem

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

VaultのPKI(公開鍵基盤)でルート証明書・中間証明書・サーバ証明書を発行

概要 VaultにはPKI(公開鍵基盤)の機能もあります。 これを使って ルートCA 中間CA を用意し、 ルート証明書 中間証明書 サーバ証明書 を作成します。 環境 Vault 0.10.3

VaultのTransit secret engineでデータを暗号化・復号する

概要 VaultにはTransit Secrets Engineという、暗号化・復号をしてくれる機能があります。 このTransit Secrets EngineはKey/Valueのように暗号化データを保存することはなく、暗号化するための暗号化キーを保存&バージョン管理します。 また複数の機能を持…

GolangでVaultを操作

概要 これまで紹介したVaultの使い方はCLIを使うのがメインでしたが、実際はアプリケーション内で秘密情報を扱うケースが多々あります。 Vaultはgolangのライブラリを提供しているので、様々なログイン方法を紹介しつつ秘密情報にアクセスしてみます。 環境 …

IAMユーザを持っていたらVaultにログインできるようにする

概要 Vaultのデフォルトのログインはトークンですが、これだと漏れた時など管理しにくいのでAWSのIAMユーザ情報を元にログインできるようにします。 前提 ログインするメンバーはAWSのIAMユーザを持つ 環境 Vault 0.10.3

VaultのPolicyを使った運用

概要 VaultはPolicyを使って各APIの権限を設定します。 これによって権限を細かく設定することができますが、実際の運用ではどんな形で進めるのがいいのかがドキュメントでは分かりにくかったのでまとめした。 環境 Vault 0.10.3 Policy付与のフロー 以下の…

VaultでSSHをCA認証に

背景 AWSを運用しているとEC2のsshのキーペア管理が難しいです。 GCPであればアカウントを持てば自動で各ノードにsshできる仕組みがありますが、AWSは各インスタンスにsshのキーペアを1つだけ登録するようになっているため、複数人で運用するにはぱっと以下…

VaultのSeal/Unseal

概要 Hashicorp Vaultは起動時はsealedというステータスになっており、リストを取得したりKey-Valueの値を取得することができません。 Vaultはセキュリティのため、データにアクセスする手段は知っていても起動時は復号の方法を知らないのです。 そこでUnsea…

KubernetesでEnvoyを使ったSidecarパターンを実装

概要 前回書いた構成をKubernetesで実装してみます。 christina04.hatenablog.com 環境 minikube v0.26.1 kubernetes v1.10.0 成果物 今回のソースです。 github.com

マイクロサービスでのSidecarパターンとは何か

概要 マイクロサービス化したシステムを運用する上で出てくる課題を解決するパターンとしてService Meshというものがあります。 このService Meshというものは以下の2つのコンポーネントで構成されます。 Data plain アプリケーションの代わりにネットワー…

EnvoyのFrontProxyを用意してgRPCの負荷分散をする

概要 gRPCはHTTP/2プロトコルをベースとしたRPCです。 なのでコネクションが永続化され、その中で複数のストリームがリクエスト・レスポンスを取り扱うため負荷分散に注意する必要があります。 今回はEnvoyというgRPCに向いたproxyを使うことでそれを実現し…

curlのresolvオプションで名前解決

背景 ドメイン移管の関係でCloudFrontのDNSレコードをDNSimpleからRoute53へ移そうとしていたのですが、完全な移管手続前にRoute53側のレコードでエッジサーバにちゃんとアクセスできるか確認する必要がありました。 digのNS指定を使えばエッジサーバのIPは…

GoでGraceful Shutdown

Go

概要 以前はGraceful shutdownをするために以下のようなライブラリを使用していました。 github.com しかしながらGo 1.8 からGraceful Shutdown機能が標準で提供されるようになりました。 今回はその導入方法を紹介します。 環境 golang 1.10.3

Consulを支える技術

概要 ConsulではSWIMやRaftといった技術を使っています。 今回はそれらを説明します。 環境 Consul 1.1.0 SWIM Gossip Protocol SWIMはGossip Protocolの一種で、主に クラスタのメンバ管理機能 メンバの障害検出機能 イベント伝播 で使われています。

Dockerの埋め込みDNSサーバを使ったService Discovery

概要 Docker 1.10からユーザ定義のネットワークでは内蔵DNSサーバが用意され、名前解決ができるということを以下の記事で述べました。 christina04.hatenablog.com 実は単に名前解決ができるだけでなく、Service Discoveryとしても機能するのでその紹介をし…

ECS + awsvpc + Consul でService Discovery

概要 ECS + awsvpc + Consul でService Discoveryができるようにします。 最終的にConsulにDNS問い合わせすることでECSのコンテナのIPを知ることができるようにします。 環境 Consul 1.1.0 Task Definition 結論を先にいうと以下のようになります。 [ { "nam…

Consulで各サービスのコンテナ群のIPを取得する

概要 以前Consulの基本的な使い方を紹介しました。 christina04.hatenablog.com このConsulに登録する各ノードに対しサービス設定をすることで、各マイクロサービスに所属しているコンテナ群のIPを取得できるようします。 それによってgRPCでの負荷分散とし…

TerraformでECSのawsvpcモードを使って各コンテナにPrivate IPを振る

概要 これまでは1インスタンス上に複数のコンテナを使うときは動的ポートマッピングのような方法で対応する必要がありました。 christina04.hatenablog.com しかしawsvpcモードが使えるようになったことでコンテナ毎にPrivateIPを振れるようになり、ポート…

ホストからdockerのvolumeにファイルをコピー

概要 ホストからコンテナ(が持ってるvolume)へのコピーはdocker cpでできます。 しかしホストから直接volumeにコピーするのはどうすれば良いのだろう?と思って調べたところ地味にサポートされていなかったのでメモとして残します。 環境 Docker v18.03.1-ce…

Kubernetesのheadless serviceを使って各PodのIPを知る

概要 gRPCを用いた負荷分散ではEnvoyを使ったL7のバランシングが最近の主流になっています。 ただEnvoyが各Podに振り分けるためにPodのIPを知る必要があります。 ECSはService Discoveryを持っていないので自前でたてるか、control planeを用意してそれをSer…

GolangのRoundTripperとTransport

Go

背景 僕が保守している go-iapというgolangで書いたAppStore, GooglePlay AmazonAppStore用の課金ライブラリ があるのですが、そこに以下のissueがあがっていました。 github.com ざっくり説明すると「GAEでは普通のhttp.Client使えないからカスタムClientサ…

Exponential Backoff (指数関数的に増えるリトライ間隔)

概要 fluentdのretryはExponential Backoffと呼ばれるもので、リトライの間隔が 1秒、2秒、4秒、8秒、16秒 と指数関数的に増えていきます。これによって無駄なリクエストを省きつつ、再試行する前に問題を修正して解決できるようになります。 特に外部APIが…

混ぜるな危険 〜同期関数と非同期関数〜

概要 Node.jsといえば非同期やcallbackで有名ですが、1つの関数の中で非同期な処理と同期的な処理が混ざってしまうと期待しない挙動になることがあるので注意しましょう、という話です。 環境 Node.js 8.9.0 基本的な方針 非同期な関数は全て非同期処理でま…

C4インスタンスからC5インスタンスに移行するためのパフォーマンス検証

概要 前回のAMI作成方法に引き続き、移行前のチェックとして簡単なパフォーマンスチェックをします。 環境 Ubuntu 16.04.4 Kernel 4.4.0-1054-aws golang 1.10.1 負荷試験環境 インスタンスタイプ サーバ インスタンスタイプ 攻撃ツール c5.2xlarge C4テスト…

C5/M5インスタンス用のAMIをpackerで作成する

概要 先日東京リージョンにもC5/M5インスタンスが対応されました。 コスト的にC4/M4より10~15%ほど安くなるため、可能であれば逐次移行した方が良いです。 ただC5/M5からは Elastic Network Adapter (ENA) 対応 NVMe対応のOSが必要 デバイス名の変更 といっ…

Golangのpprofの使い方【基礎編】

Go

概要 pprofの使い方の備忘録として何回かに分けて書いてきます。 今回は前提知識として知っておくべきことを書きます。 環境 go 1.10.1 pprofは2つの計測方法がある 以下の2つのやり方があります。 runtime/pprof が提供しているAPIを使ってファイルに出力…

Event LoopとMicrotasksについて

概要 以前 christina04.hatenablog.com でMacrotasksとMicrotasksについて触れました。 ただこの時使ったのがPromise、setTmeout()だけで、他の種類の非同期関数を使った場合どうなるのだろう、と気になり検証してみました。 環境 Node.js v8.9.0

Angularでのコンポーネント→ビューのバインディング

概要 Angularではコンポーネント→ビュー方向のバインディングは以下の4種類があります。 プロパティバインディング 属性バインディング クラスバインディング スタイルバインディング これらの違いと使い分けを説明します。 環境 Angular v5.2.9 angular-cli…

BigQueryのデータをUpdateする

概要 BigQueryは基本的にはログなど解析目的で利用するため、データ自体を更新することはありません。ただ 一部間違ったログが入ってしまった データの洗い替えが必要になった みたいなケースが起き、解析結果が期待するものにならない場合は更新処理が必要…

GoでFacebook OAuthログインをセキュアに実装する

概要 Facebookを用いたOAuthログインの実装方法はネット上に多々ありますが、セキュリティに関してあまり考慮されてないものが多いです。 今回はセキュアに実装する例を示します。 環境 golang 1.10 facebook graph api v2.12 成果物 今回のソースコードはこ…

Golangのcontext.Contextはいつ使うべきか

Go

概要 go 1.7からcontextパッケージが標準パッケージになりました。 タイムアウト、キャンセルなどのハンドリングができることから、ブロッキングする処理や外部APIリクエストなどを扱う時は基本的に第一引数に置くべきです。 またAPIやプロセス間通信のリク…