Carpe Diem

備忘録

2018-01-01から1年間の記事一覧

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

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

HashiCorp VaultのPolicyを使った運用

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

HashiCorp VaultでSSHをCA認証に

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

HashiCorp 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 plane アプリケーションの代わりにネットワー…

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.…

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

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

GoのRoundTripperとTransport

Go

背景 僕が保守している go-iapというGoで書いた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が必要 デバイス名の変更 といっ…

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

概要 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 成果物 今回のソースコードはこ…

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

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

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…