業界・業務から探す
導入目的・課題から探す
データ・AIについて学ぶ
News
Hakkyについて
ウェビナーコラム
◆トップ【データ基盤】
データハブとは
Ajust
データの保守運用
AI

執筆者:Handbook編集部

EKSでDataHubを実行する方法【Terraformでの実装付】

この記事では、オープンソースのモダンなデータカタログのDataHubを EKS で実行する方法について紹介します。環境構築は Terraform で行います。

構成

この記事で作成する環境です。
以下のDocker Imageを使用して EKS タスクを実行することで、DataHub をサービングします。

  • acryldata/datahub-ingestion
  • acryldata/datahub-gms
  • acryldata/datahub-frontend-react
  • acryldata/datahub-mae-consumer
  • acryldata/datahub-mce-consumer
  • acryldata/datahub-upgrade
  • acryldata/datahub-kafka-setup
  • acryldata/datahub-elasticsearch-setup
  • acryldata/datahub-mysql-setup
  • acryldata/datahub-postgres-setup
  • acryldata/datahub-actions

Terraform でのインフラ環境構築

まず、terraform を使用して、環境構築を行います。

ここで構築するリソースは下記の通りです。 コード中のvar.xxxは適宜設定してください。

  • VPC
  • EKS クラスター
  • EKS 用 IAM ロール
  • helm chart

VPC

module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "~> 5.0"

  name = "${var.name_prefix}-${var.organization}-${var.env}"
  cidr = var.vpc_cidr

  azs             = ["${var.region}a", "${var.region}c"]
  private_subnets = var.private_subnet_cidrs
  public_subnets  = var.public_subnet_cidrs

  enable_nat_gateway   = true
  single_nat_gateway   = true
  enable_dns_hostnames = true

  public_subnet_tags = {
    "kubernetes.io/role/elb" = 1
  }

  private_subnet_tags = {
    "kubernetes.io/role/internal-elb" = 1
  }
}

IAM

resource "aws_iam_role" "eks_cluster_role" {
  name = "${var.organization}-${var.env}-eks-cluster-role"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Principal = {
          Service = "eks.amazonaws.com"
        }
        Effect = "Allow"
        Sid    = ""
      },
    ]
  })
}

resource "aws_iam_policy_attachment" "eks_cluster_policy_attachment" {
  name = "${var.organization}-${var.env}-eks-cluster-policy-attachment"
  roles = [aws_iam_role.eks_cluster_role.name]
  policy_arn = "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy"
}

data "aws_iam_policy" "ebs_csi_policy" {
  arn = "arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy"
}

EKS

module "eks" {
  source  = "terraform-aws-modules/eks/aws"
  version = "~> 20.0"

  cluster_name    = "${var.name_prefix}-${var.organization}-${var.env}"
  cluster_version = var.eks_version

  cluster_endpoint_public_access           = true
  enable_cluster_creator_admin_permissions = true

  vpc_id                   = module.vpc.vpc_id
  subnet_ids               = module.vpc.private_subnets

  cluster_addons = {
    coredns = {
      most_recent = true
    }
    kube-proxy = {
      most_recent = true
    }
    aws-ebs-csi-driver = {
      most_recent              = true
      service_account_role_arn = module.irsa-ebs-csi.iam_role_arn
      configuration_values = jsonencode({
        defaultStorageClass  = {
          enabled = true
        }
      })
    }
    vpc-cni = {
      most_recent    = true
      before_compute = true
      configuration_values = jsonencode({
        env = {
          // must enable this if pod is running in private subnet and access going out via nat gateway
          AWS_VPC_K8S_CNI_EXTERNALSNAT = "true"

          # Reference docs https://docs.aws.amazon.com/eks/latest/userguide/cni-increase-ip-addresses.html
          ENABLE_PREFIX_DELEGATION = "true"
          WARM_PREFIX_TARGET       = "1"
        }
      })
    }
  }

  eks_managed_node_groups = {
    standard = {
      min_size     = 3
      max_size     = 5
      desired_size = 3

      instance_types = ["m5.large"]
    }
  }
  depends_on = [module.vpc]
}

module "irsa-ebs-csi" {
  source  = "terraform-aws-modules/iam/aws//modules/iam-assumable-role-with-oidc"
  version = "~> 5.0"

