Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Build Once, Deploy Everywhere: Deploying a .NET 8 API with Docker, AKS & GitHub Actions

2025年09月25日に「Dev.to」が公開したITニュース「Build Once, Deploy Everywhere: Deploying a .NET 8 API with Docker, AKS & GitHub Actions」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

.NET 8 APIをDockerでコンテナ化し、Azure Kubernetes Service (AKS) へデプロイする手順を解説。GitHub Actionsでビルドからデプロイまで自動化し、クラウドネイティブ開発の基礎を学ぶ実践的なチュートリアルだ。

ITニュース解説

現代のソフトウェア開発では、アプリケーションを開発するだけでなく、それを安定して動かし続けることが重要だ。開発したアプリケーションを様々な環境で同じように動かすにはどうすればよいか、また、変更があったときに迅速かつ安全にユーザーに届けるにはどうすればよいか、といった課題がある。クラウドネイティブ開発と呼ばれるこのアプローチは、これらの課題を解決するためにコンテナやオーケストレーションツール、自動化されたデプロイパイプラインなどを活用する。今回の解説では、このクラウドネイティブ開発の具体的な流れを、システムエンジニアを目指す初心者のあなたにもわかりやすく説明する。シンプルなWeb APIを開発し、それをクラウド上に展開し、さらにその更新を自動化するまでの全工程を一つずつ見ていくことで、現代のソフトウェア開発の全体像を掴めるだろう。

まず、アプリケーションの本体となるWeb APIを作成する。APIとは、異なるソフトウェア同士が情報をやり取りするための窓口のことだ。ここでは、マイクロソフト製のフレームワークである.NET 8を使い、気象予報を返すシンプルなAPIを開発する。Web APIでは通常、HTTPという通信プロトコルを使ってデータの送受信を行う。作成するAPIは「Minimal API」という手法を用いる。これは.NET 6から導入され、APIを少ないコード量で素早く構築できるのが特徴で、初心者が全体像を把握しやすい。APIの機能としては、主に以下の三つを用意する。一つ目は、アプリケーションが正常に動作しているかを確認するための「ヘルスチェック」エンドポイントだ。これは後ほどKubernetesというシステムがアプリケーションの状態を監視するために非常に重要になる。二つ目は、APIが提供する機能や使い方を自動的にドキュメント化してくれる「Swagger」というツールだ。Swaggerを使えば、開発者や利用者はブラウザからAPIの機能を確認したり、実際に試したりできるため、開発効率が向上する。三つ目は、実際の気象予報データを返すエンドポイントだ。これらを通じて、外部からのリクエストに応じてデータを返す基本的なWeb APIの仕組みを理解する。開発時には、ローカル環境でアプリケーションを起動し、これらのエンドポイントにアクセスして正しく動作するか確認する作業も行う。

次に、開発した.NETアプリケーションを「Dockerコンテナ」としてパッケージ化する。コンテナ化とは、アプリケーションとその実行に必要なすべてのもの(コード、ライブラリ、設定ファイルなど)を一つにまとめ、どこでも一貫して動作するようにする技術だ。これにより、「私の環境では動くのに、あなたの環境では動かない」といった問題を防ぐことができる。Dockerを使うことで、アプリケーションはホストOSから隔離された独立した環境で動作する。この隔離された環境は「コンテナ」と呼ばれ、軽量な仮想マシンのように機能する。コンテナを作成するための設計図が「Dockerfile」だ。Dockerfileには、どのOSをベースにするか、必要なソフトウェアをインストールするか、アプリケーションのコードをコピーするか、どのように起動するかといった指示を記述する。このDockerfileでは、「マルチステージビルド」という手法を用いる。これは、アプリケーションをビルドするための環境と、実際に実行するための環境を分けることで、最終的なコンテナイメージのサイズを大幅に削減し、セキュリティを高めることができる方法だ。ビルド時に不要なツールや中間ファイルを最終イメージに含めないため、コンテナの起動が速くなり、使うリソースも減るというメリットがある。作成したDockerfileと、コンテナに含めたくないファイルを指定する.dockerignoreファイルを使って、Dockerイメージをビルドし、ローカルで正しく動作するかテストする。このステップで、アプリケーションがどこにでも持ち運べる「ポータブル」な形になる。

