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

【ITニュース解説】Deploying Tideman Election App on AWS EC2 with Docker

2025年09月14日に「Dev.to」が公開したITニュース「Deploying Tideman Election App on AWS EC2 with Docker」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

AWS EC2にDockerでWebアプリをデプロイする方法を解説する。EC2設定後Dockerを導入し、C++/Python混在アプリをマルチステージDockerfileで軽量化。Dockerビルド・実行、ポートマッピングでアプリを公開する。本番運用にはFlaskの開発用サーバーではなくGunicornが必須だ。

ITニュース解説

このニュース記事は、Tideman選挙アプリという具体的なプログラムを例に、開発中のアプリケーションをインターネット上で公開する方法をシステムエンジニアの初心者にもわかるように解説している。自分のパソコンで動かしていたアプリを、実際に多くの人がアクセスできるクラウド環境へデプロイする一連の流れが説明されている。

まず、アプリケーションをインターネットに公開するために、クラウド上に仮想のサーバーを用意する必要がある。記事では、アマゾンウェブサービス(AWS)というクラウドサービスが提供する「EC2」という仮想サーバーを使っている。これは、物理的なサーバーマシンを自分で購入・管理することなく、インターネット経由で必要な時に必要なだけサーバーを借りられるサービスである。EC2インスタンスを立ち上げる際、OSとして「Ubuntu」というLinux系のシステムが選ばれている。これは多くのサーバーで使われる安定したOSである。また、今回はアプリの規模が小さいため、費用を抑えられる「フリーティア」のインスタンスが利用されている。

サーバーを起動したら、次に「セキュリティグループ」という設定で、外部からのアクセスを制御する。これは、サーバーへの「門番」のようなもので、どのポート番号(通信の入り口)からのアクセスを許可するかを決める。記事では、ポート22(SSH用)とポート80(HTTP用)の二つが設定されている。ポート22は、自分のパソコンからコマンドラインを使ってEC2インスタンスに安全に接続し、操作するために必要である。ポート80は、Webブラウザからアプリにアクセスするために必須な、Webサイトの標準的なポートである。

サーバーの準備ができたら、そのインスタンスに必要なツールをインストールする。ここでは「Docker」と「Git」が導入されている。Gitはプログラムのソースコードを管理するためのツールで、自分の開発環境からEC2インスタンスへコードを簡単にコピーする(クローンする)ために使われる。Dockerは、アプリケーションとその実行に必要なものすべてを「コンテナ」という独立したパッケージにまとめるためのツールである。コンテナを使うと、開発環境と本番環境で同じようにアプリが動作することを保証でき、環境構築の手間を減らせるメリットがある。

次に、Dockerを使ってアプリケーションをコンテナ化する作業に入る。そのために「Dockerfile」というファイルを作成する。Dockerfileは、Dockerイメージ(コンテナの元となる設計図)を作成するための手順が書かれたスクリプトである。今回のアプリはC++で書かれたアルゴリズムとPython/Flaskで書かれたWebインターフェースの二つの要素で構成されているため、「マルチステージビルド」という方法が採用されている。

マルチステージビルドでは、複数の「ステージ(段階)」に分けてDockerイメージを構築する。最初のステージ(「builder」ステージ)では、C++のコンパイラが入った公式の「gcc」イメージをベースにする。このステージでC++のソースコードをコピーし、g++というコマンドを使って実行ファイルにコンパイルする。この実行ファイルがTidemanアルゴリズムの本体となる。

次のステージ(「final」ステージ)では、より軽量なPythonの実行環境である「python:3.10-slim」イメージをベースにする。ここで重要なのは、前のステージでコンパイルされたC++の実行ファイルだけを、この新しいステージにコピーすることである。コンパイラ自体はこの「final」ステージには不要なため、コピーしない。これにより、最終的なDockerイメージのサイズを大幅に小さくできる。さらに、Flaskアプリのコード(app.pyindex.htmlなど)と、必要なPythonライブラリの一覧が書かれたrequirements.txtファイルをコピーし、pip install -r requirements.txtコマンドでそれらのライブラリをインストールする。これにより、FlaskやGunicornといった依存関係がコンテナ内に整えられる。

最後に、コンテナが待ち受けるポートとして5000番をEXPOSEで宣言し、コンテナが起動したときに実行するコマンド(CMD)を設定する。ここでは「Gunicorn」というWebサーバーを使ってFlaskアプリを起動するよう指示している。

Dockerfileが完成したら、EC2インスタンス上でsudo docker build -t myflaskcpp .というコマンドを実行して、Dockerイメージをビルドする。-t myflaskcppは、作成するイメージにmyflaskcppという名前を付けることを意味する。

イメージのビルドが成功したら、いよいよコンテナを実行する。sudo docker run -d -p 80:5000 myflaskcppというコマンドを使う。-dオプションはコンテナをバックグラウンドで実行し続けることを意味する。ここで非常に重要なのが-p 80:5000という部分である。これは「ポートマッピング」と呼ばれ、EC2インスタンスの80番ポートに来たアクセスを、コンテナ内部の5000番ポートで動作しているFlaskアプリに転送するという設定である。つまり、外部のユーザーがWebブラウザでEC2の公開IPアドレスにアクセスすると、その通信はEC2の80番ポートを経由し、Dockerコンテナ内の5000番ポートで動作するFlaskアプリに届くという流れになる。前述のEC2セキュリティグループでポート80を開放していなければ、この設定をしていてもアプリにはアクセスできない。

記事では、Flaskアプリの起動にGunicornを使っている理由も説明されている。Flaskには開発用の簡易サーバーが組み込まれているが、これは一度に一つのリクエストしか処理できず、多数のユーザーがアクセスする本番環境には適さない。Gunicornは「WSGIサーバー」という種類で、複数のリクエストを同時に処理できる能力を持ち、高い安定性とパフォーマンスを提供する。これにより、多くのユーザーがアプリにアクセスしても、安定してサービスを提供できる。

これらのステップを経て、C++アルゴリズムとFlaskのWebインターフェースが結合されたTidemanアプリが、AWS EC2上でDockerコンテナとしてインターネットに公開される。システムの初心者にとって、この一連の作業はクラウド、コンテナ、そしてWebアプリケーションのデプロイという現代のシステム開発における重要な要素を体験できる貴重な機会となる。セキュリティグループによるアクセスの制御、Dockerのマルチステージビルドによる効率的なイメージ作成、ポートマッピングによる内外の通信連携、そして本番環境に適したサーバーの選択といった知見は、今後のシステムエンジニアとしてのキャリアで役立つ重要な学びとなるだろう。

関連コンテンツ

関連IT用語

【ITニュース解説】Deploying Tideman Election App on AWS EC2 with Docker | いっしー@Webエンジニア