Redash セットアップ
AWS ECS (Fargate) に Redash をデプロイ — IaC 仕様
AWS ECS Fargate に Redash をデプロイするための完全なリソース仕様。これを AI に渡して、Terraform、CDK (TypeScript)、Pulumi、または CloudFormation のコードを生成させてください — 必要なすべての詳細がここにあります。
アーキテクチャ
ECS Fargate Task (単一タスク、localhost を共有する 2 つのコンテナ)
├── Redash コンテナ (:5000) ──► RDS PostgreSQL (:5432)
└── Redis コンテナ (:6379、サイドカー)
画像ソース: Docker Hub (デフォルト) または Amazon ECR (本番環境では推奨)。
各サービスの役割
Amazon ECS (Elastic Container Service) — AWS のコンテナオーケストレーションサービス。サーバーを管理することなく Docker コンテナを実行します。Fargate はサーバーレスモード — 「このコンテナを X CPU と Y メモリで実行して」と言うだけで、AWS が残りを処理します。
AWS Fargate — ECS の背後にあるコンピュートエンジンで、EC2 インスタンスを管理する必要性を排除します。コンテナを定義すると、Fargate はサーバーをプロビジョニングし、実行してスケールします。コンテナが使用する CPU/メモリに対してのみ料金を払います。
Amazon RDS (Relational Database Service) — マネージド PostgreSQL データベース。AWS がパッチ適用、バックアップ、およびフェイルオーバーを処理します。Redash はこれを使用して独自のメタデータを保存します — ユーザーアカウント、保存されたクエリ、ダッシュボード定義、および設定。
Redis — インメモリキー値ストア。Redash はこれをメッセージブローカーとキャッシュとして使用します — バックグラウンドジョブ (クエリの実行など) をキューイングし、結果をキャッシュします。同じ Fargate タスク内でサイドカーコンテナとして実行するため、localhost を介して Redash と通信します。
Amazon ECR (Elastic Container Registry) — AWS のプライベート Docker イメージレジストリ。Docker Hub から (パブリックインターネット経由で) イメージをプルする代わりに、ECR にプッシュして AWS 内からプルします — 高速化、レート制限なし、デプロイする正確なバージョンを管理します。
AWS Secrets Manager — パスワード、API キー、およびその他のシークレットを安全に保存するサービス。データベースパスワードをタスク定義にハードコーディングする代わりに、Secrets Manager に保存して ECS がランタイムにプルします。
Application Load Balancer (ALB) — ECS コンテナの前に置き、受信トラフィックを分散します。HTTPS (SSL)、カスタムドメイン、および高可用性のために複数の Redash コンテナを実行するために必要です。
ACM (AWS Certificate Manager) — ドメイン用の無料 SSL/TLS 証明書を提供します。証明書を ALB に接続すると、ユーザーは HTTPS 経由で Redash にアクセスします。
IAM (Identity and Access Management) — AWS の権限システム。ECS タスク実行ロールは、ECR からイメージをプルし、Secrets Manager からシークレットを読み、CloudWatch にログを書き込むためのコンテナに権限を付与します。
CloudWatch Logs — AWS のログ集約サービス。コンテナ stdout/stderr はここにストリーム配信され、SSH なしで問題をデバッグできます。
VPC (Virtual Private Cloud) — AWS での分離されたネットワーク。セキュリティグループはファイアウォールとして機能します — どのポートが開いているか、誰がアクセスできるかを定義します。RDS はプライベートサブネット (インターネットアクセスなし) に存在し、ECS はパブリックサブネット (または ALB の背後) に存在します。
リージョン
ap-northeast-1 (東京) すべてのリソースはこのリージョンで作成する必要があります。
リソース 1 — VPC とネットワーク
デフォルト VPC を使用するか、次の構成で新しいものを作成します:
-
最低 2 つのアベイラビリティゾーン
-
パブリックサブネット (パブリック IP を持つ ECS タスク用)
-
プライベートサブネット (RDS 用)
-
1 つの NAT Gateway (プライベートサブネット用 ECS を使用する場合、コスト削減の場合は 0 に設定)
-
Internet Gateway が接続されている
リソース 2 — セキュリティグループ
ECS セキュリティグループ (redash-ecs-sg)
| 方向 | ポート | ソース | 目的 |
| インバウンド | 5000 | 0.0.0.0/0 (または IP/CIDR に制限) | Redash Web UI |
| アウトバウンド | All | 0.0.0.0/0 | インターネット + DB アクセス |
RDS セキュリティグループ (redash-rds-sg)
| 方向 | ポート | ソース | 目的 |
| インバウンド | 5432 | セキュリティグループ ID で redash-ecs-sg を参照 | ECS → Database |
| アウトバウンド | All | 0.0.0.0/0 | デフォルト |
リソース 3 — シークレット (AWS Secrets Manager)
シークレット 1: データベース認証情報
-
シークレット名:
redash/db-credentials -
パスワード自動生成: はい、30 文字、句読点を除外
-
ユーザー名:
redash
シークレット 2: Redash シークレットキー
-
シークレット名:
redash/secret-key -
自動生成: はい、64 文字、句読点を除外
リソース 4 — RDS PostgreSQL
| 設定 | 値 |
| 識別子 | redash-analysis-db |
| エンジン | PostgreSQL 15 |
| インスタンスクラス | db.t3.micro (チームサイズ別に価格ガイドで選択) |
| 割り当てられたストレージ | 20 GB |
| ストレージタイプ | gp3 |
| データベース名 | postgres |
| 認証情報 | Secrets Manager から (redash/db-credentials) |
| VPC サブネット | プライベートサブネット |
| セキュリティグループ | redash-rds-sg |
| マルチ AZ | いいえ (コスト削減のため単一 AZ) |
| パブリックアクセス | いいえ |
| バックアップ保持期間 | 7 日 |
| 削除保護 | 開発の場合いいえ、本番の場合はい |
| 削除ポリシー | 開発の場合削除、本番の場合保持 |
リソース 5 — ECS クラスター
| 設定 | 値 |
| クラスター名 | redash-analysis-cluster |
| インフラストラクチャ | AWS Fargate (サーバーレス、EC2 インスタンスなし) |
リソース 6 — IAM タスク実行ロール
| 設定 | 値 |
| ロール名 | ecsTaskExecutionRole |
| 信頼エンティティ | AWS service → ECS Tasks |
| マネージドポリシー | AmazonECSTaskExecutionRolePolicy |
| 追加権限 | 上記の両方のシークレット用の secretsmanager:GetSecretValue |
リソース 7 — ECS タスク定義
| 設定 | 値 |
| ファミリー | redash-analysis-task |
| 起動タイプ | Fargate |
| OS / アーキテクチャ | Linux / X86_64 |
| CPU | 1024 (1 vCPU) — 価格ガイドで調整を参照 |
| メモリ | 2048 MB — 価格ガイドで調整を参照 |
| タスク実行ロール | ecsTaskExecutionRole |
| ネットワークモード | awsvpc (Fargate のデフォルト) |
コンテナ 1: Redash
| 設定 | 値 |
| 名前 | redash |
| イメージ | redash/redash:latest (Docker Hub) または ECR URI |
| 重要 | はい |
| ポート | 5000/tcp |
| メモリハードリミット | 1536 MB |
| メモリソフトリミット | 1024 MB |
| ログ記録 | CloudWatch Logs、ストリームプレフィックス redash、保持期間 14 日 |
環境変数:
| キー | 値 | ソース |
REDASH_DATABASE_URL | postgresql://redash:<PASSWORD>@<RDS_ENDPOINT>:5432/postgres | Secrets Manager + RDS エンドポイントから構築 |
REDASH_REDIS_URL | redis://localhost:6379/0 | ハードコード (Redis は同じタスク内のサイドカー) |
PYTHONUNBUFFERED | 0 | ハードコード |
REDASH_SECRET_KEY | redash/secret-key からの値 | Secrets Manager |
コンテナ 2: Redis
| 設定 | 値 |
| 名前 | redis |
| イメージ | redis:7-alpine (Docker Hub) または ECR URI |
| 重要 | いいえ |
| ポート | 6379/tcp |
| メモリハードリミット | 512 MB |
| メモリソフトリミット | 256 MB |
| ログ記録 | CloudWatch Logs、ストリームプレフィックス redis、保持期間 14 日 |
| 環境変数 | なし |
リソース 8 — ECS サービス
| 設定 | 値 |
| サービス名 | redash-analysis-service |
| クラスター | redash-analysis-cluster |
| タスク定義 | redash-analysis-task (最新リビジョン) |
| 起動タイプ | Fargate |
| 目的の数 | 1 |
| サブネット | パブリックサブネット (RDS と同じ VPC) |
| セキュリティグループ | redash-ecs-sg |
| パブリック IP の自動割り当て | はい |
| 最小ヘルスパーセント | 0 |
| 最大ヘルスパーセント | 200 |
| デプロイメントタイプ | ローリングアップデート |
接続ルール (サービス作成後に適用)
-
ECS サービスへのポート 5000 でのインバウンドを 0.0.0.0/0 から許可
-
ECS サービスから RDS へのポート 5432 でのアクセスを許可
(オプション) リソース 9 — ECR リポジトリ
Docker Hub からイメージをプルする代わりに、プライベートでホストする場合にのみ必要です。
| リポジトリ | プッシュするイメージ | タグ |
redash | redash/redash:latest | latest または 10.1.0 のようにバージョンを固定 |
redis | redis:7-alpine | 7-alpine |
scanOnPush: true を有効にして脆弱性スキャンを行います。
ECR を使用する場合、タスク定義のコンテナイメージ URI を次のように更新します:<ACCOUNT_ID>.dkr.ecr.ap-northeast-1.amazonaws.com/redash:<TAG>
(オプション) リソース 10 — Application Load Balancer (本番環境)
開発/テストではスキップしてください。本番環境、HTTPS、および水平スケーリングに必要です。
ALB
| 設定 | 値 |
| 名前 | redash-alb |
| スキーム | インターネット向け |
| タイプ | アプリケーション (ALB) |
| VPC | ECS と RDS と同じ VPC |
| サブネット | パブリックサブネット (最低 2 つの AZ) |
| セキュリティグループ | redash-alb-sg (以下を参照) |
ALB セキュリティグループ (redash-alb-sg)
| 方向 | ポート | ソース | 目的 |
| インバウンド | 80 | 0.0.0.0/0 | HTTP (HTTPS にリダイレクト) |
| インバウンド | 443 | 0.0.0.0/0 | HTTPS |
| アウトバウンド | 5000 | redash-ecs-sg | ALB → ECS |
ALB を使用する場合、ECS セキュリティグループ (redash-ecs-sg) を更新します
| 方向 | ポート | ソース | 目的 |
| インバウンド | 5000 | redash-alb-sg (セキュリティグループ ID で、0.0.0.0/0 ではなく) | ALB → ECS のみ |
| アウトバウンド | All | 0.0.0.0/0 | インターネット + DB アクセス |
ターゲットグループ
| 設定 | 値 |
| 名前 | redash-tg |
| ターゲットタイプ | IP (Fargate に必須) |
| プロトコル | HTTP |
| ポート | 5000 |
| VPC | 同じ VPC |
| ヘルスチェックパス | /ping |
| ヘルスチェック予想応答 | 200 OK (PONG を返す) |
| ヘルシーしきい値 | 3 |
| 不健全なしきい値 | 3 |
| ヘルスチェック間隔 | 30 秒 |
| ヘルスチェックタイムアウト | 10 秒 |
| 登録解除遅延 | 60 秒 |
リスナー — HTTPS (ポート 443)
| 設定 | 値 |
| ポート | 443 |
| プロトコル | HTTPS |
| 証明書 | ドメイン用 ACM 証明書 (例: redash.yourcompany.com) |
| デフォルトアクション | redash-tg に転送 |
リスナー — HTTP (ポート 80)
| 設定 | 値 |
| ポート | 80 |
| プロトコル | HTTP |
| デフォルトアクション | HTTPS (ポート 443、ステータス 301) にリダイレクト |
ACM 証明書
| 設定 | 値 |
| ドメイン | ドメイン (例: redash.yourcompany.com) |
| 検証方法 | DNS (CNAME レコードを DNS プロバイダーに追加) |
| リージョン | ap-northeast-1 (ALB リージョンと一致する必要があります) |
DNS (Route 53 または外部 DNS)
ドメインを ALB DNS 名に指す A レコード (エイリアス) または CNAME を作成します。
ALB 使用時の ECS サービスの変更
ALB が有効な場合、リソース 8 (ECS サービス) を以下で更新します:
| 設定 | 値 |
| パブリック IP の自動割り当て | いいえ (ALB がパブリックアクセスを処理) |
| サブネット | プライベートサブネット (NAT Gateway でアウトバウンド用) |
| ロードバランサー | redash-alb を接続 |
| ターゲットグループ | redash-tg |
| コンテナ名 | redash |
| コンテナポート | 5000 |
デプロイ後のステップ
ALB なし (開発/テスト)
-
ECS コンソール → クラスター → タスク → ネットワークで パブリック IP を検索
-
ヘルスチェック:
http://<PUBLIC_IP>:5000/ping→PONGを返す -
Redash を開く:
http://<PUBLIC_IP>:5000 -
最初のブート時間は 5~15 分 (データベースマイグレーション)
-
管理者アカウントを作成し、組織名を設定し、データソースを追加
ALB 使用時 (本番環境)
-
ALB ターゲットグループがターゲットを ヘルシー として表示するまで待機
-
ヘルスチェック:
https://redash.yourcompany.com/ping→PONGを返す -
Redash を開く:
https://redash.yourcompany.com -
最初のブート時間は 5~15 分 (データベースマイグレーション)
-
管理者アカウントを作成し、組織名を設定し、データソースを追加
Redash の更新
-
ECR を使用している場合: 新しいイメージをローカルでプルし、タグ付けして ECR にプッシュ
-
更新されたイメージでタスク定義の新しいリビジョンを作成
-
ECS サービスを新しいリビジョンで更新 (または強制的に新しいデプロイメント)
-
ECS がローリングデプロイメントを自動的に処理
トラブルシューティング
タスクが継続的に再起動: CloudWatch Logs を確認。通常、DB パスワードが間違っているか、RDS セキュリティグループが ECS からのポート 5432 を許可していません。
Redis 接続拒否: 両方のコンテナは同じタスク定義に存在する必要があります。Redis URL は redis://localhost:6379/0 である必要があります。
ポート 5000 に到達できない: パブリック IP が割り当てられていることを確認し、タスクがパブリックサブネットにあること、ECS セキュリティグループがインバウンド 5000 を許可していることを確認します。
最初のブート時に長いロード: 正常です — Redash はデータベースマイグレーションを実行します。10~15 分待機します。
スケーリング
-
水平: ECS サービスの
desired countを増やして複数の Redash タスクを実行 (トラフィックを分散する前に ALB が必要) -
垂直: 新しいタスク定義リビジョンで CPU/メモリを増やす — サービスを更新して新しいリビジョンを取得
-
データベース: RDS インスタンスクラスを変更 (変更中に短いダウンタイムが発生)
バックアップと復旧
-
RDS 自動バックアップが有効化 (上記で構成した 7 日間の保持) — ポイントインタイムリカバリをサポート
-
Redash UI を通じて定期的に重要なダッシュボードとクエリをエクスポート
-
すべてのデータソース接続文字列をドキュメント化 — これらは Redash の DB 内に存在し、IaC には存在しません
セキュリティベストプラクティス
-
RDS: パブリックインターネットに公開しない (
publicAccess: false) -
シークレット: DB パスワードと Redash シークレットキーには常に AWS Secrets Manager を使用 — タスク定義にハードコーディングしない
-
ネットワーク: RDS にはプライベートサブネットを使用、本番環境では ECS にもプライベートサブネット + ALB を使用
-
IAM: 最小権限タスク実行ロールを使用
-
イメージ: 再現性のため
latestの代わりに特定のイメージバージョンをピン留め -
監視: ECS クラスターで CloudWatch Container Insights を有効化して CPU/メモリ/ネットワークメトリクスを取得
-
HTTPS (本番環境): ECS サービスの前に Application Load Balancer と ACM 証明書を配置、ECS セキュリティグループを ALB からのトラフィックのみを受け入れるように制限
価格ガイド — ap-northeast-1 (東京)
東京リージョンは us-east-1 より約 15~20% 高い。以下の価格はオンデマンド推定値です。
RDS PostgreSQL — チームサイズ別に選択
| インスタンス | vCPU | RAM | 最適な用途 | 時間当たり (東京) | 月額 (東京) |
db.t3.micro | 2 | 1 GB | 1~3 ユーザー、テスト | ~$0.022 | ~$16 |
db.t3.small | 2 | 2 GB | 3~10 ユーザー | ~$0.044 | ~$32 |
db.t3.medium | 2 | 4 GB | 10~30 ユーザー | ~$0.088 | ~$64 |
db.t3.large | 2 | 8 GB | 30~100 ユーザー | ~$0.176 | ~$128 |
db.r6g.large | 2 | 16 GB | 100+ ユーザー、本番環境 | ~$0.270 | ~$197 |
20 GB gp3 ストレージあたり ~$2.40/月を追加します。
ECS Fargate — チームサイズ別に選択
東京の Fargate 価格: ~$0.05056/vCPU/時間 + ~$0.00553/GB/時間。
| 構成 | 最適な用途 | 月額 (東京) |
| 0.25 vCPU / 0.5 GB | 個人用途、1~2 ユーザー | ~$11 |
| 0.5 vCPU / 1 GB | 2~5 ユーザー | ~$22 |
| 1 vCPU / 2 GB | 5~15 ユーザー | ~$44 |
| 2 vCPU / 4 GB | 15~50 ユーザー | ~$88 |
| 4 vCPU / 8 GB | 50+ ユーザー | ~$176 |
推定月額総コスト (東京)
| 環境 | RDS | ECS | その他 | 合計 |
| 個人/テスト | db.t3.micro (~¥2,400) | 0.5 vCPU / 1 GB (~¥3,300) | — | ~¥5,700 (~$38) |
| 小規模チーム (5~15) | db.t3.small (~¥4,800) | 1 vCPU / 2 GB (~¥6,600) | — | ~¥11,400 (~$76) |
| 中規模チーム (15~50) | db.t3.medium (~¥9,600) | 2 vCPU / 4 GB (~¥13,200) | ALB ~¥3,000 | ~¥25,800 (~$172) |
| 大規模チーム (50+) | db.t3.large (~¥19,200) | 4 vCPU / 8 GB (~¥26,400) | ALB + HTTPS ~¥3,750 | ~¥49,350 (~$329) |
JPY 推定値は ~¥150/USD を仮定。実際のレートは変動します。ECR ストレージは無視できます (~$0.10/GB/月)。AWS 料金計算ツールで現在の価格を確認してください。
すべてが接続する方法 — 完全フロー図
開発/テスト設定 (ALB なし)
インターネット
│
▼
┌───────────────┐
│ パブリック IP │
│ :5000 │
└───────┬───────┘
│
┌─────────────▼──────────────┐
│ ECS Fargate Task │
│ (パブリックサブネット) │
│ │
│ ┌────────┐ ┌──────────┐ │
│ │ Redash │◄─►│ Redis │ │
│ │ :5000 │ │ :6379 │ │
│ └───┬────┘ └──────────┘ │
│ │ (localhost) │
└──────┼──────────────────────┘
│
│ ポート 5432
▼
┌──────────────┐
│ RDS │
│ PostgreSQL │
│ (プライベート│
│ サブネット) │
└──────────────┘
本番設定 (ALB + HTTPS)
インターネット
│
┌─────▼──────┐
│ Route 53 │ redash.yourcompany.com
└─────┬──────┘
│
┌───────▼────────┐
│ ALB │
│ :443 (HTTPS) │──── ACM 証明書
│ :80 → 301 │
│ (パブリック │
│ サブネット) │
└───────┬────────┘
│
│ ポート 5000 (内部)
▼
┌─────────────────────────────┐
│ ECS Fargate Task │
│ (プライベートサブネット) │
│ │
│ ┌────────┐ ┌──────────┐ │
│ │ Redash │◄──►│ Redis │ │
│ │ :5000 │ │ :6379 │ │
│ └───┬────┘ └──────────┘ │
│ │ (localhost) │
└──────┼───────────────────────┘
│
│ ポート 5432
▼
┌──────────────┐ ┌──────────────────┐
│ RDS │ │ Secrets Manager │
│ PostgreSQL │ │ - DB パスワード │
│ (プライベート│ │ - Redash シーク │
│ サブネット) │ └──────────────────┘
└──────────────┘
┌──────────────────┐
┌──────────────┐ │ CloudWatch Logs │
│ ECR │ │ - redash ログ │
│ (オプション) │ │ - redis ログ │
└──────────────┘ └──────────────────┘
リクエストフロー (ステップバイステップ)
1. ユーザーが https://redash.yourcompany.com を開く
│
2. DNS (Route 53) が ALB に解決
│
3. ALB が SSL を終了し、HTTP をターゲットグループのポート 5000 に転送
│
4. ターゲットグループが Redash コンテナのプライベート IP にルーティング
│
5. Redash コンテナがリクエストを処理:
├── メタデータを読み取り/書き込み → RDS PostgreSQL (ポート 5432)
├── バックグラウンドジョブをキュー → Redis (localhost:6379)
└── HTML/JSON を ALB 経由でユーザーに返す
│
6. ユーザーが Redash ダッシュボードを見る
セキュリティグループフロー
インターネット ──► ALB SG (80、443 を許可) ──► ECS SG (ALB SG からのみ 5000 を許可) ──► RDS SG (ECS SG からのみ 5432 を許可)