APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

EKS と Apache Superset で始めるデータ可視化

はじめに

こんにちは、クラウド事業部の梅本です。

今回は、オープンソースのデータ探索・可視化プラットフォーム、Apache Superset を EKS(Elastic Kubernetes Service)上に構築します。

superset.apache.org

Apache Superset は、直感的な操作でグラフやダッシュボードを容易に作成できる点が大きな特長です。私自身、日々の業務におけるCSVデータの可視化や、ちょっとしたデータ探索に活用しており、その手軽さと機能性に助けられています。また、多様なデータソースに対応するための豊富なドライバが用意されているため、様々な環境のデータとも柔軟に連携が可能です。

AWS のマネージド BI ツールである Amazon QuickSight も有力な選択肢の一つですが、OSS である Superset は、その自由度の高さと特定のニーズに合わせたカスタマイズ性において強みを発揮します。

Amazon QuickSight については、弊社のブログでもご紹介しておりますので、ぜひ併せてご覧ください。

techblog.ap-com.co.jp

techblog.ap-com.co.jp

CloudShell

今回は、以下のサイトを参考に EKS へ Apache Superset をデプロイします。

awslabs.github.io

GitHub リポジトリはこちらです。

github.com

このリポジトリでは、Apache Superset の他にもデータ分析のみならず、機械学習(ML)や人工知能(AI)に関する情報も参考にすることができます。

EKS へのデプロイにあたり、AWS Management Console から手軽に環境を構築できる AWS CloudShell を利用します。

まず、AWS CloudShell に不足しているツールをインストールし、デプロイ環境を整えていきます。

$ git clone https://github.com/tfutils/tfenv.git ~/.tfenv
Cloning into '/home/cloudshell-user/.tfenv'...
remote: Enumerating objects: 2062, done.
remote: Counting objects: 100% (667/667), done.
remote: Compressing objects: 100% (211/211), done.
remote: Total 2062 (delta 518), reused 522 (delta 446), pack-reused 1395 (from 1)
Receiving objects: 100% (2062/2062), 439.14 KiB | 8.29 MiB/s, done.
Resolving deltas: 100% (1322/1322), done.

$ mkdir -p ~/.local/bin/