  create_role                   = true
  role_name                     = "AmazonEKSTFEBSCSIRole-${module.eks.cluster_name}"
  provider_url                  = module.eks.oidc_provider
  role_policy_arns              = [data.aws_iam_policy.ebs_csi_policy.arn]
  oidc_fully_qualified_subjects = ["system:serviceaccount:kube-system:ebs-csi-controller-sa"]
}

# kubeconfigの更新
resource "null_resource" "update_kubeconfig" {
  depends_on = [module.eks]

  provisioner "local-exec" {
    command = <<EOF
      aws eks update-kubeconfig --name ${module.eks.cluster_name} --region ${var.region} --kubeconfig ~/.kube/config
    EOF
  }
}

# `kubernetes_secret`だと動作が不安定なためコマンドで実行
resource "null_resource" "add_secret" {
  depends_on = [null_resource.update_kubeconfig]

  provisioner "local-exec" {
    command = <<EOF
      kubectl create secret generic mysql-secrets --from-literal=mysql-root-password=datahub
      kubectl create secret generic neo4j-secrets --from-literal=neo4j-password=datahub
    EOF
  }
}

helm

resource "helm_release" "datahub_prerequisites" {
  name       = "prerequisites"

  repository = "https://helm.datahubproject.io/"
  chart      = "datahub-prerequisites"

  depends_on = [
    null_resource.add_secret,
  ]
}

resource "helm_release" "datahub" {
  name       = "datahub"
  repository = "https://helm.datahubproject.io/"
  chart      = "datahub"

  depends_on = [
    helm_release.datahub_prerequisites,
  ]
}

terraform apply して環境構築します。

DataHub 実行

以下のコマンドでFrontendのエンドポイントを確認します。

kubectl get svc

以下のような出力が得られるので、datahub-datahub-frontendのEXTERNAL-IPを使ってアクセスします。

NAME                                  TYPE           CLUSTER-IP       EXTERNAL-IP                                                                   PORT(S)                         AGE
datahub-acryl-datahub-actions         ClusterIP      xxx.xx.xx.xx     <none>                                                                        9093/TCP,8000/TCP               28m
datahub-datahub-frontend              LoadBalancer   xxx.xx.xx.xx     <lb_name>.<region>.elb.amazonaws.com   9002:30837/TCP,4318:30426/TCP   28m
datahub-datahub-gms                   LoadBalancer   xxx.xx.xx.xx     <lb_name>.<region>.elb.amazonaws.com   8080:30386/TCP,4318:31400/TCP   28m
elasticsearch-master                  ClusterIP      xxx.xx.xx.xx     <none>                                                                        9200/TCP,9300/TCP               34m
elasticsearch-master-headless         ClusterIP      None             <none>                                                                        9200/TCP,9300/TCP               34m
kubernetes                            ClusterIP      xxx.xx.xx.xx     <none>                                                                        443/TCP                         41m
prerequisites-cp-schema-registry      ClusterIP      xxx.xx.xx.xx     <none>                                                                        8081/TCP,5556/TCP               34m
prerequisites-kafka                   ClusterIP      xxx.xx.xx.xx     <none>                                                                        9092/TCP                        34m
prerequisites-kafka-broker-headless   ClusterIP      None             <none>                                                                        9094/TCP,9092/TCP               34m
prerequisites-mysql                   ClusterIP      xxx.xx.xx.xx     <none>                                                                        3306/TCP                        34m
prerequisites-mysql-headless          ClusterIP      None             <none>                                                                        3306/TCP                        34m
prerequisites-zookeeper               ClusterIP      xxx.xx.xx.xx     <none>                                                                        2181/TCP,2888/TCP,3888/TCP      34m
prerequisites-zookeeper-headless      ClusterIP      None             <none>                                                                        2181/TCP,2888/TCP,3888/TCP      34m
(datahub) ubuntu@ip-10-1-4-82:~/dev/proj-honda$

local環境のブラウザで http://<lb_name>.<region>.elb.amazonaws.com:9002 にアクセス。 ログイン画面で 以下をを入力しログイン。

Username: datahub
Password: datahub

まとめ

この記事では、DataHub を EKS で実行する方法について紹介しました。

参考

info
備考

Hakky ではエンジニアを募集中です!まずは話してみたいなどでも構いませんので、ぜひお気軽に採用ページからお問い合わせくださいませ。

2025年07月04日に最終更新
読み込み中...