【AWS】App Runner移行でコストが85%減
経緯

今まで上記の構成で個人用の技術検証サイトsurnivers.comを運用していたのですが、月間約3万円強かかってしまっていたため、App Runnerに移行してコストを抑えることにしました。
🎯 成果サマリー
移行前:ECR+ECS+ALB+他モジュール・月約35,000円
移行後:App Runner+他モジュール・月約11,500円
→ 55%モジュール削減・85%コスト削減・運用ゼロ

🏗️ Terragrunt + Terraform構成の変化(前提:Terragrunt + Terraform使用)
本記事ではTerragruntとTerraformの詳細な解説は省きますが、構成管理の前提として以下のディレクトリ構成の変化を記載します。
また、下記はGitHub上でfeatureをmasterにmergeした際に、変更があるとApplyされるようになっていますが、そこの説明も省きます。
❌削除:ecr(ECR)/, ecs(ECS)/, route(ALB)/, deploy(CodeDeploy)/, network(VPC)/最適化
✅継続:lambda(Lambda)/, log(Cloud Watch)/, statics(Cloud Front)/, storage(S3)/
✅新規:app_runner(App Runner)/
移行前(envs/prod配下)
deploy(CodeDeploy)
dynamodb(DynamoDB)
ecr(ECR)
ecs(ECS)
lambda(Lambda)
log(CloudWatch)
network(VPC関連)
routing(ALB関連)
security(Security Rules関連)
statics(CloudFront)
storage(S3)
移行前(modules/prod配下)
deploy
ecr
ecs
lambda
log
network
routing
security
statics
storage
移行後(envs/prod配下)
app_runner(App Runner)
lambda(Lambda)
log(CloudWatch)
statics(CloudFront)
storage(S3)
移行後(modules/prod配下)
app_runner
lambda
log
statics
storage
🔥 envs/app_runner/terragrunt.hcl
dependency "storage" { config_path = "../storage" }
dependency "statics" { config_path = "../statics" }
locals {
manage_login_path = get_env("MANAGE_LOGIN_PATH") # ランダム英数字
manage_logout_path = get_env("MANAGE_LOGOUT_PATH") # /manager/login→404
}
inputs = {
service_name = "surnivers-prod-api"
github_repository_url = "https://github.com/surnivers/surnivers"
runtime_environment_secrets = {
SECRET_KEY = get_env("DJANGO_SECRET_KEY_SECRET_ARN")
}
}
🎛️ modules/prod/app_runner/main.tf
resource "aws_apprunner_service" "backend" {
service_name = var.service_name
source_configuration {
authentication_configuration {
connection_arn = local.connection_arn # GitHub OAuth
}
code_repository {
repository_url = var.github_repository_url
runtime = "PYTHON_311"
build_command = "python3 scripts/apprunner_build.py"
start_command = "python3 scripts/apprunner_start.py"
port = "8001" # Gunicorn
}
}
instance_configuration {
cpu = "1024" # 1 vCPU
memory = "2048" # 2 GB
}
}
🛡️ Djangoセキュリティ実装
✅ 管理画面:pathにはランダムパス(x7f9a2b...)を含め、かつ環境変数で設定するようにしています
✅ SECRET_KEY:Secrets Manager(環境変数)
✅ IAM最小権限:S3/DynamoDB/Cognitoスコープ限定
🌐 CloudFront手動→Terraform現実運用
- App Runner作成 → service_url取得
- CloudFront Origin: albdns → xxxxx.ap-northeast-1.awsapprunner.com
- statics/モジュール修正 → terragrunt apply
この手順は一度App Runnerを作成しないと2で設定する値が不明だったため、手動の手順である2が必須になります。
⚠️ App Runner今後(重要)
2026/4/30:新規利用停止(既存継続可)
次ステップ:ECS Express Mode移行予定
本記事:移行前最適化事例
🚀 再現手順(5分)
- GitHub Publicリポジトリ準備
- terragrunt apply(app_runner/)
- AWS ConsoleでGitHub接続承認
- CloudFront Origin修正
- Git push → 自動デプロイ完了
💰 コスト内訳
| 項目 | 移行前 | 移行後 | 備考欄 |
|---|---|---|---|
| VPC | 153.68$ | 3.72$ | |
| Tax | 21.87$ | 1.03$ | |
| ELB | 18.08$ | 0$ | |
| KMS | 14.00$ | 1.65$ | |
| WAF | 12.00$ | 1.43$ | |
| WorkMail | 8.00$ | 8.00$ | |
| S3 | 4.79$ | 4.68$ | |
| EC2 | 0.15$ | 12.59$ | GitHub Runnerで使用 |
| Others | 7.99$ | 2.59$ | App Runnerはここに含まれる |
| 合計 | 240.56$ | 35.69$ |
注意点
App Runnerの今後(2026年4月時点)AWSから発表があり、2026年4月30日以降は新規のお客様は利用できなくなります(既存利用者は継続可能)。
新機能追加は止まりますが、セキュリティ更新は続くそうです。
将来的にはECS Express Modeへの移行を検討する予定です。
Terragrunt + Terraformで管理していたECS + ALB構成からApp Runnerに移行した結果、月額コストを大幅に抑えることができました。
特に「運用をシンプルにしたい」「AWS料金をなんとかしたい」と感じている方にとって、少しでも参考になれば幸いです。
同じような悩みを持つエンジニアの方、コメントいただけると励みになります。