$ sudo ln -s ~/.tfenv/bin/* ~/.local/bin/

$ tfenv install 1.11.3
Installing Terraform v1.11.3
Downloading release tarball from https://releases.hashicorp.com/terraform/1.11.3/terraform_1.11.3_linux_amd64.zip
############################################################################################################################################ 100.0%
Downloading SHA hash file from https://releases.hashicorp.com/terraform/1.11.3/terraform_1.11.3_SHA256SUMS
Not instructed to use Local PGP (/home/cloudshell-user/.tfenv/use-{gpgv,gnupg}) & No keybase install found, skipping OpenPGP signature verification
terraform_1.11.3_linux_amd64.zip: OK
Archive:  /tmp/tfenv_download.jx2xbj/terraform_1.11.3_linux_amd64.zip
  inflating: /home/cloudshell-user/.tfenv/versions/1.11.3/LICENSE.txt  
  inflating: /home/cloudshell-user/.tfenv/versions/1.11.3/terraform  
Installation of terraform v1.11.3 successful. To make this your default version, run 'tfenv use 1.11.3'

$ tfenv use 1.11.3
Switching default version to v1.11.3
Default version (when not overridden by .terraform-version or TFENV_TERRAFORM_VERSION) is now: 1.11.3

$ terraform version
Terraform v1.11.3
on linux_amd64

なお、Terraform のインストール手順については、以下の記事を参考にさせていただきました。

dev.classmethod.jp

Deploy Superset

デプロイを開始する前に、いくつかの準備を行います。

# CloudShell のホームディレクトリの容量が少ないため、/tmp で作業
$ cd /tmp

# Superset デプロイ用のコードをダウンロード
$ git clone https://github.com/awslabs/data-on-eks.git
Cloning into 'data-on-eks'...
remote: Enumerating objects: 48644, done.
remote: Counting objects: 100% (6036/6036), done.
remote: Compressing objects: 100% (1185/1185), done.
remote: Total 48644 (delta 5740), reused 4898 (delta 4847), pack-reused 42608 (from 3)
Receiving objects: 100% (48644/48644), 311.67 MiB | 31.63 MiB/s, done.
Resolving deltas: 100% (34719/34719), done.

# Superset のディレクトリに移動し、Terraform 初期化
$ cd data-on-eks/analytics/terraform/superset-on-eks

$ terraform init
Initializing the backend...
Initializing modules...
...
Terraform has been successfully initialized!
...

# Terraform の state ファイルを配置する S3 Bucket を作成 (今回はus-east-2に配置)
$ aws s3api create-bucket --bucket bucket-ume-superset --region us-east-2 --create-bucket-configuration LocationConstraint=us-east-2
{
    "Location": "http://bucket-ume-superset.s3.amazonaws.com/"
}

次に、デプロイ前にいくつかの構成を変更するため、一部コードを修正します。

  • リージョンを us-east-2 に変更します。
  • EKS ノードの冗長構成を縮小し、より小さな構成にします。
  • Kubernetes のバージョンを最新にアップデートします。
  • Terraform の state ファイルの管理先を S3 バケットに変更します。

これらの変更は、以下の差分として適用します。

  • providers.tf
--- a/analytics/terraform/superset-on-eks/providers.tf
+++ b/analytics/terraform/superset-on-eks/providers.tf
@@ -32,5 +32,15 @@ provider "helm" {
 # Docs -> https://docs.aws.amazon.com/AmazonECR/latest/public/public-registries.html
 provider "aws" {
   alias  = "ecr"
-  region = "us-east-1"
+  region = "us-east-2"
 }
+
+terraform {
+  backend "s3" {
+    bucket = "bucket-ume-superset"
+    key    = "superset/terraform.tfstate"
+    region = "us-east-2"
+    encrypt = true
+  }
+}
+
  • main.tf
--- a/analytics/terraform/superset-on-eks/main.tf
+++ b/analytics/terraform/superset-on-eks/main.tf
@@ -92,9 +92,9 @@ module "eks" {
       # Filtering only Secondary CIDR private subnets starting with "100.". Subnet IDs where the nodes/node groups will be provisioned
       subnet_ids = compact([for subnet_id, cidr_block in zipmap(module.vpc.private_subnets, module.vpc.private_subnets_cidr_blocks) : substr(cidr_block, 0, 4) == "100." ? subnet_id : null])
 
-      min_size     = 2
-      max_size     = 6
-      desired_size = 2
+      min_size     = 1
+      max_size     = 2
+      desired_size = 1
 
       instance_types = ["m5.xlarge"]
 
@@ -124,9 +124,9 @@ module "eks" {
       # Filtering only Secondary CIDR private subnets starting with "100.". Subnet IDs where the nodes/node groups will be provisioned
       subnet_ids = compact([for subnet_id, cidr_block in zipmap(module.vpc.private_subnets, module.vpc.private_subnets_cidr_blocks) : substr(cidr_block, 0, 4) == "100." ? subnet_id : null])
 
-      min_size     = 4
-      max_size     = 8
-      desired_size = 4
+      min_size     = 1
+      max_size     = 2
+      desired_size = 1
 
       instance_types = ["m5.xlarge"]
  • variables.tf
--- a/analytics/terraform/superset-on-eks/variables.tf
+++ b/analytics/terraform/superset-on-eks/variables.tf
@@ -7,12 +7,12 @@ variable "name" {
 variable "region" {
   description = "Region"
   type        = string
-  default     = "us-east-1"
+  default     = "us-east-2"
 }
 
 variable "eks_cluster_version" {
   description = "EKS Cluster version"
-  default     = "1.29"
+  default     = "1.32"
   type        = string
 }

事前の準備が整いましたので、続いてデプロイ作業に入ります。

インストール用のシェルスクリプトも用意されていますが、本稿では Terraform がモジュールごとに分かれているので段階的に実行していきます。

# backend に S3 を設定したので、再度初期化
$ terraform init
Initializing the backend...

Successfully configured the backend "s3"! Terraform will automatically
use this backend unless the backend configuration changes.
Initializing modules...
...
Terraform has been successfully initialized!
...

# VPC のデプロイ
$ terraform apply -target=module.vpc -auto-approve
...
Apply complete! Resources: 24 added, 0 changed, 0 destroyed.

# EKS のデプロイ
$ terraform apply -target=module.eks -auto-approve
...
Apply complete! Resources: 41 added, 0 changed, 0 destroyed.

# EKS addons のデプロイ
$ terraform apply -target=module.eks_blueprints_addons -auto-approve
...
Apply complete! Resources: 12 added, 0 changed, 0 destroyed.

# Terraform から Helm を使った Superset のデプロイ
$ terraform apply -auto-approve
...
Apply complete! Resources: 7 added, 0 changed, 0 destroyed.

Outputs:

configure_kubectl = "aws eks --region us-east-2 update-kubeconfig --name superset-on-eks"
superset_url = <<EOT
  kubectl get ingress  -n superset -o json | jq -r '"http://" + .items[0].status.loadBalancer.ingress[0].hostname'

EOT

以下はデプロイの際の目安時間です。

  • module.vpc : 3 分
  • module.eks : 12 分
  • module.eks_blueprints_addons : 2 分
  • helm with Superset:4 分

また、以下は今回 git clone / terraform init した際のコード等のファイル容量です。 意外と多いので、CloudShellなど、環境によっては気を付けてください。

# git clone の結果
$ du -ms data-on-eks/
426     data-on-eks/

$ terraform init の結果
$ du -ms .terraform/*
21      .terraform/modules
824     .terraform/providers

アクセス確認

デプロイしたSupersetにアクセスします。 デプロイしたコマンド結果の最後に出力されたコマンドを実行し、アクセスURLを取得します。

# EKS アクセス情報取得
$ aws eks --region us-east-2 update-kubeconfig --name superset-on-eks
Updated context arn:aws:eks:us-east-2:086997486593:cluster/superset-on-eks in /home/cloudshell-user/.kube/config

# Superset アクセス URL の取得
$ kubectl get ingress  -n superset -o json | jq -r '"http://" + .items[0].status.loadBalancer.ingress[0].hostname'
http://k8s-superset-superset-acd1ac03e7-1674912848.us-east-2.elb.amazonaws.com

初期ユーザー、パスワードは values.yaml に記載されています。

  • init.AdminUser.username / init.AdminUser.password

おわりに

今回は EKS 上に Superset を構築してみました。

今回の手順では terraform を段階的に実行しましたが、本来であればシェルスクリプトを1つ実行するだけで環境が整うのは非常に快適でした。

既にデータ探索や可視化に Superset を利用されている方はもちろん、その高いカスタマイズ性に関心をお持ちの方にも、今回の構築が参考になればと思います。

お知らせ

APCはAWS Advanced Tier Services(アドバンストティアサービスパートナー)認定を受けております。

その中で私達クラウド事業部はAWSなどのクラウド技術を活用したSI/SESのご支援をしております。

www.ap-com.co.jp

また、AWSの運用自動化ツールも展開しております。

www.ap-com.co.jp

一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp

本記事の投稿者: t-umemoto
コンテナや k8s をメインにインフラ系のご支援を担当しています。
AWS は現在学び直し中! 普段は QiitaZenn に k8s を中心とした記事を投稿しております。よろしければ。

本ブログで利用している一部の画像は、Apache License 2.0 の下で提供されています。