メインコンテンツまでスキップ
最新4mo ago

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)

方向ポートソース目的
インバウンド50000.0.0.0/0 (または IP/CIDR に制限)Redash Web UI
アウトバウンドAll0.0.0.0/0インターネット + DB アクセス

RDS セキュリティグループ (redash-rds-sg)

方向ポートソース目的
インバウンド5432セキュリティグループ ID で redash-ecs-sg を参照ECS → Database
アウトバウンドAll0.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
CPU1024 (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_URLpostgresql://redash:<PASSWORD>@<RDS_ENDPOINT>:5432/postgresSecrets Manager + RDS エンドポイントから構築
REDASH_REDIS_URLredis://localhost:6379/0ハードコード (Redis は同じタスク内のサイドカー)
PYTHONUNBUFFERED0ハードコード
REDASH_SECRET_KEYredash/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 からイメージをプルする代わりに、プライベートでホストする場合にのみ必要です。

リポジトリプッシュするイメージタグ
redashredash/redash:latestlatest または 10.1.0 のようにバージョンを固定
redisredis:7-alpine7-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)
VPCECS と RDS と同じ VPC
サブネットパブリックサブネット (最低 2 つの AZ)
セキュリティグループredash-alb-sg (以下を参照)

ALB セキュリティグループ (redash-alb-sg)

方向ポートソース目的
インバウンド800.0.0.0/0HTTP (HTTPS にリダイレクト)
インバウンド4430.0.0.0/0HTTPS
アウトバウンド5000redash-ecs-sgALB → ECS

ALB を使用する場合、ECS セキュリティグループ (redash-ecs-sg) を更新します

方向ポートソース目的
インバウンド5000redash-alb-sg (セキュリティグループ ID で、0.0.0.0/0 ではなく)ALB → ECS のみ
アウトバウンドAll0.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 なし (開発/テスト)

  1. ECS コンソール → クラスター → タスク → ネットワークで パブリック IP を検索

  2. ヘルスチェック: http://<PUBLIC_IP>:5000/pingPONG を返す

  3. Redash を開く: http://<PUBLIC_IP>:5000

  4. 最初のブート時間は 5~15 分 (データベースマイグレーション)

  5. 管理者アカウントを作成し、組織名を設定し、データソースを追加

ALB 使用時 (本番環境)

  1. ALB ターゲットグループがターゲットを ヘルシー として表示するまで待機

  2. ヘルスチェック: https://redash.yourcompany.com/pingPONG を返す

  3. Redash を開く: https://redash.yourcompany.com

  4. 最初のブート時間は 5~15 分 (データベースマイグレーション)

  5. 管理者アカウントを作成し、組織名を設定し、データソースを追加


Redash の更新

  1. ECR を使用している場合: 新しいイメージをローカルでプルし、タグ付けして ECR にプッシュ

  2. 更新されたイメージでタスク定義の新しいリビジョンを作成

  3. ECS サービスを新しいリビジョンで更新 (または強制的に新しいデプロイメント)

  4. 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 — チームサイズ別に選択

インスタンスvCPURAM最適な用途時間当たり (東京)月額 (東京)
db.t3.micro21 GB1~3 ユーザー、テスト~$0.022~$16
db.t3.small22 GB3~10 ユーザー~$0.044~$32
db.t3.medium24 GB10~30 ユーザー~$0.088~$64
db.t3.large28 GB30~100 ユーザー~$0.176~$128
db.r6g.large216 GB100+ ユーザー、本番環境~$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 GB2~5 ユーザー~$22
1 vCPU / 2 GB5~15 ユーザー~$44
2 vCPU / 4 GB15~50 ユーザー~$88
4 vCPU / 8 GB50+ ユーザー~$176

推定月額総コスト (東京)

環境RDSECSその他合計
個人/テスト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 を許可)

Related Articles