Carpe Diem

備忘録

会社のディベロッパーブログを書きました

概要 会社の公式ブログに投稿したのでその紹介です。 developers.cyberagent.co.jp AWAではサブスクリプション(定期購読)型の課金体系をとっているのでそういったサービスを出す方の参考になれば幸いです。

Webサーバにおけるソケット周りの知識

概要 サーバサイドの仕事をしているとソケットという概念に遭遇すると思います。 ソケットを理解すると TCPセッションの流れ ulimitでnofileを上げないとコネクション増加した時のToo many open filesが出るのはなぜか なぜサーバの待ち受けポートは1つで、…

Golang 1.11 で導入された ListenConfig を使って SO_REUSEPORT を利用する

概要 先日リリースされた1.11でソケットオプションを設定できるようになりました。 これによってLinux 3.9から導入されたSO_REUSEPORTという、同じポートでbindすることが可能になる機能が利用可能になります。 環境 golang 1.11 macOS 10.13.6 (Darwin Kern…

fluentdをローカルで簡単に検証する

概要 ローカルでサクッとfluentdの検証をしたい時に毎回調べ直していたのでメモ。 設定ファイル fluentd.confという名前で設定を用意します。 forwardされたログをstdoutに出力します。 <source> @type forward port 24224 bind 0.0.0.0 </source> <match *.*> @type stdout </match>

bindアドレスとadvertiseアドレス

概要 ConsulやVaultのクラスタ構成をしていると bind address advertise address という2つのアドレスを設定する必要が出てきます。 この2つをしっかり理解しておかないとクラスタ構成で思わぬ落とし穴にハマったりするので今回はこれを紹介します。 bind…

VaultのKVの基本的な使い方

概要 VaultのKey/Valueの基本的な使い方を紹介します。 このKey/Valueは少し前にv2が出ているため、v1と混同しないよう注意してください。 v1ドキュメント v2ドキュメント 今回はKey/Valueのバージョン管理が可能なv2を想定して説明します。 環境 Vault v0.1…

Consulクラスタをアップグレードした時に起きた問題と対応

概要 先日Consulクラスタのアップグレードをしたところちょこちょこ問題にぶち当たって解決に時間がかかったので、同じ症状に遭ったりした人用にメモ。 環境 Consul 1.1.0 -> 1.2.2 Ubuntu 16.04 問題背景 Consulはクライアントエージェントが追加されたり死…

VaultのAppRoleを使ってトークン取得

概要 Vaultではトークンを取得するための様々な認証方法がありますが、その中でアプリケーションに向いたAppRoleという認証方法があります。 ref: AppRole Pull Authentication - Guides - Vault by HashiCorp この図ではRole IDとSecret IDというID & Passw…

SSHのCA認証で Certificate lacks principal list

背景 christina04.hatenablog.com を元に本番環境を用意していたところ、ubuntuで作ったインスタンスはsshできるもののAmazon Linuxで作られたec2-userのインスタンスはsshできない現象に遭遇しました。 sshのログを調べるために # /etc/ssh/sshd_config # .…

VaultのAudit Devicesでオペレーションをロギング

概要 Vaultの売りは Secure secret management Dynamic secrets Encryption as a Service Leasing and Renewal など多々ありますが、その中でもAudit(監査)ログ(Vaultの操作ログ)の管理はとても重要です。 今回はその設定を紹介します。 Audit Devices 公…

AngularのPipeでデータの表示形式を簡単に操作する

概要 元はunixtimeだったり、単純な数値データなものだったりを以下のようなフォーマットにしたいことは往々にしてあります。 日付 通過 パーセント 大文字に統一 AngularではPipesという機能を使うことでテンプレート上で簡単に実現できます。 ビルトインPi…

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

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

SSL/TLS周りで必要な知識

概要 SSL/TLSでは ルート証明書 (root certificate) 中間証明書 (intermediate certificate) サーバ証明書 (primary certificate) など色々なファイルや用語があり、混乱しやすいのでまとめます。 認証局(CA)について ルートCA 認証局です。 この認証局が発…

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…