問い合わFastly 無料トライアル

Compute@Edge の Log Tailing 機能で可観測性の向上とデバッグの容易化を実現

サーバーレスコンピューティングの魅力はもはや否定できないでしょう。アーキテクチャを分散化し、リソースの可用性を事前に計画する必要なグローバルにデプロイできることに大きな価値があります。2025年までにグローバル企業の半数がサーバーレスコンピューティングを導入すると、Gartner予測しているのも不思議ではありません (現在はわずか20 %)。

私たちは独自の強力なサーバーレスコンピューティング環境 Compute@Edge強化してきました。すでにライブで本番環境のトラフィックを配信している Compute@Edge では、使い慣れたプログラミング言語を使ってエッジのユースケース解決したり、高度なアプリケーションやカスタムロジックをエンドユーザーの限りなく近くで構築することが容易になりました。本日、私たちは新たな機能をリリースし、理想のサーバーレスコンピューティングに向けて一歩前進しました。

今回リリースした Compute@Edge Log Tailing 機能では、サードパーティのサービスを使用せずにほぼリアルタイムでログを読み取ることできるため、エッジアプリケーションの開発プロセスにおいて迅速なデバッグが可能になります。では、その仕組みを詳し見てみましょう。

エッジでの可観測性

Compute@Edge は、リアルタイムのログと統計機能に加え、業界標準のツールを使用してトレースデータを取得し、サードパーティのシステムにエクスポートする機能を備え、優れた可観測性機能提供しています。しかし、サーバーレスコンピューティングは多くの場合、組織で使用される複数の他のテクノロジーと並んで、組織のアプリケーション開発戦略全体の一部分に過ぎません 2019コミュニティ調査異種混在、そして分散化が進むシステム全体のパフォーマンスをエンドツーエンドで把握することは簡単なことではありません。

今日まで、稼働中の Compute@Edge Wasm サービスからアプリケーションログやデバッグデータを確認するためには、サードパーティのログ管理ツールを設定し、サービスにログエンドポイントを追加する必要がありました。そのため、理想とするシンプルで高速なデバッグの実現は依然として難し状況でした。それを変えるのが Log Tailing です。

サーバーレスコンピューティングソリューションの他のデバッグ機能とは異なり、Log Tailing では Fastly Compute@Edge プラットフォーム上で動作するアプリケーションをテストしながら、Fastlyコマンドラインインターフェース (CLI)使用して任意のターミナル内で独自のカスタムログメッセージを直接ストリーム出力することができます。これにより、開発者はエッジアプリケーションの stdout stderr出力をリアルタイムに可視化できるため、サードパーティのログ管理サービスを追加で設定したり、そのためにコストをかけたりせずに、効率的に問題を解決できます (ただし、長期的な保存や分析のためにログをアーカイブするには、サードパーティのログ管理サービスを設定する必要があります)。

Compute@Edge CLI からほぼリアルタイムでログにアクセスできるため、「開発 - プッシュ - 検証」のループ中に素早くデバッグすることができます。その結果、開発とデバッグを同時に行うことができ、アプリケーションをより早く本番稼動させること可能になります。間近の短いタイムフレームでサーバーレスの可観測性データを提供することで、より迅速な開発サイクルの実現を後押しします。

使用方法 

Log Tailing 機能の使用方法を理解するためにCompute@Edge Rust デフォルトスターターキット見てみましょう。このキットでは、ルーティング、シンプルなシンセティックレスポンス、キャッシュルールのオーバーライドのデモが含まれます。このスターターキットに変更を加えて複数の print 文を追加し、stdout stderr出力するようにします。また、このチュートリアルでは Fastly CLIバージョン 1.0.0使用しています

// Pattern match on the request method and path.
match (req.method(), req.uri().path()) {
// If request is a `GET` to the `/` path, send a default response.
(&Method::GET, "/") => {
println!("Hello from the root path!");
Ok(Response::builder()
.status(StatusCode::OK)
.body(Body::from("Welcome to Fastly Compute@Edge!"))?)
}
// If request is a `GET` to the `/backend` path, send to a named backend.
(&Method::GET, "/backend") => {
println!("Hello from the /backend path!");
// Request handling logic could go here...
// E.g., send the request to an origin backend and then cache the
// response for one minute.
*req.cache_override_mut() = CacheOverride::ttl(60);
Ok(req.send(BACKEND_NAME)?)
}
// If request is a `GET` to a path starting with `/other/`.
(&Method::GET, path) if path.starts_with("/other/") => {
println!("Hello from the {} path", path);
// Send request to a different backend and don't cache response.
*req.cache_override_mut() = CacheOverride::Pass;
Ok(req.send(OTHER_BACKEND_NAME)?)
}
// Catch all other requests and return a 404.
_ => {
let client_ip = downstream_client_ip_addr().ok_or(anyhow!("could not get client ip"))?;
let geo = geo_lookup(client_ip).ok_or(anyhow!("no geographic data available"))?;
eprintln!("Bad request to path {} from someone in {}, {}", req.uri().path(), geo.city(), geo.country_code3());
Ok(Response::builder()
.status(StatusCode::NOT_FOUND)
.body(Body::from("The page you requested could not be found"))?)
}
}

