Veri Bilimi Okulu

Apache Spark ile AWS RDS Veritabanına Bastion Host Üzerinden SSH Tunnel Kurarak Bağlanmak
Apache Spark ile AWS RDS Veritabanına Bastion Host Üzerinden SSH Tunnel Kurarak Bağlanmak
apache_hudi_960x640_kapak

Loading

Giriş

Veri mühendisliği projelerinde, özellikle kurumsal ortamlarda canlı veriye doğrudan erişim yerine bastion host gibi geçit sunucuları üzerinden güvenli bağlantılar tercih edilir. Bu yazıda, bir SSH Tunnel yardımıyla lokalde çalışan Apache Spark ile AWS RDS veritabanına nasıl erişebileceğinizi adım adım göstereceğim.

Bastion Host Nedir?

Bastion host, bir diz üstü bilgisayarınız veya internete açık bir cihaz ile özel ağınız arasında bir bekçi (gatekeeper) rolü oynayan özel bir bilgisayardır. Dahili ağ ve barındırılan hizmetler tarafından internet trafiğinin potansiyel olarak engellenmesi nedeniyle, SSH bu hizmetlere erişmenin tek yolu olabilir. Bastion host, cihazınız ile bağlanmak istediğiniz ağ arasında bir köprü oluşturur. Bu köprüyü kullanarak yalnızca yetkili kullanıcılar bu özel ağdaki diğer bilgisayarlara erişebilir. Bu, iş ağınıza yetkisiz erişimi önleyerek bilgisayar korsanlarının kaynaklarınıza ve hassas verilerinize erişmesini engeller.

Bastion host ayrıca, fiziksel ofisinizin dışındaki çeşitli konumlardan iş kaynaklarınıza erişmesi gereken uzak çalışanlarınız varsa ek bir güvenlik katmanı sağlar. Ek olarak, bastion ana bilgisayarlarının bulunduğu özel ağlar, coğrafi olarak ayrılmış şubeleri merkezinize bağlayabilir. Bu, şubeler arasında güvenli iletişim ve paylaşılan kaynaklara erişim sağlar.

Neden SSH Tunnel Kullanılır?

Bastion host kullanımının tipik bir örneği: AWS RDS gibi veritabanları genellikle VPC içinde ve dış dünyaya kapalı yapılandırılır. Bu nedenle doğrudan bağlantı mümkün olmayabilir. Ancak, VPC içinde konumlanan bir bastion host (genellikle bir EC2 makinesi) üzerinden bir SSH Tunnel kurarak, veritabanına yerel bilgisayarınızdan güvenli şekilde erişebilirsiniz.

Varsayımlar?

Spark kurulu bir ortamınız var. Ben spark 3.5.3 python 3.12 kullandım. Bir de Java 17.

Gerekli Kütüphaneler

İlk olarak Python tarafında şu kütüphaneleri yükleyelim:

pip install sshtunnel python-dotenv
  • sshtunnel: SSH üzerinden port yönlendirme işlemi yapmamıza yarar.
  • python-dotenv: Ortam değişkenlerini .env dosyasından çekmek için kullanılır.

Ortam Değişkenlerini .env Dosyasına Yazın

BASTION_HOST=ec2-user@bastion-host.ec2.amazonaws.com
BASTION_USER=ec2-user
SSH_KEY_PATH=/Users/kullanici/.ssh/key.pem

RDS_HOST=database-instance.rds.amazonaws.com
RDS_PORT=5432
RDS_USER=db_user
RDS_PASSWORD=db_password
RDS_DB=my_database
TABLE_NAME=my_table

.env dosyasını .gitignore içine mutlaka ekleyin:

echo ".env" >> .gitignore

Spark ile Veritabanına Bağlanma Kodu

Aşağıdaki Python kodu ile Spark üzerinden veritabanına bağlanıp veri okuyabilirsiniz:

sshtunnel import SSHTunnelForwarder
from pyspark.sql import SparkSession
from dotenv import load_dotenv
import os

# .env dosyasını yükle
load_dotenv()

# Ortam değişkenlerini al
bastion_host = os.getenv('BASTION_HOST')
bastion_user = os.getenv('BASTION_USER')
ssh_key_path = os.getenv('SSH_KEY_PATH')

rds_host = os.getenv('RDS_HOST')
rds_port = int(os.getenv('RDS_PORT', '5432'))
rds_user = os.getenv('RDS_USER')
rds_password = os.getenv('RDS_PASSWORD')
rds_db = os.getenv('RDS_DB')
table_name = os.getenv('TABLE_NAME')

# SSH Tunnel oluştur
tunnel = SSHTunnelForwarder(
    (bastion_host.split('@')[1], 22),
    ssh_username=bastion_user,
    ssh_private_key=ssh_key_path,
    remote_bind_address=(rds_host, rds_port),
    local_bind_address=('localhost', 0)
)

tunnel.start()

# JDBC bağlantı URL'si
jdbc_url = f"jdbc:postgresql://localhost:{tunnel.local_bind_port}/{rds_db}"

# Spark session başlat
spark = SparkSession.builder \
    .appName("RDSBaglanti") \
    .getOrCreate()

# Veriyi oku
df = spark.read \
    .format("jdbc") \
    .option("url", jdbc_url) \
    .option("dbtable", table_name) \
    .option("user", rds_user) \
    .option("password", rds_password) \
    .option("driver", "org.postgresql.Driver") \
    .load()

df.show()

# SSH Tunnel kapat
tunnel.stop()

PostgreSQL kullanıyorsanız Spark ile birlikte PostgreSQL JDBC sürücüsünü indirip eklemeyi unutmayın: https://jdbc.postgresql.org/download/

Tavsiyeler

  • Şifre ve anahtar gibi bilgileri .env dosyasında saklayın, kod içine yazmayın.
  • .env dosyasını .gitignore içine eklemeyi unutmayın.
  • Canlı ortamlarda parola ve şifreleri AWS Secrets Manager’da saklayın.
  • try...finally blokları kullanarak tunnel.stop() iş bitince tünel bağlantısını kapatın.

Sonuç

Bu yazıda Apache Spark kullanarak bastion host üzerinden bir SSH Tunnel kurup AWS RDS veritabanına güvenli şekilde nasıl bağlanabileceğinizin örneğini gördük. Bu yöntemle, doğrudan erişime kapalı veritabanlarına güvenli bağlantılar kurabilir, Spark ile büyük veriler üzerinde çalışabilirsiniz.

Bir sonraki yazıda görüşünceye dek hoşça kalın…

Kaynaklar

0

Bir yanıt yazın

Password Requirements:

  • At least 8 characters
  • At least 1 lowercase letter
  • At least 1 uppercase letter
  • At least 1 numerical number
  • At least 1 special character