この記事ではAWS上でNeo4jを構築し、Neo4jのグラフデータベースを操作するためのGUIであるNeo4j Browserを表示するところまでをご紹介いたします。
Neo4jについて
Neo4jはJavaベースの組み込み型のグラフデータベースエンジンでスウェーデンのNeo Technologyが提供するオープンソースソフトウェアです。
Neo4jはJavaベースのため、Javaの実行環境が必要になります。
前提条件
本記事を進めるにあたり、以下の環境が整っていることを前提とします。
- AWSアカウントの取得済み
- AWS CLIの設定済み
- Terraformのインストール済み
- Terraformの基本的な知識
構築するアーキテクチャ
今回構築する環境と構成図は以下の通りです。
- VPC : 独立したネットワーク環境
- パブリックサブネット : インターネットからアクセス可能なサブネット
- インターネットゲートウェイ : インターネット接続用
- セキュリティグループ : Neo4j用ポート(7474、7687)を開放
- EC2インスタンス : Amazon Linux 2023でNeo4jを実行
- IAMロール : Systems Manager接続用

Terraformソースコード
以下が全体のソースコードです。
provider "aws" provider "aws" {
region = "ap-northeast-1"
access_key = "YOUR_ACCESS_KEY"
secret_key = "YOUR_SECRET_KEY"
}
terraform {
backend "s3" {
bucket = "{tfstate管理用S3バケット名}"
region = "ap-northeast-1"
key = "neo4j.terraform.tfstate"
encrypt = true
}
}
# vpc
resource "aws_vpc" "this" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "neo4j-test-vpc"
}
}
# subnet
# 今回はあくまで構築検証のため、パブリックサブネットにNeo4jを構築します。
resource "aws_subnet" "public" {
vpc_id = aws_vpc.this.id
cidr_block = "10.0.1.0/24"
availability_zone = "ap-northeast-1a"
tags = {
Name = "neo4j-test-public-subnet"
}
}
# internet gateway
resource "aws_internet_gateway" "this" {
vpc_id = aws_vpc.this.id
tags = {
Name = "neo4-test-igw"
}
}
# route table
resource "aws_route_table" "public" {
vpc_id = aws_vpc.this.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.this.id
}
tags = {
Name = "neo4-test-public-rtb"
}
}
resource "aws_route_table_association" "public" {
subnet_id = aws_subnet.public.id
route_table_id = aws_route_table.public.id
}
# security group
resource "aws_security_group" "neo4j_sg" {
name = "neo4-test-sg"
description = "neo4 test security group"
vpc_id = aws_vpc.this.id
# Neo4jのデフォルトHTTPポート
# 実際は詳細のIPアドレスを設定してください。
ingress {
from_port = 7474
to_port = 7474
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
# Boltプロトコルポート
# 実際は詳細のIPアドレスを設定してください。
ingress {
from_port = 7687
to_port = 7687
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "neo4-test-sg"
}
}
# ec2用IAMロール
resource "aws_iam_role" "this" {
name = "neo4j-test-role"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Action = "sts:AssumeRole"
Effect = "Allow"
Principal = {
Service = "ec2.amazonaws.com"
}
}
]
}
)}
# ec2用IAMポリシー
resource "aws_iam_policy" "this" {
name = "neo4j-test-policy"
description = "neo4j test policy"
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Action = [
"s3:ListBucket",
"s3:GetObject",
]
Effect = "Allow"
Resource = "*"
}
]
}
)}
# 作成したIAMポリシーをアタッチ
resource "aws_iam_role_policy_attachment" "this" {
role = aws_iam_role.this.name
policy_arn = aws_iam_policy.this.arn
}
# SSM用のマネージドポリシーをアタッチ
resource "aws_iam_role_policy_attachment" "ssm_managed_instance_core" {
role = aws_iam_role.this.name
policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
}
# instance profile
resource "aws_iam_instance_profile" "this" {
name = "neo4j-test-instance-profile"
role = aws_iam_role.this.name
}
# ec2
resource "aws_instance" "this" {
ami = "ami-xxxxxxxxxxxx"
associate_public_ip_address = true
instance_type = "t3.medium"
iam_instance_profile = aws_iam_instance_profile.this.name
vpc_security_group_ids = [
aws_security_group.neo4j_sg.id
]
subnet_id = aws_subnet.public.id
user_data = <<-EOF
#!/bin/bash
yum update -y
# Java 21のインストール
yum install -y java-21-amazon-corretto
# Neo4jのインストール
cd /tmp
wget https://dist.neo4j.org/neo4j-community-5.26.4-unix.tar.gz
tar -xzf neo4j-community-5.26.4-unix.tar.gz
mv neo4j-community-5.26.4 /opt/neo4j
# 設定ファイル編集
sed -i 's/#server.default_listen_address=0.0.0.0/server.default_listen_address=0.0.0.0/' /opt/neo4j/conf/neo4j.conf
# neo4jユーザー作成
useradd -r -s /bin/false neo4j
chown -R neo4j:neo4j /opt/neo4j
# systemdサービス作成
cat > /etc/systemd/system/neo4j.service << 'EOL'
[Unit]
Description=Neo4j Graph Database
After=network-online.target
[Service]
ExecStart=/opt/neo4j/bin/neo4j
consoleRestart=on-failure
User=neo4jGroup=neo4j
Environment=NEO4J_HOME=/opt/neo4j
[Install]
WantedBy=multi-user.target
EOL
# サービス開始
systemctl daemon-reload
systemctl enable neo4j
systemctl start neo4j
# 初期パスワード設定
sleep 15
sudo -u neo4j /opt/neo4j/bin/neo4j-admin dbms set-initial-password "neo4j123"
systemctl restart neo4jecho "Neo4j installation completed." > /var/log/neo4j-install.log
EOF
tags = {
Name = "neo4-test-server"
}
}
# パブリックIPアドレスを出力
output "neo4j_public_ip" {
value = aws_instance.this.public_ip
description = "Neo4j server public IP address"
}
output "neo4j_url" {
value = "http://${aws_instance.this.public_ip}:7474"
description = "Neo4j Browser URL"
}
デプロイ手順
1. 事前準備
まず、Terraformの状態管理用S3バケットを作成します。
# S3バケット作成(バケット名は一意である必要があります)
aws s3 mb s3://your-terraform-state-bucket --region ap-northeast-1
Terraformファイルの以下の部分に、取得済みのAWSアクセスキーを設定してください。
provider "aws" {
region = "ap-northeast-1"
access_key = "YOUR_ACCESS_KEY" # ← ここに実際のアクセスキーIDを設定
secret_key = "YOUR_SECRET_KEY" # ← ここに実際のシークレットアクセスキーを設定
}
2. Terraformファイルの準備
上記のTerraformコードをneo4j.tfとして保存し、以下の値を環境に合わせて変更してください。
- bucket : S3バケット名を実際の名前に変更
- ami : 使用するリージョンの最新Amazon Linux 2023 AMI IDに変更
3. Terraformの実行
# 初期化
terraform init
# 実行計画の確認
terraform plan
# リソースの作成
terraform apply
terraform apply実行時に yes と入力してデプロイを開始します。
4. デプロイ完了の確認
デプロイが完了すると、以下のような出力が表示されます:
Outputs:
neo4j_public_ip = "xx.xx.xx.xx"
neo4j_url = "http://xx.xx.xx.xx:7474"
5. Neo4j Browserへのアクセス
- 待機時間 : インスタンス起動後、Neo4jのインストールに約5~10分かかります。
- アクセス : 出力されたURLをブラウザで開きます。
- ログイン情報 :
- ユーザー名 : neo4j
- パスワード : neo4j123
6. 動作確認
Neo4j Browserにログイン後、以下のCypherクエリでサンプルデータを作成できます。
CREATE (alice:Person {name: 'Alice'})-[:KNOWS]->(bob:Person {name: 'Bob'})RETURN alice, bob
7. リソースの削除
検証完了後は、以下のコマンドでリソースを削除してください。
terraform destroy
注意事項
- インスタンス起動直後はNeo4jがまだインストール中の可能性があります。
- アクセスできない場合は5~10分待ってから再試行してください。
- 本番環境ではセキュリティグループの設定を適切に制限してください。
まとめ
本記事では、TerraformとAWSを使用してNeo4jグラフデータベースを構築する手順をご紹介しました。
この記事が、Neo4jやAWSインフラ構築に興味を持つ方々の参考になれば幸いです。

