【AWS】.NET AspireをAWSで動かしてみた時の話

## この記事で伝えたいこと（ポイント）

- オブザーバビリティの定義について説明しているよ
- Open Telemetryの説明をしているよ
- .NET Aspireの説明をしているよ
- .NET AspireをAWSで動かしてみた時の話をしているよ

## はじめに

この記事では可観測性、つまりはオブザーバビリティの話と.NETのオブザーバビリティツールとして誕生した.NET Aspireについて説明します。
内容としては[過去の登壇内容](https://speakerdeck.com/ymd65536/net-aspirenokuraudodui-ying-jian-zheng-azuretota-huan-jing-denoshi-jian)の解説です。

まずは「オブザーバビリティとはなんだったか」という話を振り返り、そこから関連のツールとしてOpen Telemetryの紹介と.NET Aspireとの関係を説明します。

そして、本題の.NET Aspireとその実行方法、実行に必要な環境を説明しつつ、さまざまな環境で.NET Aspireがどのように動作するか紹介します。

## オブザーバビリティとは

まず、オブザーバビリティってなんだったっけということなんですけども
言葉の成り立ちで説明すると「オブザーバビリティ：Observability」「Observe：観察する」と「Ability：能力」を組み合わせた造語です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527543/3f7828b2-19b3-1af2-09ea-193f4ff99ec3.png)

日本語では、「可観測性」や「観察する能力」などと訳されます。
可観測性というのはアプリケーションの状態を監視、測定、理解する能力のことです。

## Open Telemetryってなに

そして、実際のところはオブザーバビリティと.NETを理解できていれば、Open Telemetryを理解する必要はありませんが
Open Telemetryを使えば、オブザーバビリティへの理解が広がりますので可能であれば、知っておくと良いでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527543/e365c1d3-a9f6-6e52-8940-fbd7a0302f2d.png)

Open Telemetryとはアプリケーションの状態をテレメトリーデータとして受け取りアプリケーションの状態をモニタリングできるツールセットです。
オープンソースでベンダーに依存しないため、実装方法さえ理解できていれば、クラウドベンダー関係なく利用できます。

また、テレメトリーデータを取得するための実装のことを計装といいます。

計装というのは工学や工業分野でも使われる用語です。たとえば、工場ラインが停止する前に気づけるよう計測制御をつけることも計装と言います。

## OpenTelemetryと.NET Aspireの関係

Otelと.NET Aspireの両者がどのように繋がるかもうお気づきかもしれませんが、両者はオブザーバビリティというカテゴリでつながります。異なる点を言うとOtelはベンダーに依存せず、.NET Aspireは特定のプログラミング言語に依存するという点です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527543/4c54aa6d-11ca-8bf2-efd4-5efcf58f524e.png)

ただし、実装方法が異なるというだけでやっていることは一貫して「テレメトリデータの収集です。」
https://opentelemetry.io/ja/docs/concepts/observability-primer/

## 補足：eBPF（Extended Berkeley Packet Filter）

ちなみにコンテナの可観測性を高める手段のひとつとしてeBPFというものもあります。ネットワークのトレーサビリティ、セキュリティ、パフォーマンスを高めるツールとして有名です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527543/ab61f3ae-4ab2-1f23-69e3-224d3877b50c.png)

他と違うところはカーネルのイベントまで観測できるようになるというところです。
今回は長くなるので詳しくは説明しません。
なお、MicrosoftからのOSSとしてRetinaというKubernetes 用 eBPF 分散ネットワーク監視ツールが登場しています。興味のある人は調べてみると良いでしょう。

## .NET Aspireとは

.NET Aspireはひとことで表現すると「分散アプリケーションをモニタリングするための.NETツール」です。.NETを使って分散アプリケーションのオブザーバビリティを実現するともいいます。
最大の特徴は.NETさえ用意できれば、さまざまな環境で起動できることです。

[.NET Aspire overview](https://learn.microsoft.com/ja-jp/dotnet/aspire/get-started/aspire-overview)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527543/a93d59b6-747e-9ee0-a348-bad966e35d70.png)

## .NET Aspireの特徴

さまざまな機能を持ち、全ての規模のアプリケーションに利用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527543/492ffa9f-88d5-1398-84a1-f2b2298fbcd7.png)

