RedashをAWS上に構築
世間から何周も遅れて構築してみたいと思ったので試してみました。
可能な限り無料となるように、AWS初心者が悪戦苦闘したメモです。 (個人利用です)
考えられた構築方法
公式の方法を活用して構築したいと思います。
Setting up a Redash Instance
- Redash公式AMIで構築
- 不採用
- Redash公式Dockerイメージを用いてコンテナ管理マネージドサービス上で構築
- 不採用
- Redash公式Dockerイメージを用いてEC2で構築
- 採用
Redash公式AMIで構築
結果的に不採用です。
Redash公式にAWS EC2 AMIを使って構築する方法がありました。
先人たちのブログ等を拝見すると無料枠のインスタンスでは確実に動作しなそう(スペック的に)。さらに学習にもならないと思ったので却下しました。
Redash公式Dockerイメージを用いてコンテナ管理マネージドサービス上で構築
Redash公式にDockerがあるではないかと思い、EKSは厳しいけどECSはハンズオン(Fargate)もやったことがあったので軽い気持ち(なんかモダンだしって理由)で手を出しました。EC2起動タイプは無料枠だと。
VPCなどは適当に設定済み。 RedisはElastiCache、PostgreSQLはRDS(この時はなんかおかしいなと思いつつECSに夢中)。
ECS側でポチポチしていたら、EC2インスタンスできるのかなって勝手に思ってしまっていたがそんなことはなく、ドキュメントを読もう。
Amazon ECSLinuxコンテナインスタンスの起動-AmazonElastic Container Service
「Amazon ECS-Optimized Amazon Linux 2 AMI」を使うとECSにインスタンス認識されたので1つ解決。AMIはdeprecatedなんでした。
セットアップ周りが終わったので節約のためにNATゲートウェイを削除したら、なんか動かなくなり。
一応プライベートサブネットに配置していたので。EC2インスタンスはインターネットに出られないとだめっぽい(ドキュメントのどこかに書いていたのような)
そして、EC2インスタンスが無料枠の対象ではないのです。残念ですが却下しました。
そもそもFargateは現状で無料枠はないのですが、たぶん今の私ではデバッグできないと思うので結果的に諦めることになったと思います。
RedashをECS上で構築して, Cloudformationでコード管理する - Qiita いったん諦める参考になりました。
AWS Fargateを本番運用した所感 - コネヒト開発者ブログ
Redash公式Dockerイメージを用いてEC2で構築
初心者が初心に戻り作業再開です。
Dockerとdocker-composeをインストール
# ※ コマンドは抜粋です sudo yum -y update sudo amazon-linux-extras install -y docker docker version wget https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) sudo mv docker-compose-$(uname -s)-$(uname -m) /usr/local/bin/docker-compose sudo chmod -v +x /usr/local/bin/docker-compose docker-compose -v
amazon-linux-extras install -y dockerとsudo yum install dockerは結果的に同じらしい
ここでRDSが無料枠の対象になっていないことに気づきました。db.t3.microを使っていたというか一番低いので選択できるのこれだった。
getredash/setup: Setup scripts for Redash Cloud Imagesのdocker-compose.ymlを使うことにしたのでPostgreSQLもとりあえずコンテナで動かすことにしました。動作しているのを早く見たい気持ちです。
# ※ コマンドは抜粋です sudo docker-compose run --rm server create_db sudo docker-compose up -d
docker ps打てず、なんかもっさりしてる、DBも含めてコンテナ起動したら1GBだと足りなそう、今って結局AMIで丸っと動かしてるのと同じだよねと気づきました。
とりあえず再起動したい。EC2はどうやって再起動する作法なのか、vSphereのリセットの感覚でマネコンから「インスタンスを再起動」を押下する。何も起こらなかった(っぽい)。
とりあえず、Dockerのサービスが起動しないようにして、えいやで以下のコマンドを実行しました。
sudo systemctl disable docker
sudo shutdown -r now
再起動後、再度接続すると通常運転。
やっぱりdocker-composeで油断して起動したのが原因とわかる。
Dockerサービス起動してないからdocker psとかstopとかできないことがわかる。
Start the docker daemon without starting containers that set to restart automatically - Stack Overflow
なるほど、RestartPolicyはそこを見てるんだ。もっさりしているので、サービスは停止してalwaysをnoに書き換える
ls -la /var/lib/docker/containers/ # そんな感じか、、 vi hostconfig.json "RestartPolicy":{"Name":"always","MaximumRetryCount":0} ↓ "RestartPolicy":{"Name":"no","MaximumRetryCount":0}
あらためてコンテナ起動しなおして状況を確認。一人しか生き残れてない過酷な状況でした。
docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3b3a010a4b43 redash/redash:10.0.0.b50363 "/app/bin/docker-ent…" About an hour ago Exited (0) 15 minutes ago 5000/tcp redash-adhoc_worker-1 a1e2d686b1d9 redash/redash:10.0.0.b50363 "/app/bin/docker-ent…" About an hour ago Exited (0) 15 minutes ago 5000/tcp redash-scheduled_worker-1 a8bb0a103a2c redash/redash:10.0.0.b50363 "/app/bin/docker-ent…" About an hour ago Up 7 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp redash-server-1 bd9ca8192f79 redash/redash:10.0.0.b50363 "/app/bin/docker-ent…" About an hour ago Exited (137) 15 minutes ago 5000/tcp redash-scheduler-1 4ec3459875b0 postgres:11.13-alpine "docker-entrypoint.s…" About an hour ago Exited (0) 29 minutes ago redash-postgres-1
とりあえず、DBは外に逃がしたい。
でも、RDSでPostgreSQLにしたら無料枠の対象のt2.micro選べなくて料金こんくらいかかりますって出たんですよ。
RDSでどうにかしたい。デフォルトで選択されてる13系ではなく12系にすると無料枠にできました。
でも、さっき1人しか生き残れてなかったような、
RestartPolicyを戻して再度コンテナを起動。
docker ps fatal error: runtime: out of memory
そうだSwapを足そう。
スワップファイルを使用して Amazon EC2 インスタンスのスワップ領域としてメモリを割り当てる
はい。物理メモリの半分で行きましょう。
sudo dd if=/dev/zero of=/swapfile bs=128M count=4 sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile sudo swapon -s
起動するようになりました。
とりあえず、疎通確認。
# EC2 → RDSを確認 curl -v telnet://{DB インスタンス識別子}.{アカウントの特定の地域の固定識別子}.ap-northeast-1.rds.amazonaws.com:5432 # EC2 → ElastiCacheを確認 curl -v telnet://{ノード名}.{?}.0001.apne1.cache.amazonaws.com:6379
フルオープンではなく、ちゃんと接続できている。ブラウザからもRedash開けました。
PYTHONUNBUFFERED=1 REDASH_ALLOW_SCRIPTS_IN_USER_INPUT=true REDASH_COOKIE_SECRET= REDASH_SECRET_KEY= POSTGRES_PASSWORD= RDS_ENDPOINT= REDASH_DATABASE_URL= ELASTIC_CACHE_ENDPOINT= REDASH_REDIS_URL=redis=//${ELASTIC_CACHE_ENDPOINT}/0 REDASH_DATE_FORMAT=YYYY/MM/DD REDASH_LOG_LEVEL=INFO REDASH_SENTRY_DSN= SENTRY_TRACES_SAMPLE_RATE=1.0