はじめに
こんにちは、クラウド事業部の梅本です。
今回は、オープンソースのデータ探索・可視化プラットフォーム、Apache Superset を EKS(Elastic Kubernetes Service)上に構築します。
Apache Superset は、直感的な操作でグラフやダッシュボードを容易に作成できる点が大きな特長です。私自身、日々の業務におけるCSVデータの可視化や、ちょっとしたデータ探索に活用しており、その手軽さと機能性に助けられています。また、多様なデータソースに対応するための豊富なドライバが用意されているため、様々な環境のデータとも柔軟に連携が可能です。
AWS のマネージド BI ツールである Amazon QuickSight も有力な選択肢の一つですが、OSS である Superset は、その自由度の高さと特定のニーズに合わせたカスタマイズ性において強みを発揮します。
Amazon QuickSight については、弊社のブログでもご紹介しておりますので、ぜひ併せてご覧ください。
CloudShell
今回は、以下のサイトを参考に EKS へ Apache Superset をデプロイします。
GitHub リポジトリはこちらです。
このリポジトリでは、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 のインストール手順については、以下の記事を参考にさせていただきました。
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のご支援をしております。
また、AWSの運用自動化ツールも展開しております。
一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。
本ブログで利用している一部の画像は、Apache License 2.0 の下で提供されています。