これは非常にシンプルな例で、Wasm アプリケーションをデバッグして、どのパスがヒットしているかを確認できます。このアプリケーションのデプロイ後、独自のログエンドポイントを設定しなくても、curl使って Log Tailing出力を見ながらパスロジックをテストすることができます。

次の例では、アプリケーションを以下にデプロイしています

https://logtail-demo.edgecompute.app/

現在 Compute@Edgeアクセスできるお客様は、アカウントチームに連絡してセットアップを依頼することで Log Tailing サービスを使用できます

$ fastly log-tail --service-id=<redacted>
SUCCESS: Managed logging enabled on service <redacted>

別のターミナルでアプリケーションに対して curl実行します。

$ curl https://logtail-demo.edgecompute.app/
$ curl https://logtail-demo.edgecompute.app/backend
$ curl https://logtail-demo.edgecompute.app/other/path
$ curl https://logtail-demo.edgecompute.app/notfound

Log Tailing出力には、ストリーム println場合は stdout、eprintln場合は stderr)、固有のリクエスト ID、メッセージが表示されます。

$ fastly log-tail --service-id=<redacted>
SUCCESS: Managed logging enabled on service <redacted>
| stdout | 4718faa4 | Hello from the root path! |
| stdout | 28dae28d | Hello from the /backend path! |
| stdout | 8b90d6a6 | Hello from the /other/path path |
| stderr | 9515856c | Bad request to path /notfound from someone in ft collins, USA |

1つのリクエストに対して複数の println eprintln呼び出しがあった場合、順番付けられ、グループ化されて出力されます。「/」ハンドラを変更してこれを確認できます。

(&Method::GET, "/") => {
println!("Hello from the root path!");
println!("2nd println in this request");
println!("3rd println in this request");
println!("4th println in this request");
println!("5th println in this request");
Ok(Response::builder()
.status(StatusCode::OK)
.body(Body::from("Welcome to Fastly Compute@Edge!"))?)
}

https://logtail-demo.edgecompute.app/対して curl コマンドを2つ同時に実行すると、一意の IDグループ化された出力を確認できます。

| stdout | 57bc24b2 | Hello from the root path! |
| stdout | 57bc24b2 | 2nd println in this request |
| stdout | 57bc24b2 | 3rd println in this request |
| stdout | 57bc24b2 | 4th println in this request |
| stdout | 57bc24b2 | 5th println in this request |
| stdout | 6e40d49a | Hello from the root path! |
| stdout | 6e40d49a | 2nd println in this request |
| stdout | 6e40d49a | 3rd println in this request |
| stdout | 6e40d49a | 4th println in this request |
| stdout | 6e40d49a | 5th println in this request |

今後について

私たちはエッジで構築することのメリットについて頻繁に説明していますが、使い慣れたツールや必要なツールを使用してエッジで構築するまったく新し方法を Compute@Edge通じて提案し続けます。今回の機能リリースに続き、今後も数多くの機能強化を予定しています。Compute@Edge関する最新情報を希望の方は、こちらからご登録ください。

Edward Muller
Data Team、Senior Manager
投稿日
興味がおありですか?
エキスパートへのお問い合わせ
この投稿を共有する
Edward Muller
Data Team、Senior Manager

Edward Fastly Data Team の Senior Manager として、お客様が必要な場所からログにアクセスきるようにサポートしています。以前は、Salesforce の Heroku で Principal Engineer/Director としてHeroku ログおよびメトリクスシステムの提供、Go 言語のサポート、SLO 採用の推進、クラウドデータベースの自動化ツールの作成などに携わっていました。Salesforce 入社する前は、PaaS スタートアップの先駆けのひとつ EngineYard 創設を支援しました。余暇には子供とゲームをするほかに、犬の散歩、木工、3D プリントBBQ料理、菓子作りなどをしています。