CSV içerikleri ayrıştırıp DynamoDB’ye aktarın(AWS CDK ve Lambda ile)

Burak Koz
blutv
Published in
3 min readNov 8, 2021

Merhabalar, bu yazımda sizlere AWS Cloud Development Kit kullanarak S3’e yüklenen CSV dosyasını DynamoDB’ye yazdıracak Lambda fonksiyonunu göstereceğim.

AWS CDK nedir? Neden kullanmalıyız?

AWS Cloud Development Kit, bulut altyapısını tanıdık programlama dilleriyle kod olarak modelleyip dağıtmanıza yarayan yazılım geliştirme framework’udur. AWS CDK özelleştirilebilir ve yeniden kullanılabilirdir.

Geliştirme ortamı için CLI, CDK ve Python’u yüklemelisiniz

AWS CLI’yı yükleyelim

AWS CLI’yı IAM kimlik bilgilerini yapılandıralım

AWS CDK’yi yükleyelim

Bu projede Python tercih ettiğim için Python geliştirme ortamı oluşturmanız gerekiyor. Eğer farklı bir dil ile geliştirme yapacaksanız, ilgili dilin geliştirme ortamını oluşturmalısınız.

CDK uygulaması oluşturalım

$ mkdir csv-reader && cd csv-reader$ cdk init app --language=python

Şimdi csv-reader dizininin içine lambda adında bir klasör oluşturuyoruz ve lambda dizininin içine csvreader.py adında bir Python dosyası oluşturuyoruz. Aşağıdaki gibi bir dizin yapısına sahip olmalısınız.

virtualenv’i oluşturmak için aşağıdaki komutu yazalım.

$ python3 -m venv .venv

Linux veya MacOS kullanıyorsanız virtualenv etkinleştirmek için

$ source .venv/bin/activate

Proje için gerekli bazı kütüphaneleri requirements.txt dosyası içine ekleyelim.

aws_cdk.coreaws_cdk.aws_s3aws_cdk.aws_s3_notificationsaws_cdk.aws_lambdaaws_cdk.aws_dynamodbaws_cdk.aws_iam

Ekledikten sonra gereksinimleri indirmek için aşağıdaki komutu çalıştıralım.

$ pip install -r requirements.txt

Lambda fonksiyonu, S3 Bucket ve DynamoDB oluşturalım

Projemiz S3 bucket’ına bir CSV dosyası atıldığında, Lambda fonksiyonu tetiklenir ve dosya içeriğini DynamoDB’ye yazar.

role = iam.Role(self, "LambdaRole",assumed_by=iam.ServicePrincipal("lambda.amazonaws.com"))role.add_managed_policy(iam.ManagedPolicy.from_aws_managed_policy_name("AmazonS3FullAccess"))role.add_managed_policy(iam.ManagedPolicy.from_aws_managed_policy_name("AmazonDynamoDBFullAccess"))

Lambda için IAM rolü oluşturuyoruz ve Lambda’nın ihtiyacı olan yetkileri ekliyoruz.

bucket = s3.Bucket(self, 'bucket',removal_policy=cdk.RemovalPolicy.DESTROY,auto_delete_objects=True)

S3 bucket’i oluşturuyoruz. Bucket’ı oluştururken auto_delete_objects=True kodunu kullanmazsanız CDK’i destroy ettiğiniz zaman S3 Bucket’ını silmeyecektir.

table = dynamodb.Table(self, "Table",table_name='csvTable',removal_policy=cdk.RemovalPolicy.DESTROY,partition_key=dynamodb.Attribute(name="id", type=dynamodb.AttributeType.STRING))

Bu kod bloğu ile DynamoDB table olıuşturuyoruz ve tablonun ismini ‘csvTable’ olarak giriyoruz. Eğer removal_policy=cdk.RemovalPolicy.DESTROY kodunu kullanmazsanız, destroy ettiğiniz zaman tablo silinmeyecektir.

lambda_func = _lambda.Function(self, 'csvreader',runtime=_lambda.Runtime.PYTHON_3_8,handler='csvreader.handler',role=role,code=_lambda.Code.asset('lambda'),environment={'BUCKET_NAME':bucket.bucket_name})

Bu kod bloğu Lambda fonksiyonunu oluşturacak.

notification = s3_notify.LambdaDestination(lambda_func)notification.bind(self, bucket)bucket.add_object_created_notification(notification, s3.NotificationKeyFilter(suffix='.csv'))

Bu kod bloğu bir CSV dosyası atıldığında S3 Bucket’ini dinleyecek ve Lambda fonksiyonun tetiklenmesini sağlayacaktır. Yukarıda adım adım oluşturduğumuz kod bloğunu tamamını aşağıda bulabilirsiniz.

Oluşturmuş olduğumuz lambda klasörünün içindeki csvreader.py dosyasına aşağıdaki kod bloğunu yapıştırıyoruz.

Projeyi AWS üzerinde görmek için deploy edelim

csv-reader dizinine gelip aşağıdaki komutu yazalım.

$ cdk deploy

Deploy tamamlandığı zaman aşağıdaki gibi bir şey görmelisiniz.

✅ CdkLambdaStack ARN:arn:aws: cloudformation :<region>:<acc-id>:stack/csvreader

Şimdi oluşmuş olan S3 bucket’ına CSV dosyası yüklediğiniz zaman, DynamoDB’ye datanın eklenmiş olduğunu göreceğiz.

Sonuç

Tüm bu projeyi elle yapılandırarak çalışır hale getirebilirdik fakat IaC yaklaşımını kullanarak daha modern, gözlemlenebilir ve tekrar kullanılabilir bir altyapı geliştirmiş olduk. Bu şekilde AWS CDK’in geliştiricilerin hayatını ne kadar kolaylaştırdığını örnek bir proje üzerinden gözlemledik.

Projeye ait github linkine aşağıdan ulaşabilirsiniz.

--

--