コンテナ化したアプリケーションを実際にクラウド上で動かすための環境を、マイクロソフトが提供するクラウドプラットフォーム「Azure」上に構築する。まず、Azureへのログインや、作業対象の「サブスクリプション」の選択、関連するリソースをまとめる「リソースグループ」の作成を行う。次に、「Azure Container Registry(ACR)」を作成する。これは、Dockerイメージを保存するためのプライベートなレジストリ、いわば「自分だけのDockerイメージ倉庫」だ。ローカルでビルドしたDockerイメージをこのACRにアップロードすることで、後でクラウド上のサーバーからそのイメージを取り出して実行できるようになる。ACRには、イメージのビルドをAzure上で行う「ACR Build」という機能もあり、これを利用することで、開発環境に依存しない安定したイメージ作成が可能になる。

そして、アプリケーションを実行する中核となる「Azure Kubernetes Service(AKS)」を構築する。Kubernetesは「コンテナオーケストレーション」ツールと呼ばれ、多数のコンテナ化されたアプリケーションを効率的に管理・運用するためのシステムだ。AKSは、このKubernetesクラスターをAzureが管理してくれるサービスで、ユーザーはインフラの複雑な管理から解放され、アプリケーションの運用に集中できる。クラスター作成時には、ACRとの連携設定を行い、コンテナイメージをAKSが容易に取得できるようにする。Kubernetesへのデプロイでは、「YAMLマニフェスト」という設定ファイルを使う。これらは、アプリケーションの望ましい状態を記述したものだ。一つ目は「Deployment」で、「このアプリケーションのコンテナを何個動かしたいか」や「どのDockerイメージを使うか」といった情報を定義する。例えば、高可用性を実現するために常に複数のコンテナ(Podと呼ばれる)を動かすように設定したり、CPUやメモリの使用量を制限したりできる。また、アプリケーションの健全性を監視するための「Liveness Probe」と「Readiness Probe」もここで定義する。これらは、前述のヘルスチェックエンドポイントを使って、コンテナが正常に動作しているか、または外部からのリクエストを受け入れる準備ができているかをKubernetesに伝える役割を持つ。二つ目は「Service」だ。Deploymentで起動したPodは、それぞれが持つIPアドレスが変わることがあるため、外部から安定してアクセスできるようにするには、固定された窓口が必要になる。Serviceはこの窓口の役割を果たし、外部からの通信を複数のPodに分散させる「ロードバランシング」機能も提供する。今回は「LoadBalancer」タイプのServiceを作成し、アプリケーションをインターネットに公開するためのグローバルIPアドレスを取得する。これらの設定ファイルをKubernetesクラスターに適用することで、コンテナ化されたアプリケーションがクラウド上で起動し、外部からアクセスできるようになる。

ここまででアプリケーションの開発、コンテナ化、クラウドへのデプロイ方法を学んだが、これらの作業を手動で行うのは効率的ではないし、ヒューマンエラーの原因にもなる。そこで登場するのが「CI/CDパイプライン」の自動化だ。CI/CDとは、継続的インテグレーションと継続的デリバリー/デプロイメントの略で、ソフトウェアの変更を継続的にテストし、本番環境へ安全かつ迅速にリリースするための一連のプロセスを自動化することだ。ここでは「GitHub Actions」というツールを使って、このCI/CDパイプラインを構築する。GitHub Actionsは、GitHubのリポジトリ内でイベント(例えばコードのプッシュなど)をトリガーとして、定義された一連のタスク(ワークフロー)を自動的に実行できる機能だ。まず、開発したコードをGitというバージョン管理システムで管理し、GitHubのリポジトリにプッシュする準備をする。次に、GitHub ActionsからAzureリソースを操作できるように、「サービスプリンシパル」というAzureの認証情報を設定する。これは、GitHub ActionsがAzureに対して「この操作を行ってもよい」という許可を与えるための「鍵」のようなものだ。この認証情報は、GitHubの「シークレット」という機能を使って安全に管理する。シークレットには、ACRの名前やリソースグループの名前、AKSクラスターの名前なども登録し、ワークフローファイル内でそれらの情報に安全にアクセスできるようにする。

