はじめに
とりあえず ECS に web アプリをデプロイするための一連と道中で詰まったことをメモする記事です。
今回デプロイした簡単な web アプリ
実行環境
Apple M3 チップ
macOS 15.6.1
やったこと概要
- アプリの実装
- Docker イメージの作成・動作確認
- ECR への push
- ECS でサービスのデプロイ(Express 使用)
- ポート設定
【番外編】
- EC2 で Docker build & ECR への push
- ローカル → EC2 へのファイル転送
- EC2 への Docker 導入
- ECR への push
やったこと
1. アプリの実装
ただページを返すだけの FastAPI Web アプリを作成。
起動コマンドなどは README.md 参照。
2. Docker イメージの作成動作・確認
# Docker イメージ作成
docker build . -t simple-web-app-image
# Docker コンテナ起動
docker run -p 8000:8000 simple-web-app-image:latest
以下にアクセスして画面が表示されたらOK
3. ECR への push
ECR リポジトリの作成
リポジトリ名のみ任意に入力。その他の設定はそのままで「作成」
ローカルで AWS 設定
AWS CLI 設定
以下から macOS → Command line installer - All users で aws コマンドを実行できるようにすると良い
認証情報の取得・設定
AWS コンソール
IAM → ユーザ → 任意のユーザ(ユーザがない場合は作成) → セキュリティ認証情報 → アクセスキー → アクセスキーを作成

次画面で コマンドラインインターフェイス (CLI) を選択し 次へ → アクセスキーを作成
AWS CLI
ターミナルから以下のコマンドを実行し、AWSコンソールで取得したアクセスキーとシークレットアクセスキー、リージョンを設定する
aws configure
AWS Access Key ID [****************]: *************
AWS Secret Access Key [****************]: ************
Default region name [ap-northeast-1]: ap-northeast-1
Default output format [None]:
ECR への push
リポジトリにイメージが追加されていることが確認できたらOK
4. ECS でサービスのデプロイ
ECS → Expressモード で先ほどデプロイしたイメージを選択し「作成」(かなり時間がかかる)

ログを確認すると起動自体には成功しているがその後終了している

解決方法
ECS → デプロイしたサービス → 「サービスを更新」
その他の設定からコンテナポートを 8000(デフォルトは 80) 、 ヘルスチェックパスを / に設定し「更新」すると解決された。

原因
ECS がサービスを起動する際にヘルスチェックを行なっておりデフォルトではポート80番の / エンドポイントに対してリクエストを行い、ステータス 200 が返ってくるのを確認して正常にサービスの起動となる。
今回作成したイメージでは 8000 番でリッスンしていたためリクエストが届かず起動に失敗してしまっていた。
【番外編】 EC2 で Docker build & ECR への push
mac 環境でのイメージ作成に問題がある場合は EC2 にソースをアップロードした上で EC2 上にビルド・pushするとよいかも
1. ローカル → EC2 へのファイル転送
EC2 でインスタンスを起動する
AWSコンソールで EC2 へアクセスし、インスタンスを起動する(特に要件がない時は Amazon Linux の指定でよい)。
鍵の取得
作成する際に選択する「キーペア」は作成したインスタンスへアクセスするための鍵をさす。ここでは新しいキーペアの作成を行う。
新しいキーペアを作成するとインスタンスを作成した際に作成された秘密鍵がダウンロードされる。
※ 特に要件がない場合、「キーペアのタイプ」はどちらでもよく、「プライベートキーファイル形式」は .pem で良い

「SSH クライアント」から秘密鍵の権限変更と SSH 接続を行うコマンドをコピーして実行し、SSH 接続ができるか確認する

SCP コマンドでアプリを EC2 に転送する
scp -i path/to/作成したペアキー -r path/to/アプリケーションディレクトリ ec2-user@IPアドレス:~/アプリケーションディレクトリ
2. EC2 への Docker 導入
sudo yum install -y docker # dockerのインストール
sudo service docker start # dockerの起動
sudo usermod -a -G docker ec2-user # ec2-userをdockerグループに入れる。これでec2-userがdockerコマンドを実行できる
sudo docker info # dockerの起動確認
必要に応じて docker compose もインストール
DOCKER_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | \
grep tag_name | \
sed -e 's/[^0-9\.]//g')
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v$DOCKER_VERSION/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose # docker compose に実行権限を付与
docker compose version # 起動確認
参考:
3. ECR へイメージを push
ECR へ push するための IAM ロールを作成
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr:CompleteLayerUpload",
"ecr:UploadLayerPart",
"ecr:InitiateLayerUpload",
"ecr:BatchCheckLayerAvailability",
"ecr:PutImage",
"ecr:BatchGetImage"
],
"Resource": "arn:aws:ecr:us-east-1:111122223333:repository/repository-name" //pushしたいECRリポジトリのARN
},
{
"Effect": "Allow",
"Action": "ecr:GetAuthorizationToken",
"Resource": "*"
}
]
}
参考:
EC2 インスタンスへ作成した IAM ロールをアタッチ
AWS コンソールから インスタンスを選択した状態で アクション → セキュリティ → IAMロールを変更 で先ほど作成した IAM ポリシーをアタッチした IAM ロールを選択する







