
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ı kullanaraktunnel.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
- Kapak Görseli: Photo by Adam Bignell on Unsplash