GitHub Actionsのワークフローは、.github/workflowsディレクトリ内にYAML形式のファイルとして定義する。このファイルには、コードがリポジトリにプッシュされたときに実行される一連のステップを記述する。具体的には、以下のタスクを自動化する。コードのチェックアウト、依存関係の復元とビルド、テストの実行、Azureへのログイン、DockerイメージのビルドとACRへのプッシュ、そしてAKSへのデプロイだ。イメージプッシュの際には、GitHubのコミットハッシュをタグとして使うことで、どのバージョンがデプロイされたかを追跡しやすくする。AKSへのデプロイでは、kubectl set imageコマンドを使うことで、稼働中のコンテナイメージを新しいバージョンに切り替え、Kubernetesが自動的に安全な方法で更新してくれる。このワークフローをコミットしてGitHubにプッシュすると、GitHub Actionsが自動的に動き出し、これらのステップを順次実行してくれる。これにより、開発者がコードを更新してプッシュするだけで、アプリケーションがクラウド上の本番環境に自動的にデプロイされる「継続的デプロイ」が実現するのだ。

CI/CDパイプラインが正常に完了し、アプリケーションがAKS上にデプロイされたら、ブラウザやコマンドラインツールを使って、実際にアプリケーションにアクセスし、正しく動作していることを確認する。KubernetesのServiceが提供する外部IPアドレスを取得し、そのIPアドレスを使って、デプロイされたウェルカムメッセージ、気象予報データ、Swaggerドキュメント、ヘルスチェックエンドポイントにアクセスする。外部IPアドレスが割り当てられるまでには時間がかかる場合があるので、ステータスを監視し、準備ができたことを確認する。次に、継続的デプロイが機能していることを確認するため、アプリケーションのコードを少し変更してみる。例えば、ウェルカムメッセージを更新し、バージョン番号を上げる。この変更をGitでコミットし、GitHubリポジトリにプッシュすると、GitHub Actionsのワークフローが再び自動的に起動し、新しいコードでDockerイメージがビルドされ、ACRにプッシュされ、最終的にAKS上のアプリケーションが更新される。これにより、開発者がコードを変更するたびに、手動でデプロイ作業を行う必要がなくなり、迅速かつ安全に新しい機能をリリースできるようになる。

この一連のプロセスを通じて、あなたはローカルで開発した.NET 8 Web APIが、Dockerによってコンテナ化され、Azure Kubernetes Service (AKS)というクラウド環境で実行され、さらにGitHub ActionsによるCI/CDパイプラインで自動的にデプロイされる、現代のクラウドネイティブ開発のフルライフサイクルを体験したことになる。これは単にアプリケーションを一つ作ったということだけではなく、以下のような重要な知見と技術を習得したことを意味する。それは、.NET 8を使ったWeb API開発の基礎、Dockerによるアプリケーションのポータブル化、Kubernetesによるコンテナ化されたアプリケーションの効率的な管理とスケーリング、Azureというクラウドプラットフォームの基本的な使い方、そしてGitHub Actionsを活用したソフトウェアリリースの自動化(CI/CD)だ。これらの技術は、どんなプログラミング言語やフレームワークを使っても応用できる、汎用性の高い「ブループリント」だ。今回の経験は、あなたがシステムエンジニアとして、大規模で堅牢なソフトウェアを構築し、運用していくための強力な基盤となるだろう。ぜひ、今回のプロジェクトを足がかりに、監視機能の追加、自動スケーリングの設定、データベースとの連携など、さらに発展的な学習を進めてほしい。クラウドネイティブ開発の旅は常に進化しており、この基礎があれば、どんな新しい技術にも対応できるようになるはずだ。

関連コンテンツ

関連IT用語

関連ITニュース