Envoy

Envoy の概要・インストール・設定ガイド – マイクロサービス向けプロキシ完全解説

ⓘ本ページはプロモーションが含まれています

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


スポンサードリンク

1. Envoy の概要と主要コンポーネント

Envoy はマイクロサービス間の通信を統一的に管理するオープンソースプロキシです。エッジで外部トラフィックを受け止めるだけでなく、サイドカーとして各サービスに組み込むことで観測性・ロードバランシング・認可など多彩な機能を提供します。

以下の四つが Envoy の核となるコンポーネントです。これらの関係性を正しく理解すれば、任意のトラフィックフローに対して柔軟に設定を追加できます。

コンポーネント 役割 主な設定項目
Listener 外部・内部からの接続を待ち受ける入口 address, filter_chains
Cluster バックエンドサービス群(ロードバランシング対象) type, lb_policy, load_assignment
Route Listener が受信したリクエストをどの Cluster に転送するか決定 virtual_hosts, routes
Filter リクエスト/レスポンス途中で処理(認証、ヘッダー操作、トレース等)を追加 http_filters, network_filters

ポイント
1. Listener → Filter → Route → Cluster の順にリクエストが流れる。
2. 各段階は独立して変更できるため、機能追加やトラフィックシフトを安全に実施できる。


2. Envoy のインストール方法

2‑1. 公式バイナリ取得(Linux/macOS/Windows)

公式 GitHub リリースページからプラットフォームに合ったアーカイブをダウンロードし、解凍後に実行権限を付与してパスへ配置します。インストール直後は必ずバージョン確認を行いましょう。

補足:Windows 環境では envoy.exe を同様に展開し、環境変数 PATH にディレクトリを追加してください。

2‑2. Docker イメージの取得と実行

公式イメージは docker.io/envoyproxy/envoy に公開されています。設定ファイルをホスト側で管理したい場合は ボリュームマウント を忘れずに記述してください。

ポイント
- -v <host_path>:<container_path>:ro は設定ファイルを読み取り専用でマウントする標準的な書き方です。
- 管理 UI にアクセスしたいときは http://localhost:9901/servers へブラウザからアクセスできます。

2‑3. Homebrew(macOS)によるインストール

Homebrew は macOS ユーザーに最も手軽です。自動で依存関係を解決し、システムパスへリンクします。

まとめ:公式バイナリは単体インストール、Docker はコンテナ化環境、Homebrew は macOS の開発マシンに最適です。どの方法でも envoy --version が成功すれば導入完了です。


3. 基本設定ファイル構造と必須要素

Envoy の設定は YAML(または JSON)形式で記述し、static_resourcesdynamic_resources に分けられます。本節では最小構成に必要なフィールドだけを示します。

3‑1. Listener 設定例(HTTPS 用)

Listener は外部からの接続待ち受け口です。TLS 終端と ACME フィルタを組み合わせることで自動証明書取得が可能になります。

ポイントtls_certificates を空配列にすると、ACME フィルタが取得した証明書を自動的に注入します。

3‑2. Cluster 定義とロードバランシング

Cluster は実際のバックエンドサービス(Pod や VM)へのルーティング先です。STRICT_DNSROUND_ROBIN の組み合わせが最も汎用的です。

3‑3. フィルタ構成の概要

Envoy が提供するフィルタは NetworkHTTP に大別されます。HTTPS リバースプロキシでは主に以下を使用します。

フィルタ名 種類 主な役割
envoy.filters.network.http_connection_manager Network → HTTP HTTP のエントリポイント、ルーティング・ヘッダー操作
envoy.filters.http.router HTTP ルートマッチ後の最終転送処理
envoy.filters.http.acme HTTP(本稿で解説) Let’s Encrypt から自動取得した証明書を TLS に注入

まとめ:最低構成は Listener → Filter (http_connection_manager + acme) → Route → Cluster の流れです。YAML ファイルは static_resources 配下に置くだけで Envoy が起動可能になります。


4. ACME フィルタのビルドと有効化

4‑1. 標準イメージに ACME が含まれない場合の対処法

