Redash セットアップ
Body:
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 はサーバーレスモード — 「このコンテナを CPU X、メモリ 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 がここにストリーミングされるため、何かにログインすることなくイシューをデバッグできます。
VPC (Virtual Private Cloud) — AWS 内のアイソレートされたネットワーク。セキュリティグループはファイアウォールのような役割を果たします — どのポートが開いているか、誰が何にアクセスできるかを定義します。RDS はプライベートサブネット (インターネットアクセスなし) に、ECS はパブリックサブネット (または ALB の背後) に配置されます。
リージョン
ap-northeast-1 (東京) すべてのリソースをこのリージョンに作成する必要があります。
リソース 1 — VPC とネットワーク
デフォルト VPC を使用するか、以下を含む新しい VPC を作成します:
-
最小 2 つのアベイラビリティゾーン
-
パブリックサブネット (ECS タスク用、パブリック IP)
-
プライベートサブネット (RDS 用)
-
ECS にプライベートサブネットを使用する場合は 1 つの NAT Gateway (コスト節約のためパブリックサブネットを使用する場合は 0)
-
アタッチされたインターネットゲートウェイ
リソース 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 |
| Multi-AZ | いいえ (コスト削減のため単一 AZ) |
| パブリックアクセス | いいえ |
| バックアップ保持期間 | 7 日 |
| 削除保護 | 開発環境ではいいえ、本番環境でははい |
| 削除ポリシー | 開発環境では破棄、本番環境では保持 |
リソース 5 — ECS クラスター
| 設定 | 値 |
| クラスター名 | redash-analysis-cluster |
| インフラストラクチャ | AWS Fargate (サーバーレス、EC2 インスタンスなし) |
リソース 6 — IAM タスク実行ロール
| 設定 | 値 |
| ロール名 | ecsTaskExecutionRole |
| 信頼できるエンティティ | AWS サービス → 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 サービスへの 0.0.0.0/0 からのポート 5000 のインバウンドを許可
-
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 |
| スキーム | インターネット向け |
| タイプ | Application (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 ターゲットグループがターゲットを healthy として表示するまで待ちます
-
ヘルスチェック:
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 (本番環境): ACM 証明書を使用して Application Load Balancer を ECS サービスの前に配置; ECS セキュリティグループを ALB からのトラフィックのみを受け付けるように制限
料金ガイド — ap-northeast-1 (東京)
東京リージョンは us-east-1 と比較して約 15~20% 高い。以下の価格はオンデマンド推定値です。
RDS PostgreSQL — チームサイズ別に選択
| インスタンス | vCPU | RAM | 最適なユース | 時間料金 (東京) | 月間料金 (東京) |
db.t3.micro | 2 | 1 GB | 1~3 ユーザー、テスト | ~¥3.30 | ~¥2,400 |
db.t3.small | 2 | 2 GB | 3~10 ユーザー | ~¥6.60 | ~¥4,800 |
db.t3.medium | 2 | 4 GB | 10~30 ユーザー | ~¥13.20 | ~¥9,600 |
db.t3.large | 2 | 8 GB | 30~100 ユーザー | ~¥26.40 | ~¥19,200 |
db.r6g.large | 2 | 16 GB | 100+ ユーザー、本番環境 | ~¥40.50 | ~¥29,400 |
20 GB gp3 ストレージごとに ~¥360/月を追加。
ECS Fargate — チームサイズ別に選択
東京での Fargate 料金: ~¥7.58/vCPU/時間 + ~¥0.83/GB/時間。
| 構成 | 最適なユース | 月間料金 (東京) |
| 0.25 vCPU / 0.5 GB | 個人的使用、1~2 ユーザー | ~¥1,650 |
| 0.5 vCPU / 1 GB | 2~5 ユーザー | ~¥3,300 |
| 1 vCPU / 2 GB | 5~15 ユーザー | ~¥6,600 |
| 2 vCPU / 4 GB | 15~50 ユーザー | ~¥13,200 |
| 4 vCPU / 8 GB | 50+ ユーザー | ~¥26,400 |
総月間推定コスト (東京)
| 環境 | 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 タスク │
│ (パブリックサブネット) │
│ │
│ ┌────────┐ ┌──────────┐ │
│ │ Redash │◄─►│ Redis │ │
│ │ :5000 │ │ :6379 │ │
│ └───┬────┘ └──────────┘ │
│ │ (localhost) │
└──────┼──────────────────────┘
│
│ ポート 5432
▼
┌──────────────┐
│ RDS │
│ PostgreSQL │
│ (プライベート│
│ サブネット) │
└──────────────┘
本番環境セットアップ (ALB + HTTPS)
インターネット
│
┌─────▼──────┐
│ Route 53 │ redash.yourcompany.com
└─────┬──────┘
│
┌───────▼────────┐
│ ALB │
│ :443 (HTTPS) │──── ACM 証明書
│ :80 → 301 │
│ (パブリック │
│ サブネット) │
└───────┬────────┘
│
│ ポート 5000 (内部)
▼
┌─────────────────────────────┐
│ ECS Fargate タスク │
│ (プライベートサブネット) │
│ │
│ ┌────────┐ ┌──────────┐ │
│ │ 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 のみ許可)