どのように起動したら良いかは[Let's Learn .NET: Aspire](https://www.youtube.com/watch?v=Cm7mqHZJIgc)をチェックしてください。

## AWSで.NET Aspireを起動する場合

さまざまなアーキテクチャが検討できます。今回はAWS App RunnerとAmazon ECSで起動しましたが
手順さえ分かれば、誰でも簡単に実行できます。
ただし、AWSでは。NETの対応が一足遅いのでそこだけ注意です。

## ECS Aspire and App Runner Blazor

実際に起動してみた時の構成図です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527543/1daefc60-a444-d4c3-1512-55687340f51f.png)

異なる構成でも起動してみました。

タスク毎に起動する場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527543/12bcc6a4-5d8a-0707-cb29-4f497b2933d6.png)

タスク内でコンテナ同士が通信する場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527543/7b19ff9f-c11d-c379-5b16-0b32a25a4f9f.png)

## ECSで.NET Aspireを起動した場合

（起動方法や構成にもよるが）ECSの場合は自由度が高い
- 1つのECSタスク処理 VS ECSタスク間で処理
    - ECSタスク = docker composeのような単位
- ⭐️テレメトリデータの受信に対してECSにセキュリティグループが必要
    - App RunnerからECSにテレメトリデータを送信できる
- ⭐️IPアドレスを固定する必要アリ
    - ECSのタスクにIPを固定する機能はないのでサービスディスカバリが必要

細かい話：外部（社外）からアクセスできないような仕組み（AWS WAFあるいはセキュリティグループなど）が必要

## App Runnerで.NET Aspireを起動した場合

App Runnerはよくも悪くもVPCがなくても起動できるため、構成が難しい。

- テレメトリデータの送受信に対してセキュリティグループの設定が必要
    - ECSからApp Runnerにテレメトリデータを送信できる
- ⭐️App Runner コンテナの前段にプロキシを入れないといけない
- ⭐️Developer Dashboardを起動したときローカルホストから通信を受けたい
    - App RunnerのインバウンドVPCアクセスを有効にする必要がある

※VPCエンドポイントが必要となるため、コストが増える

細かい話：App Runnerが外部からアクセスできないような仕組み（先程と同様）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527543/a539b494-29dc-8c3c-58d1-580de27a8f57.png)

## まとめ

今回は.NET AspireをAWSで動かした時の話を書きました。.NET AspireはAWSのインテグレーションも公式に発表されており、注目度の高いOSSになっています。

参考：[integrations-on-dotnet-aspire-for-aws](https://github.com/aws/integrations-on-dotnet-aspire-for-aws)

実際に使ってみた話はこちらから[登壇資料](https://speakerdeck.com/ymd65536/ge-kuraudosabisuniokeru-dot-netnodui-ying-tojian-jie?slide=24)

.NET Aspireという名前のとおり、.NETが基本となりますが、OpenTelemetry互換のため他の言語でも利用が可能です。

とても便利なので今後の進化に期待したいです。

## 参考記事

### オブザーバビリティ関連

- [オブザーバビリティとは？監視との違い、必要性について解説](https://newrelic.com/jp/blog/best-practices/what-is-observability-difference-from-monitoring)
- [複雑化したITシステムを管理するオブザーバビリティ オンプレミスとクラウドネイティブ混在環境におけるオブザーバビリティをJP1 Version 13とJP1 Cloud Serviceで提供：統合システム運用管理 JP1：日立](https://www.hitachi.co.jp/Prod/comp/soft1/jp1/feature/observability/index.html)
- [Observability入門 | OpenTelemetry](https://opentelemetry.io/ja/docs/concepts/observability-primer/)

### .NET Aspire関連

- [.NET Aspire概略](https://www.docswell.com/s/tanaka_733/KXYV8M-20240118-dotnetaspire#p14)
- [OpenTelemetry .NETを理解する(10) .NET 8 におけるOpenTelemetry 概要 - 銀の光と碧い空](https://tech.tanaka733.net/entry/2024/01/opentelemetry-10)