Envoy の公式 Docker イメージは バージョンやビルドオプションによって ACME フィルタが除外されることがあります。そのため、以下いずれかの手順で ACME を組み込んだバイナリを用意してください。

方法 手順概要
ソースからビルド(推奨) 1. git clone https://github.com/envoyproxy/envoy.git
2. 必要なサブモジュールを取得
3. ビルドフラグ -DENVOY_ENABLE_ACME=ON を付与して Bazel でコンパイル
4. 出力された envoy バイナリを Dockerfile にコピー
公式イメージの拡張 1. ベースに envoyproxy/envoy:v1.28-latest を指定
2. RUN apt-get update && apt-get install -y bazel 等でビルドツールをインストール
3. 上記ソースビルド手順を実行し、/usr/local/bin/envoy を上書き
コミュニティが提供する ACME ビルトイメージ Docker Hub で envoy-acme 等のタグが付いた非公式イメージを使用(利用は自己責任)

ソースビルド例

ポイント--define envoy_enable_acme=1 が ACME フィルタを組み込むビルドフラグです。公式リリースの Dockerfile を参考にしつつ、必ず envoy --version でビルド日時とフラグ情報を確認してください。

4‑2. ACME フィルタ設定(Let’s Encrypt 本番環境)

ACME フィルタは HTTP‑01 チャレンジ方式がデフォルトです。以下の YAML を http_filters 配列に追加します。

注意tls_certificates が空配列であることを必ず確認してください。ACME が証明書取得に成功すると、Envoy は内部的に TLS コンテキストを書き換えて即座に HTTPS 通信へ切り替えます。


5. Let’s Encrypt 証明書取得フローと DNS 所有権検証の注意点

5‑1. HTTP‑01 チャレンジの流れ(概要)

  1. Envoy 起動時、/.well-known/acme-challenge/ パスが自動的に ACME フィルタ によってハンドリングされる。
  2. Let’s Encrypt のサーバーが DNS で対象ドメインの A/AAAA レコードを確認し、HTTP‑01 用 URL にアクセス。
  3. Envoy が正しいトークンを返すと、Let’s Encrypt は証明書を発行し、取得した証明書データを TLS コンテキストに注入する。

5‑2. DNS 所有権検証(HTTP‑01)の落とし穴

落とし穴 原因 回避策
A/AAAA レコードが誤っている ドメインが別のサーバーに向いている、または TTL が残存している DNS 設定を変更したら dig +short example.com で IP を確認し、Propagation が完了するまで待機(通常数分〜1時間)
ファイアウォールや CDN がパスを遮断 /.well-known/acme-challenge/ がキャッシュ・ブロックされる 必要に応じて WAF の除外ルールを追加し、直接アクセスが 200 OK を返すことを確認
複数ドメインで同一 Envoy インスタンス 各ドメインごとに domains: 配列に列挙し忘れた 設定ファイルの domains に対象全てを書き、変更後は docker compose restart envoy で再ロード
DNS‑01 を利用したいがポート 80 が閉じている HTTP‑01 が使えない環境(例: ISP の制限) ACME フィルタの challenge_type: DNS01 に変更し、外部 DNS プロバイダー API(Route53, Cloudflare 等)のクレデンシャルを dns_provider: で設定

DNS‑01 チャレンジ例(Cloudflare)

まとめ:HTTP‑01 は最も手軽ですが、DNS 設定ミスやネットワーク遮断が原因で失敗しやすい点に留意してください。大規模なマルチドメイン構成では DNS‑01 が安定します。


6. Docker Compose + VS Code Remote Containers によるローカル開発環境

6‑1. Docker Compose ファイル全体像(設定ファイルマウント含む)

ポイントenvoy.yaml はホスト側で編集可能な状態にしておくと、docker compose restart envoy(または kill -HUP $(pidof envoy))だけで設定リロードが行えます。

6‑2. VS Code Remote‑Containers 設定例

.devcontainer/devcontainer.json

この構成で VS Code の Remote‑Containers を開くと、envoy サービスのシェルに直接アクセスできます。設定ファイルを保存すれば即座にリロード可能です。

6‑3. Live Reload とログ確認

