ぼくは明日、昨日のじぶんに頼りたい

明日のためのメモです。

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 dockersudo 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開けました。

ちなみに環境変数は以下を参考に
qiita.com

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