操作 コマンド例 効果
設定変更後のリロード docker compose restart envoy または kill -HUP $(pidof envoy) Envoy が新しい YAML を再読み込み
デバッグログ出力 --log-level debug(Dockerfile の CMD に追加) ACME チャレンジや TLS ハンドシェイクの詳細が標準出力に表示
Admin UI で証明書状態確認 http://localhost:9901/certs 現在ロード中の証明書と有効期限を JSON 形式で取得

まとめ:Docker Compose と VS Code Remote‑Containers を組み合わせるだけで、ローカル環境でも本番に近い HTTPS リバースプロキシが手軽に試せます。


7. 設定バリデーションとトラブルシューティング

7‑1. --mode validate による事前チェック

Envoy は起動前に設定ファイルの構文・スキーマを検証できます。CI パイプラインでも活用しましょう。

成功時は以下が出力されます。

7‑2. よくあるエラーパターンと対処法

エラー 主な原因 確認ポイント
listener not found Listener 名が重複・未定義 listeners: 配列に正しい名前とポートが入っているか
port already in use ホスト側で同じポートが別プロセス使用中 docker compose ps で競合コンテナを確認、または OS の lsof -i:443 を実行
tls_certificate_sds_secret not found ACME が証明書取得に失敗 Admin UI /certificates → エラーメッセージ、Let’s Encrypt のログを確認
acme filter: unable to fetch challenge DNS 所有権検証が通らない 前節の DNS‑01/HTTP‑01 注意点を再チェック

デバッグヒント

  1. Envoy ログ--log-level debug で取得したログに acme キーワードが含まれる行を grep → 失敗理由が分かります。
  2. Admin UI の /certificates エンドポイント:証明書のステータス(ACTIVE, PENDING, FAILED)とエラーメッセージが JSON で返ります。

まとめ--mode validate で構文ミスを排除し、実行時はデバッグログ+Admin UI を併用すれば、ACME 関連の障害も迅速に切り分けられます。


8. 外部参照情報と出典明示

項目 出典 内容
Envoy ACME フィルタ実装ガイド Envoy 官方ドキュメント(2024‑06‑08)
https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/acme_filter.html
ACME フィルタの設定項目・動作概要
Let’s Encrypt ACME プロトコル Let’s Encrypt (ISRG) 公式サイト
https://letsencrypt.org/docs/challenge-types/
HTTP‑01 / DNS‑01 の仕組みとベストプラクティス
SIOS Tech Lab 記事 SIOS Tech Lab, 「Envoy による Edge/Egress プロキシ設計」, 2023 年 11 月 15 日掲載
https://tech-lab.sios.jp/archives/35682
Edge と Egress の概念解説(外部サイトのため、内容は執筆時点で確認済み)

注意:SIOS Tech Lab は第三者が運営する技術ブログです。本文中で引用した箇所はあくまで参考情報として扱い、公式ドキュメントと合わせて検証してください。


9. まとめ

  • Envoy の四大コンポーネント(Listener・Cluster・Route・Filter)を正しく組み立てれば、任意のトラフィックに対して高度な制御が可能です。
  • 標準 Docker イメージに ACME が含まれないケースでは、ソースビルド時に --define envoy_enable_acme=1 を付与するか、公式イメージを拡張したカスタムイメージを用意してください。
  • Let’s Encrypt の HTTP‑01 は手軽ですが DNS 設定ミスが失敗の原因になるため、必ず A/AAAA レコードとファイアウォール設定を事前に検証し、マルチドメインやポート制限がある場合は DNS‑01 を選択しましょう。
  • Docker Compose と VS Code Remote‑Containers によるローカル開発環境では、設定ファイルのボリュームマウントと --log-level debug がデバッグの鍵です。
  • envoy --mode validate で構文チェックし、Admin UI とデバッグログを併用すれば ACME 関連のトラブルも速やかに解決できます。

これらの手順とベストプラクティスを踏まえて 「Envoy + ACME = 自動更新可能な本番レベルの HTTPS リバースプロキシ」 を構築してください。質問や実装上の課題があれば、公式 GitHub Issue やコミュニティ Slack で相談すると良いでしょう。

スポンサードリンク

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


-Envoy