{"id":32764,"date":"2025-10-25T18:31:43","date_gmt":"2025-10-25T15:31:43","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/neden-aws-lambda-ve-puppeteer-ile-pdf-olusturmaliyiz\/"},"modified":"2025-10-25T18:31:43","modified_gmt":"2025-10-25T15:31:43","slug":"neden-aws-lambda-ve-puppeteer-ile-pdf-olusturmaliyiz","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/neden-aws-lambda-ve-puppeteer-ile-pdf-olusturmaliyiz\/","title":{"rendered":"Neden AWS Lambda ve Puppeteer ile PDF Olu\u015fturmal\u0131y\u0131z?"},"content":{"rendered":"<p><em>AWS Lambda&#8217;da Puppeteer ile Dinamik PDF Olu\u015fturma<\/em><\/p>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn dijital d\u00fcnyas\u0131nda dinamik PDF belgeleri olu\u015fturmak, i\u015fletmeler i\u00e7in kritik bir ihtiya\u00e7 haline geldi. Faturalardan raporlara, sertifikalardan sipari\u015f \u00f6zetlerine kadar bir\u00e7ok belge, kullan\u0131c\u0131ya \u00f6zel olarak an\u0131nda \u00fcretilmek durumunda. Geleneksel y\u00f6ntemler genellikle y\u00fcksek maliyetli sunucu kurulumlar\u0131 ve karma\u015f\u0131k altyap\u0131 y\u00f6netimi gerektirirken, AWS Lambda ve Puppeteer ikilisi bu soruna sunucusuz ve \u00f6l\u00e7eklenebilir bir \u00e7\u00f6z\u00fcm sunuyor. Bu makalede, bu g\u00fc\u00e7l\u00fc kombinasyonu kullanarak nas\u0131l verimli bir PDF olu\u015fturma s\u00fcreci tasarlayabilece\u011finizi ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. \u0130ster yeni ba\u015flayan ister deneyimli bir geli\u015ftirici olun, AWS Lambda&#8217;n\u0131n sundu\u011fu esneklik ve Puppeteer&#8217;\u0131n web i\u00e7eri\u011fini PDF&#8217;e d\u00f6n\u00fc\u015ft\u00fcrme yetene\u011fi sayesinde, karma\u015f\u0131k belge olu\u015fturma s\u00fcre\u00e7lerinizi basitle\u015ftirecek ve otomatikle\u015ftireceksiniz.<\/p>\n<p>PDF olu\u015fturma s\u00fcre\u00e7leri, genellikle yaz\u0131l\u0131m geli\u015ftiricilerinin kar\u015f\u0131la\u015ft\u0131\u011f\u0131 zorlu ve zaman al\u0131c\u0131 g\u00f6revlerden biridir. Geleneksel yakla\u015f\u0131mlar, \u00f6zel sunucu kiralamay\u0131, bu sunuculara belirli k\u00fct\u00fcphaneleri (\u00f6rne\u011fin, headless taray\u0131c\u0131lar gibi) kurmay\u0131 ve s\u00fcrekli olarak bu altyap\u0131n\u0131n bak\u0131m\u0131n\u0131 yapmay\u0131 gerektirir. Bu durum, hem y\u00fcksek maliyetlere hem de \u00f6l\u00e7eklenebilirlik sorunlar\u0131na yol a\u00e7abilir. \u00d6zellikle yo\u011fun talep d\u00f6nemlerinde sunucular\u0131n yetersiz kalmas\u0131 veya aksine d\u00fc\u015f\u00fck talep d\u00f6nemlerinde gereksiz yere y\u00fcksek maliyetlerle \u00e7al\u0131\u015fmaya devam etmesi gibi dengesizlikler ya\u015fanabilir. Ayr\u0131ca, g\u00fcvenlik g\u00fcncellemeleri, i\u015fletim sistemi yamalar\u0131 ve k\u00fct\u00fcphane ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n y\u00f6netimi gibi operasyonel y\u00fckler, geli\u015ftirme ekibinin ana i\u015fine odaklanmas\u0131n\u0131 zorla\u015ft\u0131r\u0131r. \u0130\u015fte tam da bu noktada, sunucusuz mimarinin avantajlar\u0131 ve Puppeteer&#8217;\u0131n g\u00fcc\u00fc devreye giriyor.<\/p>\n<p>AWS Lambda, olay odakl\u0131, sunucusuz bir i\u015flem hizmetidir. Bu, kodunuzu herhangi bir sunucu sa\u011flama veya y\u00f6netme zorunlulu\u011fu olmadan \u00e7al\u0131\u015ft\u0131rman\u0131za olanak tan\u0131r. Yaln\u0131zca kodunuz \u00e7al\u0131\u015ft\u0131\u011f\u0131 s\u00fcrece \u00f6deme yapars\u0131n\u0131z, bu da maliyetleri \u00f6nemli \u00f6l\u00e7\u00fcde optimize eder. Anl\u0131k taleplere otomatik olarak yan\u0131t verebilir ve i\u015f y\u00fck\u00fcn\u00fcz artt\u0131k\u00e7a \u00f6l\u00e7eklenebilir. \u00d6rne\u011fin, ayda binlerce PDF olu\u015fturan bir uygulaman\u0131z varsa, Lambda bu talebi kar\u015f\u0131lamak i\u00e7in otomatik olarak birden fazla fonksiyon \u00f6rne\u011fini ayn\u0131 anda \u00e7al\u0131\u015ft\u0131rabilir. \u0130\u015f y\u00fck\u00fc azald\u0131\u011f\u0131nda ise gereksiz kaynaklar\u0131 kapatarak maliyet tasarrufu sa\u011flar. Bu esneklik, \u00f6zellikle dinamik ve de\u011fi\u015fken i\u015f y\u00fckleri olan uygulamalar i\u00e7in hayati \u00f6neme sahiptir.<\/p>\n<p>Di\u011fer yandan Puppeteer, Google Chrome veya Chromium&#8217;u programatik olarak kontrol etmek i\u00e7in bir Node.js k\u00fct\u00fcphanesidir. Geli\u015ftiricilerin, taray\u0131c\u0131da yap\u0131lan \u00e7o\u011fu i\u015flemi bir API arac\u0131l\u0131\u011f\u0131yla otomatikle\u015ftirmesine olanak tan\u0131r. En pop\u00fcler kullan\u0131m durumlar\u0131ndan biri, herhangi bir HTML sayfas\u0131n\u0131 veya dinamik olarak olu\u015fturulmu\u015f i\u00e7eri\u011fi y\u00fcksek kaliteli PDF belgesine d\u00f6n\u00fc\u015ft\u00fcrmektir. Puppeteer, CSS ve JavaScript kullanarak olu\u015fturulan karma\u015f\u0131k d\u00fczenleri, grafikleri ve etkile\u015fimleri aynen PDF&#8217;e aktarabilir, bu da onu geleneksel PDF k\u00fct\u00fcphanelerine k\u0131yasla \u00e7ok daha esnek ve g\u00fc\u00e7l\u00fc bir ara\u00e7 haline getirir. Geleneksel k\u00fct\u00fcphaneler genellikle CSS \u00f6zelliklerinde s\u0131n\u0131rlamalara sahipken veya JavaScript ile olu\u015fturulan dinamik i\u00e7eri\u011fi yorumlayamazken, Puppeteer ger\u00e7ek bir taray\u0131c\u0131 motoru kulland\u0131\u011f\u0131 i\u00e7in bu t\u00fcr k\u0131s\u0131tlamalara tak\u0131lmaz.<\/p>\n<p>Bu iki teknolojiyi bir araya getirdi\u011fimizde, olduk\u00e7a g\u00fc\u00e7l\u00fc ve verimli bir PDF olu\u015fturma \u00e7\u00f6z\u00fcm\u00fc elde ederiz. AWS Lambda, Puppeteer&#8217;\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in uygun maliyetli, y\u00f6netimi kolay ve \u00f6l\u00e7eklenebilir bir ortam sunar. B\u00f6ylece, kullan\u0131c\u0131lar veya sistemler taraf\u0131ndan tetiklenen olaylara (\u00f6rne\u011fin, bir S3 kovas\u0131na dosya y\u00fcklenmesi, bir API Gateway iste\u011fi veya bir mesaj kuyru\u011fundan gelen bildirim) yan\u0131t olarak otomatik olarak PDF&#8217;ler olu\u015fturabiliriz. Bu entegrasyon, yaln\u0131zca operasyonel y\u00fck\u00fc azaltmakla kalmaz, ayn\u0131 zamanda geli\u015ftiricilerin PDF olu\u015fturma mant\u0131\u011f\u0131na daha fazla odaklanmas\u0131na ve altyap\u0131 y\u00f6netimiyle daha az ilgilenmesine olanak tan\u0131r. Sonu\u00e7 olarak, y\u00fcksek performansl\u0131, uygun maliyetli ve s\u00fcrd\u00fcr\u00fclebilir bir PDF olu\u015fturma altyap\u0131s\u0131 kurmu\u015f oluruz.<\/p>\n<h2>AWS Lambda ve Puppeteer Nedir, Neden Birlikte Kullan\u0131l\u0131rlar?<\/h2>\n<p>Modern bulut mimarilerinde &#8220;sunucusuz&#8221; kavram\u0131, geli\u015ftiricilerin altyap\u0131 y\u00f6netimi y\u00fck\u00fcnden kurtulmas\u0131n\u0131 sa\u011flayarak uygulamalar\u0131n\u0131 daha h\u0131zl\u0131 ve verimli bir \u015fekilde da\u011f\u0131tmas\u0131na olanak tan\u0131r. AWS Lambda, bu sunucusuz felsefenin \u00f6nc\u00fclerinden biridir ve geli\u015ftiricilerin kodlar\u0131n\u0131 olaylara yan\u0131t olarak \u00e7al\u0131\u015ft\u0131ran fonksiyonlar olarak da\u011f\u0131tmalar\u0131n\u0131 sa\u011flar. Bir sunucu provision etme, g\u00fcncelleme veya \u00f6l\u00e7ekleme gibi klasik operasyonel g\u00f6revlerin tamam\u0131n\u0131 AWS \u00fcstlenir. Bu sayede, geli\u015ftiriciler sadece i\u015f mant\u0131\u011f\u0131na odaklanabilirler. Lambda&#8217;n\u0131n temel avantajlar\u0131 aras\u0131nda otomatik \u00f6l\u00e7eklendirme, y\u00fcksek kullan\u0131labilirlik, yerle\u015fik hata tolerans\u0131 ve kulland\u0131k\u00e7a \u00f6de modeli bulunur. Bu model, \u00f6zellikle PDF olu\u015fturma gibi belirli olaylara ba\u011fl\u0131 olarak tetiklenen ve yo\u011fun i\u015f y\u00fckleri olabilen g\u00f6revler i\u00e7in idealdir, \u00e7\u00fcnk\u00fc yaln\u0131zca fonksiyonun \u00e7al\u0131\u015ft\u0131\u011f\u0131 s\u00fcre boyunca maliyet olu\u015fur.<\/p>\n<p>\u00d6te yandan Puppeteer, Node.js ekosisteminde son derece pop\u00fcler bir k\u00fct\u00fcphanedir. Headless Chrome veya Chromium&#8217;u bir API arac\u0131l\u0131\u011f\u0131yla kontrol etme yetene\u011fi sunar. &#8220;Headless&#8221; terimi, taray\u0131c\u0131n\u0131n kullan\u0131c\u0131 aray\u00fcz\u00fc olmadan, yani arka planda \u00e7al\u0131\u015ft\u0131r\u0131labilece\u011fi anlam\u0131na gelir. Bu, taray\u0131c\u0131n\u0131n g\u00f6rsel olarak a\u00e7\u0131lmas\u0131na gerek kalmadan web sayfalar\u0131n\u0131n i\u00e7eri\u011fini i\u015flemek, ekran g\u00f6r\u00fcnt\u00fcleri almak, web sitelerini kaz\u0131mak (scraping) ve tabii ki dinamik HTML i\u00e7eri\u011finden y\u00fcksek kaliteli PDF&#8217;ler olu\u015fturmak i\u00e7in harika bir ara\u00e7 haline getirir. Puppeteer&#8217;\u0131n g\u00fcc\u00fc, ger\u00e7ek bir taray\u0131c\u0131 motoru kullanmas\u0131ndan gelir; bu sayede JavaScript ile olu\u015fturulan karma\u015f\u0131k dinamik i\u00e7erikler, CSS animasyonlar\u0131 veya \u00f6zel fontlar gibi \u00f6\u011feler bile PDF&#8217;e do\u011fru bir \u015fekilde aktar\u0131labilir. Geleneksel PDF k\u00fct\u00fcphanelerinin s\u0131k\u00e7a kar\u015f\u0131la\u015ft\u0131\u011f\u0131 font, layout veya CSS uyumlulu\u011fu sorunlar\u0131ndan b\u00fcy\u00fck \u00f6l\u00e7\u00fcde ka\u00e7\u0131n\u0131lm\u0131\u015f olur.<\/p>\n<p>Bu iki teknolojinin bir araya gelmesi, sinerjik bir etki yarat\u0131r. AWS Lambda, Puppeteer&#8217;\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gereken temel ortam\u0131 sa\u011flar. Puppeteer, bir Chromium \u00f6rne\u011fi gerektirdi\u011finden ve bu Chromium ikili dosyas\u0131n\u0131n boyutu standart Lambda paket boyut limitini a\u015fabilece\u011finden, \u00f6zel bir yakla\u015f\u0131m gereklidir. Genellikle, <code>chrome-aws-lambda<\/code> gibi optimize edilmi\u015f bir Chromium paketi kullan\u0131l\u0131r ve bu paket bir Lambda katman\u0131 (Lambda Layer) olarak da\u011f\u0131t\u0131l\u0131r. Lambda katmanlar\u0131, birden fazla fonksiyonda payla\u015f\u0131labilecek ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve \u00e7al\u0131\u015fma zaman\u0131 kodlar\u0131n\u0131 depolamak i\u00e7in kullan\u0131lan bir \u00f6zelliktir. Bu sayede, her Lambda fonksiyon paketine Chromium&#8217;u dahil etmek yerine, yaln\u0131zca bir kez da\u011f\u0131t\u0131lan bir katmandan yararlan\u0131l\u0131r, bu da fonksiyon paket boyutlar\u0131n\u0131 k\u00fc\u00e7\u00fclt\u00fcr ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini h\u0131zland\u0131r\u0131r.<\/p>\n<p>Birlikte kullan\u0131ld\u0131klar\u0131nda, AWS Lambda ve Puppeteer, \u015firketlerin ve geli\u015ftiricilerin belge olu\u015fturma s\u00fcre\u00e7lerini k\u00f6kten de\u011fi\u015ftirebilirler. \u00d6rne\u011fin, bir e-ticaret sitesi i\u00e7in her sipari\u015f verildi\u011finde otomatik olarak bir fatura veya sipari\u015f \u00f6zeti PDF&#8217;i olu\u015fturulabilir. Bir raporlama arac\u0131, belirli aral\u0131klarla dinamik verileri bir HTML \u015fablonuna i\u015fleyerek okunabilir ve yazd\u0131r\u0131labilir PDF raporlar\u0131 \u00fcretebilir. Bu \u00e7\u00f6z\u00fcm, y\u00fcksek trafikli senaryolarda bile performans\u0131 korur, \u00e7\u00fcnk\u00fc Lambda otomatik olarak \u00f6l\u00e7eklenir ve geleneksel sunucular\u0131n bak\u0131m maliyetleri veya \u00f6l\u00e7eklenebilirlik k\u0131s\u0131tlamalar\u0131 olmadan \u00e7al\u0131\u015f\u0131r. Bu kombinasyon, \u00f6zellikle maliyet etkinli\u011fi, bak\u0131m kolayl\u0131\u011f\u0131 ve y\u00fcksek \u00f6l\u00e7eklenebilirlik arayan projeler i\u00e7in vazge\u00e7ilmez bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<h2>Uygulamal\u0131 Ad\u0131mlar: AWS Lambda Fonksiyonu ile Puppeteer&#8217;\u0131 Nas\u0131l Entegre Ederiz?<\/h2>\n<p>AWS Lambda \u00fczerinde Puppeteer kullanarak PDF olu\u015fturmak, birka\u00e7 \u00f6nemli ad\u0131mda ger\u00e7ekle\u015ftirilen bir s\u00fcre\u00e7tir. Bu ad\u0131mlar, do\u011fru geli\u015ftirme ortam\u0131n\u0131 kurmaktan, Puppeteer ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00f6netmeye ve nihayetinde Lambda fonksiyonunu da\u011f\u0131tmaya kadar uzan\u0131r. A\u015fa\u011f\u0131da bu s\u00fcreci ad\u0131m ad\u0131m inceleyece\u011fiz.<\/p>\n<h3>Ad\u0131m 1: Geli\u015ftirme Ortam\u0131n\u0131n Haz\u0131rlanmas\u0131<\/h3>\n<p>\u00d6ncelikle, Node.js ve npm (veya yarn) kurulu olmal\u0131d\u0131r. Ayr\u0131ca, AWS CLI&#8217;ya ve Serverless Framework veya AWS SAM CLI&#8217;ya ihtiyac\u0131m\u0131z olacak. Bu ara\u00e7lar, Lambda fonksiyonlar\u0131m\u0131z\u0131 yerel olarak test etmemize ve buluta da\u011f\u0131tmam\u0131za yard\u0131mc\u0131 olur.<\/p>\n<pre><code class=\"language-bash\">\n# Node.js ve npm kurulu oldu\u011fundan emin olun\nnode -v\nnpm -v\n\n# AWS CLI'yi kurun ve yap\u0131land\u0131r\u0131n\npip install awscli\naws configure # AWS eri\u015fim anahtarlar\u0131n\u0131z\u0131 buraya girin\n\n# Serverless Framework veya AWS SAM CLI'y\u0131 kurun\nnpm install -g serverless\n# veya\npip install aws-sam-cli\n<\/pre>\n<p><\/code><\/p>\n<h3>Ad\u0131m 2: Proje Yap\u0131s\u0131n\u0131n Olu\u015fturulmas\u0131 ve Puppeteer Ba\u011f\u0131ml\u0131l\u0131klar\u0131<\/h3>\n<p>Puppeteer, bir Chromium taray\u0131c\u0131 ikilisine ihtiya\u00e7 duyar. Standart Puppeteer paketi, t\u00fcm Chromium ikilisini i\u00e7erdi\u011fi i\u00e7in olduk\u00e7a b\u00fcy\u00fckt\u00fcr ve bu, Lambda'n\u0131n paket boyut limitini (s\u0131k\u0131\u015ft\u0131r\u0131lm\u0131\u015f 50MB, s\u0131k\u0131\u015ft\u0131r\u0131lmam\u0131\u015f 250MB) a\u015fabilir. Bu nedenle, <code>chrome-aws-lambda<\/code> gibi hafifletilmi\u015f bir Chromium paketi kullanmak yayg\u0131n bir \u00e7\u00f6z\u00fcmd\u00fcr. Bu paket, Lambda ortam\u0131nda \u00e7al\u0131\u015fmak \u00fczere optimize edilmi\u015ftir.<\/p>\n<p>Yeni bir Node.js projesi olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-bash\">\nmkdir pdf-generator\ncd pdf-generator\nnpm init -y\n<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 kural\u0131m. <code>puppeteer-core<\/code> paketi, <code>puppeteer<\/code>'\u0131n taray\u0131c\u0131 indirme mant\u0131\u011f\u0131 olmayan s\u00fcr\u00fcm\u00fcd\u00fcr. <code>chrome-aws-lambda<\/code> ise Lambda ortam\u0131nda \u00e7al\u0131\u015facak Chromium ikilisini sa\u011flar.<\/p>\n<pre><code class=\"language-bash\">\nnpm install puppeteer-core chrome-aws-lambda\n<\/pre>\n<p><\/code><\/p>\n<p>Bu ba\u011f\u0131ml\u0131l\u0131klar\u0131 <code>node_modules<\/code> klas\u00f6r\u00fcnde tutmak yerine, bunlar\u0131 bir Lambda Katman\u0131 (Layer) olarak da\u011f\u0131tmak daha verimli bir yakla\u015f\u0131md\u0131r. Bu, fonksiyon paketimizin daha k\u00fc\u00e7\u00fck kalmas\u0131n\u0131 sa\u011flar ve ayn\u0131 ba\u011f\u0131ml\u0131l\u0131k setini kullanan birden fazla fonksiyonun kaynaklar\u0131 payla\u015fmas\u0131na olanak tan\u0131r.<\/p>\n<h3>Ad\u0131m 3: Lambda Fonksiyon Kodu Yaz\u0131m\u0131<\/h3>\n<p>\u015eimdi <code>handler.js<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m ve PDF olu\u015fturma mant\u0131\u011f\u0131m\u0131z\u0131 buraya yazal\u0131m. Bu \u00f6rnekte, basit bir HTML i\u00e7eri\u011fini PDF'e d\u00f6n\u00fc\u015ft\u00fcrece\u011fiz.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ handler.js\nconst chromium = require('chrome-aws-lambda');\nconst puppeteer = require('puppeteer-core');\n\nexports.handler = async (event, context) => {\n    let browser = null;\n    let pdfBuffer = null;\n\n    try {\n        \/\/ Lambda ortam\u0131nda Chromium'u ba\u015flat\u0131n\n        browser = await puppeteer.launch({\n            args: chromium.args,\n            defaultViewport: chromium.defaultViewport,\n            executablePath: await chromium.executablePath,\n            headless: chromium.headless,\n        });\n\n        const page = await browser.newPage();\n\n        \/\/ PDF olu\u015fturulacak HTML i\u00e7eri\u011fini belirleyin\n        const htmlContent = <code><html>\n            <head>\n                <title>Lambda PDF \u00d6rne\u011fi<\/title>\n                <style>\n                    body { font-family: &#039;Arial&#039;, sans-serif; margin: 20px; }\n                    h1 { color: #333; }\n                    p { color: #666; }\n                    .uzman-ipucu {\n                        background-color: #f0f8ff;\n                        border-left: 5px solid #007bff;\n                        padding: 15px;\n                        margin-top: 20px;\n                        font-style: italic;\n                    }\n                <\/style>\n            <\/head>\n            <body>\n                <h1>AWS Lambda ve Puppeteer ile Dinamik PDF!<\/h1>\n                <p>Bu belge, sunucusuz bir ortamda Puppeteer kullan\u0131larak olu\u015fturulmu\u015ftur. <b>Harika de\u011fil mi?<\/b><\/p>\n                <p>Tarih: ${new Date().toLocaleDateString(&#039;tr-TR&#039;)}<\/p>\n                <div class=\"uzman-ipucu\">\n                    Uzman \u0130pucu: Bellek optimizasyonu, Puppeteer&#039;\u0131n Lambda \u00fczerinde daha h\u0131zl\u0131 ve uygun maliyetli \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.\n                <\/div>\n            <\/body>\n            <\/html><\/code>;\n        await page.setContent(htmlContent, { waitUntil: 'networkidle0' });\n\n        \/\/ PDF olu\u015fturma se\u00e7eneklerini belirleyin\n        pdfBuffer = await page.pdf({\n            format: 'A4',\n            printBackground: true,\n            margin: {\n                top: '20mm',\n                right: '20mm',\n                bottom: '20mm',\n                left: '20mm',\n            },\n        });\n\n        return {\n            statusCode: 200,\n            headers: {\n                'Content-Type': 'application\/pdf',\n                'Content-Disposition': 'attachment; filename=\"dynamik_lambda_pdf.pdf\"',\n            },\n            body: pdfBuffer.toString('base64'),\n            isBase64Encoded: true,\n        };\n\n    } catch (error) {\n        console.error('PDF olu\u015fturma hatas\u0131:', error);\n        return {\n            statusCode: 500,\n            body: JSON.stringify({ error: 'PDF olu\u015fturulurken bir hata olu\u015ftu.' }),\n        };\n    } finally {\n        if (browser !== null) {\n            await browser.close();\n        }\n    }\n};\n<\/pre>\n<p><\/code><\/p>\n<div class=\"uzman-ipucu\">\n  <strong>Uzman \u0130pucu:<\/strong> <code>waitUntil: &#039;networkidle0&#039;<\/code> se\u00e7ene\u011fi, sayfa \u00fczerinde a\u011f etkinli\u011fi olmad\u0131\u011f\u0131nda PDF olu\u015fturma i\u015flemini ba\u015flat\u0131r. Bu, dinamik i\u00e7eri\u011fin veya JavaScript ile y\u00fcklenen \u00f6\u011felerin tamamland\u0131\u011f\u0131ndan emin olmak i\u00e7in \u00f6nemlidir. Ayr\u0131ca, <code>chrome-aws-lambda<\/code> paketinin <code>executablePath<\/code>'ini Lambda ortam\u0131na g\u00f6re ayarlad\u0131\u011f\u0131m\u0131za dikkat edin.\n<\/div>\n<h3>Ad\u0131m 4: Da\u011f\u0131t\u0131m (Serverless Framework ile)<\/h3>\n<p>Serverless Framework, sunucusuz uygulamalar\u0131 da\u011f\u0131tmay\u0131 ve y\u00f6netmeyi kolayla\u015ft\u0131ran pop\u00fcler bir ara\u00e7t\u0131r. Proje k\u00f6k dizininizde <code>serverless.yml<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-yaml\">\n# serverless.yml\nservice: pdf-generator-lambda\n\nprovider:\n  name: aws\n  runtime: nodejs18.x # Node.js versiyonunu g\u00fcncel tutun\n  memorySize: 1024 # Puppeteer i\u00e7in en az 512MB, idealde 1GB veya daha fazlas\u0131 \u00f6nerilir\n  timeout: 30 # Saniye cinsinden timeout s\u00fcresi, PDF olu\u015fturma s\u00fcresine g\u00f6re ayarlay\u0131n\n  region: eu-central-1 # Kendi AWS b\u00f6lgenizi buraya girin\n  environment:\n    NODE_PATH: \".\/:\/opt\/node_modules\" # Lambda katman\u0131ndaki ba\u011f\u0131ml\u0131l\u0131klar\u0131 tan\u0131mak i\u00e7in\n\nfunctions:\n  generatePdf:\n    handler: handler.handler\n    layers:\n      - arn:aws:lambda:eu-central-1:764866452798:layer:chrome-aws-lambda:48 # chrome-aws-lambda katman\u0131n\u0131n ARN'i\n      # Bu ARN, b\u00f6lgeye ve layer versiyonuna g\u00f6re de\u011fi\u015febilir. G\u00fcncel ARN i\u00e7in GitHub reposuna bak\u0131n.\n    events:\n      - httpApi:\n          path: \/generate-pdf\n          method: get\n<\/pre>\n<p><\/code><\/p>\n<div class=\"uzman-ipucu\">\n  <strong>Uzman \u0130pucu:<\/strong> <code>chrome-aws-lambda<\/code> katman\u0131n\u0131n ARN'i (Amazon Resource Name) kulland\u0131\u011f\u0131n\u0131z AWS b\u00f6lgesine ve <code>chrome-aws-lambda<\/code> s\u00fcr\u00fcm\u00fcne g\u00f6re de\u011fi\u015fiklik g\u00f6sterebilir. En g\u00fcncel ARN'i bulmak i\u00e7in <code>https:\/\/github.com\/shelfio\/chrome-aws-lambda<\/code> GitHub deposunu kontrol edebilir veya kendi katman\u0131n\u0131z\u0131 olu\u015fturabilirsiniz. <code>memorySize<\/code> ve <code>timeout<\/code> de\u011ferleri, PDF'lerin karma\u015f\u0131kl\u0131\u011f\u0131na ve boyutuna g\u00f6re ayarlanmal\u0131d\u0131r. Karma\u015f\u0131k PDF'ler daha fazla bellek ve s\u00fcre gerektirebilir.\n<\/div>\n<p>Bu yap\u0131land\u0131rma ile fonksiyonunuzu da\u011f\u0131tmak i\u00e7in a\u015fa\u011f\u0131daki komutu kullanabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">\nserverless deploy\n<\/pre>\n<p><\/code><\/p>\n<p>Ba\u015far\u0131l\u0131 bir da\u011f\u0131t\u0131m\u0131n ard\u0131ndan, Serverless Framework size <code>generatePdf<\/code> fonksiyonunuzun API Gateway URL'sini sa\u011flayacakt\u0131r. Bu URL'ye bir HTTP GET iste\u011fi g\u00f6ndererek PDF'inizi alabilirsiniz. \u00d6rne\u011fin: <code>https:\/\/xxxxxx.execute-api.eu-central-1.amazonaws.com\/generate-pdf<\/code>.<\/p>\n<p>Bu ad\u0131mlar\u0131 takip ederek, AWS Lambda \u00fczerinde Puppeteer kullanarak dinamik PDF'ler olu\u015fturan \u00f6l\u00e7eklenebilir ve maliyet etkin bir \u00e7\u00f6z\u00fcm kurmu\u015f olacaks\u0131n\u0131z.<\/p>\n<h2>Performans ve Maliyet Optimizasyonu: B\u00fcy\u00fck \u00d6l\u00e7ekli PDF \u00dcretimi \u0130\u00e7in \u0130pu\u00e7lar\u0131<\/h2>\n<p>AWS Lambda \u00fczerinde Puppeteer ile PDF olu\u015fturmak, do\u011fas\u0131 gere\u011fi hem performans hem de maliyet a\u00e7\u0131s\u0131ndan dikkatli optimizasyon gerektiren bir s\u00fcre\u00e7tir. Headless Chrome \u00e7al\u0131\u015ft\u0131rmak ve karma\u015f\u0131k PDF'ler render etmek yo\u011fun kaynak t\u00fcketimine yol a\u00e7abilir. Bu nedenle, b\u00fcy\u00fck \u00f6l\u00e7ekli ve kritik uygulamalarda a\u015fa\u011f\u0131daki ipu\u00e7lar\u0131 hayati \u00f6neme sahiptir.<\/p>\n<h3>Lambda Bellek Ayarlar\u0131 ve CPU G\u00fcc\u00fc<\/h3>\n<p>Lambda fonksiyonlar\u0131na atanan bellek (memorySize), do\u011frudan CPU g\u00fcc\u00fcn\u00fc de etkiler. Daha fazla bellek atamak, genellikle daha fazla CPU d\u00f6ng\u00fcs\u00fc anlam\u0131na gelir ve bu da Puppeteer'\u0131n Chromium'u daha h\u0131zl\u0131 ba\u015flatmas\u0131na ve PDF olu\u015fturma i\u015flemlerini daha \u00e7abuk tamamlamas\u0131na yard\u0131mc\u0131 olur. Varsay\u0131lan 128MB genellikle Puppeteer i\u00e7in yetersizdir. Minimum 512MB, idealde 1GB veya 2GB bellek tahsis etmek, cold start s\u00fcrelerini k\u0131salt\u0131r ve genel PDF olu\u015fturma performans\u0131n\u0131 art\u0131r\u0131r. Ancak, bellek artt\u0131k\u00e7a maliyetin de artt\u0131\u011f\u0131n\u0131 unutmamak gerekir; bu nedenle en uygun de\u011feri bulmak i\u00e7in testler yapmak \u00f6nemlidir.<\/p>\n<pre><code class=\"language-yaml\">\n# serverless.yml veya SAM template'inizde\nfunctions:\n  generatePdf:\n    memorySize: 1024 # 1GB bellek tahsisi\n    timeout: 60     # 60 saniye timeout s\u00fcresi\n<\/pre>\n<p><\/code><\/p>\n<h3>So\u011fuk Ba\u015flang\u0131\u00e7lar\u0131n (Cold Start) Minimize Edilmesi<\/h3>\n<p>Lambda fonksiyonlar\u0131, bir s\u00fcre kullan\u0131lmad\u0131klar\u0131nda \"so\u011fuk ba\u015flang\u0131\u00e7\" denilen bir durumla kar\u015f\u0131la\u015f\u0131r. Bu durumda, AWS fonksiyonun \u00e7al\u0131\u015fma ortam\u0131n\u0131 yeniden ba\u015flatmak zorunda kal\u0131r; bu da uygulaman\u0131n ilk iste\u011fe yan\u0131t verme s\u00fcresini uzat\u0131r. Puppeteer ile bu durum daha da belirginle\u015fir, \u00e7\u00fcnk\u00fc Chromium ikilisinin ba\u015flat\u0131lmas\u0131 zaman al\u0131c\u0131d\u0131r. So\u011fuk ba\u015flang\u0131\u00e7lar\u0131 minimize etmek i\u00e7in birka\u00e7 y\u00f6ntem bulunmaktad\u0131r:<\/p>\n<p>*   <strong>Provisioned Concurrency:<\/strong> Lambda'n\u0131n belirli say\u0131da fonksiyon \u00f6rne\u011fini her zaman \"s\u0131cak\" tutmas\u0131n\u0131 sa\u011flar. Bu, maliyetli olsa da, kritik uygulamalar i\u00e7in garanti edilmi\u015f d\u00fc\u015f\u00fck gecikme s\u00fcresi sunar.<br \/>\n*   <strong>Keep-Alive Mekanizmalar\u0131:<\/strong> Baz\u0131 durumlarda, fonksiyonunuzu d\u00fczenli aral\u0131klarla (\u00f6rne\u011fin, her 5 dakikada bir) k\u00fc\u00e7\u00fck, \u00f6nemsiz bir tetikleyici ile \u00e7a\u011f\u0131rmak, \u00f6rneklerin s\u0131cak kalmas\u0131na yard\u0131mc\u0131 olabilir. Ancak bu, tam bir \u00e7\u00f6z\u00fcm de\u011fildir ve ek maliyet olu\u015fturabilir.<br \/>\n*   <strong>Webpack\/Parcel ile Kod Boyutunu K\u00fc\u00e7\u00fcltme:<\/strong> Fonksiyon paketinizin boyutu ne kadar k\u00fc\u00e7\u00fck olursa, cold start s\u00fcresi o kadar k\u0131sa olur. Gerekli olmayan ba\u011f\u0131ml\u0131l\u0131klar\u0131 eleyin ve kodunuzu optimize etmek i\u00e7in modern paketleyiciler kullan\u0131n.<\/p>\n<h3>Kullan\u0131labilir Chromium Paketleri ve Lambda Katmanlar\u0131<\/h3>\n<p>Daha \u00f6nce bahsedildi\u011fi gibi, <code>chrome-aws-lambda<\/code> gibi optimize edilmi\u015f paketler, Lambda'n\u0131n s\u0131k\u0131\u015ft\u0131r\u0131lm\u0131\u015f paket boyut limitini a\u015fmadan Puppeteer'\u0131 kullanman\u0131za olanak tan\u0131r. Bu paketler, gereksiz dosyalar\u0131 \u00e7\u0131kararak ve Chromium'u AWS Lambda ortam\u0131nda \u00e7al\u0131\u015fmak \u00fczere yap\u0131land\u0131rarak \u00f6nemli bir fark yarat\u0131r. Bu paketleri bir Lambda Katman\u0131 olarak da\u011f\u0131tmak, fonksiyonlar\u0131n\u0131z\u0131n sadece kendi i\u015f mant\u0131\u011f\u0131 kodunu i\u00e7ermesini sa\u011flar, bu da hem da\u011f\u0131t\u0131m s\u00fcrelerini k\u0131salt\u0131r hem de birden fazla fonksiyonun ayn\u0131 Chromium ikilisini payla\u015fmas\u0131na olanak tan\u0131r.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ chrome-aws-lambda kullan\u0131rken\nconst chromium = require('chrome-aws-lambda');\nconst puppeteer = require('puppeteer-core');\n\n\/\/ Puppeteer'\u0131 ba\u015flat\u0131rken executablePath olarak chromium.executablePath kullan\u0131n\nbrowser = await puppeteer.launch({\n    args: chromium.args,\n    defaultViewport: chromium.defaultViewport,\n    executablePath: await chromium.executablePath,\n    headless: chromium.headless,\n});\n<\/pre>\n<p><\/code><\/p>\n<div class=\"uzman-ipucu\">\n  <strong>Uzman \u0130pucu:<\/strong> E\u011fer \u00f6zel fontlar veya ek k\u00fct\u00fcphaneler kullanman\u0131z gerekiyorsa, bunlar\u0131 da ayn\u0131 Lambda katman\u0131na dahil edebilir veya kendi \u00f6zel katman\u0131n\u0131z\u0131 olu\u015fturabilirsiniz. Bu, fonksiyonunuzun boyutunu k\u00fc\u00e7\u00fck tutman\u0131n ve ba\u011f\u0131ml\u0131l\u0131k y\u00f6netimini merkezile\u015ftirmenin etkili bir yoludur.\n<\/div>\n<h3>Tekrar Kullan\u0131m ve Kaynak Y\u00f6netimi<\/h3>\n<p>Lambda fonksiyonlar\u0131, ayn\u0131 ortamda birden fazla \u00e7a\u011fr\u0131 i\u00e7in tekrar kullan\u0131labilir. Bu, <code>browser<\/code> \u00f6rne\u011fini fonksiyon \u00e7a\u011fr\u0131lar\u0131 aras\u0131nda a\u00e7\u0131k tutarak (<code>async<\/code> <code>await<\/code> kal\u0131b\u0131 ile de\u011fil, global veya mod\u00fcl seviyesinde de\u011fi\u015fken olarak tan\u0131mlayarak) performans kazan\u0131m\u0131 sa\u011flayabilece\u011finiz anlam\u0131na gelir. Ancak, bu durum dikkatli kaynak y\u00f6netimi gerektirir; her yeni \u00e7a\u011fr\u0131da temiz bir sayfa (page) olu\u015fturmak ve i\u015finiz bitti\u011finde onu kapatmak \u00f6nemlidir. Ayr\u0131ca, bir taray\u0131c\u0131 \u00f6rne\u011finin \u00e7ok uzun s\u00fcre a\u00e7\u0131k kalmas\u0131 bellek s\u0131z\u0131nt\u0131lar\u0131na veya beklenmeyen davran\u0131\u015flara yol a\u00e7abilir. Bu nedenle, belirli bir e\u015fikten sonra taray\u0131c\u0131y\u0131 yeniden ba\u015flatmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz.<\/p>\n<p>Bu optimizasyon tekniklerini uygulayarak, AWS Lambda \u00fczerinde Puppeteer ile \u00e7al\u0131\u015fan PDF olu\u015fturma \u00e7\u00f6z\u00fcm\u00fcn\u00fcz\u00fcn hem maliyet etkinli\u011fini art\u0131rabilir hem de son kullan\u0131c\u0131lara daha h\u0131zl\u0131 ve daha duyarl\u0131 bir deneyim sunabilirsiniz.<\/p>\n<h2>Geli\u015fmi\u015f Senaryolar ve G\u00fcvenlik: Dinamik \u0130\u00e7erik, Kimlik Do\u011frulama ve Hata Y\u00f6netimi<\/h2>\n<p>Puppeteer'\u0131n AWS Lambda \u00fczerinde sundu\u011fu temel PDF olu\u015fturma yetene\u011fi olduk\u00e7a g\u00fc\u00e7l\u00fcd\u00fcr, ancak ger\u00e7ek d\u00fcnya uygulamalar\u0131nda daha karma\u015f\u0131k senaryolar ve g\u00fcvenlik endi\u015feleri ortaya \u00e7\u0131kar. Bu b\u00f6l\u00fcmde, dinamik i\u00e7eriklerin y\u00f6netimi, kimlik do\u011frulama gerektiren sayfalar\u0131n PDF'e d\u00f6n\u00fc\u015ft\u00fcr\u00fclmesi ve sa\u011flam bir hata y\u00f6netim stratejisinin nas\u0131l olu\u015fturulaca\u011f\u0131 konular\u0131na odaklanaca\u011f\u0131z.<\/p>\n<h3>Dinamik HTML \u015eablonlar\u0131 ve Veri Entegrasyonu<\/h3>\n<p>Sabit HTML i\u00e7eriklerinden PDF olu\u015fturmak basitken, \u00e7o\u011fu uygulamada PDF'ler dinamik verilerle doldurulmal\u0131d\u0131r. Bu, kullan\u0131c\u0131ya \u00f6zel raporlar, faturalar veya sertifikalar gibi durumlar i\u00e7in kritik \u00f6neme sahiptir. Node.js ekosisteminde Handlebars, Pug (Jade) veya EJS gibi \u015fablon motorlar\u0131, veri ile HTML \u015fablonlar\u0131n\u0131 birle\u015ftirmek i\u00e7in idealdir.<\/p>\n<p>\u00d6rne\u011fin, Handlebars kullanarak bir \u015fablon ve veri birle\u015ftirme ad\u0131mlar\u0131 a\u015fa\u011f\u0131daki gibi olabilir:<\/p>\n<p>1.  <strong>\u015eablon Haz\u0131rl\u0131\u011f\u0131:<\/strong><br \/>\n    <code>template.hbs<\/code> (bir Handlebars \u015fablonu):<\/p>\n<pre><code class=\"language-html\">\n        <html>\n        <head>\n            <title>Dinamik Rapor - {{title}}<\/title>\n            <style>\n                \/* Mobil uyumlu stil *\/\n                body { font-family: 'Verdana', sans-serif; margin: 20px; }\n                h1 { color: #2c3e50; text-align: center; }\n                .report-details { margin-top: 30px; border-top: 1px solid #eee; padding-top: 20px; }\n                .report-item { margin-bottom: 10px; }\n                @media (max-width: 600px) {\n                    body { margin: 10px; }\n                    h1 { font-size: 24px; }\n                }\n            <\/style>\n        <\/head>\n        <body>\n            <h1>{{title}}<\/h1>\n            <p>Rapor Tarihi: {{reportDate}}<\/p>\n            <div class=\"report-details\">\n                {{#each items}}\n                    <div class=\"report-item\">\n                        <strong>{{name}}:<\/strong> {{value}}\n                    <\/div>\n                {{\/each}}\n            <\/div>\n        <\/body>\n        <\/html>\n    <\/pre>\n<p><\/code><\/p>\n<pre><code class=\"language-javascript\">2.  <strong>Veri ile \u015eablonu \u0130\u015fleme:<\/strong><\/pre>\n<p><\/code><br \/>\n        const Handlebars = require('handlebars');<br \/>\n        const fs = require('fs');<br \/>\n        const path = require('path');<\/p>\n<p>        \/\/ ... handler fonksiyonu i\u00e7inde<br \/>\n        const templateSource = fs.readFileSync(path.resolve(__dirname, 'template.hbs'), 'utf8');<br \/>\n        const template = Handlebars.compile(templateSource);<\/p>\n<p>        const data = {<br \/>\n            title: 'Ayl\u0131k Sat\u0131\u015f Raporu',<br \/>\n            reportDate: new Date().toLocaleDateString('tr-TR'),<br \/>\n            items: [<br \/>\n                { name: 'Toplam Sat\u0131\u015f', value: '1,250,000 TL' },<br \/>\n                { name: 'Yeni M\u00fc\u015fteriler', value: '150 adet' },<br \/>\n                { name: 'Ortalama Sipari\u015f De\u011feri', value: '250 TL' },<br \/>\n            ],<br \/>\n        };<\/p>\n<p>        const finalHtml = template(data);<br \/>\n        await page.setContent(finalHtml, { waitUntil: 'networkidle0' });<br \/>\n        \/\/ ... PDF olu\u015fturma<br \/>\n    <\/code><br \/>\n    Bu y\u00f6ntem, verileri programatik olarak HTML'e enjekte etmenizi ve tutarl\u0131, markal\u0131 PDF'ler olu\u015fturman\u0131z\u0131 sa\u011flar.<\/p>\n<h3>Kimlik Do\u011frulama Gerektiren Sayfalardan PDF Olu\u015fturma<\/h3>\n<p>Baz\u0131 durumlarda, bir web sitesindeki oturum a\u00e7ma gerektiren bir sayfadan PDF olu\u015fturman\u0131z gerekebilir (\u00f6rne\u011fin, bir kullan\u0131c\u0131n\u0131n kendi panosundan bir raporu indirmesi). Puppeteer, bu t\u00fcr senaryolar\u0131 ele almak i\u00e7in \u00e7e\u015fitli yollar sunar:<\/p>\n<p>*   <strong>\u00c7erezleri Ayarlama:<\/strong> Kullan\u0131c\u0131 oturum a\u00e7t\u0131ktan sonra elde edilen \u00e7erezleri Puppeteer taray\u0131c\u0131s\u0131na enjekte edebilirsiniz.<\/p>\n<pre><code class=\"language-javascript\">\n        await page.setCookie(...cookiesArray); \/\/ cookiesArray, \u00f6nceden al\u0131nm\u0131\u015f \u00e7erez nesneleri dizisidir\n        await page.goto('https:\/\/example.com\/secure-report', { waitUntil: 'networkidle0' });\n    <\/pre>\n<p><\/code><\/p>\n<pre><code class=\"language-javascript\">*   <strong>Form Doldurma ve Oturum A\u00e7ma:<\/strong> Puppeteer, oturum a\u00e7ma formlar\u0131n\u0131 doldurabilir ve g\u00f6nderebilir.<\/pre>\n<p><\/code><br \/>\n        await page.goto('https:\/\/example.com\/login', { waitUntil: 'networkidle0' });<br \/>\n        await page.type('#username', 'kullaniciadi');<br \/>\n        await page.type('#password', 'sifre');<br \/>\n        await page.click('#loginButton');<br \/>\n        await page.waitForNavigation({ waitUntil: 'networkidle0' });<br \/>\n        \/\/ \u015eimdi g\u00fcvenli sayfaya y\u00f6nlendirildiniz ve PDF olu\u015fturabilirsiniz<br \/>\n    <\/code><\/p>\n<pre><code class=\"language-javascript\">*   <strong>HTTP Kimlik Do\u011frulama:<\/strong> E\u011fer sayfa temel HTTP kimlik do\u011frulamas\u0131 gerektiriyorsa.<\/pre>\n<p><\/code><br \/>\n        await page.authenticate({ username: 'user', password: 'password' });<br \/>\n        await page.goto('https:\/\/example.com\/basic-auth-page', { waitUntil: 'networkidle0' });<br \/>\n    <\/code><br \/>\n    G\u00fcvenlik a\u00e7\u0131s\u0131ndan, hassas kimlik bilgilerinin (\u00e7erezler, kullan\u0131c\u0131 ad\u0131\/\u015fifre) Lambda ortam\u0131nda g\u00fcvenli bir \u015fekilde sakland\u0131\u011f\u0131ndan (\u00f6rne\u011fin, AWS Secrets Manager kullanarak) emin olun.<\/p>\n<h3>Hata Y\u00f6netimi ve Loglama<\/h3>\n<p>Lambda ortam\u0131nda hata ay\u0131klama zor olabilir. Bu nedenle, robust bir hata y\u00f6netimi ve kapsaml\u0131 loglama stratejisi hayati \u00f6neme sahiptir.<\/p>\n<p>*   <strong><code>try-catch-finally<\/code> Bloklar\u0131:<\/strong> Puppeteer i\u015flemlerini her zaman <code>try-catch<\/code> bloklar\u0131 i\u00e7ine al\u0131n. <code>finally<\/code> blo\u011funda taray\u0131c\u0131y\u0131 kapatmay\u0131 unutmay\u0131n (<code>browser.close()<\/code>).<br \/>\n*   <strong>CloudWatch Loglar\u0131:<\/strong> <code>console.log<\/code>, <code>console.error<\/code> gibi ifadeleriniz otomatik olarak AWS CloudWatch Logs'a g\u00f6nderilir. Bu loglar\u0131 d\u00fczenli olarak izleyerek ve hata desenlerini analiz ederek sorunlar\u0131 tespit edebilirsiniz.<br \/>\n*   <strong>\u00d6zel Metrikler ve Uyar\u0131lar:<\/strong> CloudWatch Metrikleri ve Alarmlar\u0131 kullanarak fonksiyon hatalar\u0131n\u0131 veya Puppeteer i\u015flemlerinin belirli bir s\u00fcreyi a\u015ft\u0131\u011f\u0131n\u0131 izleyebilirsiniz.<br \/>\n*   <strong>Dead Letter Queue (DLQ):<\/strong> E\u011fer PDF olu\u015fturma i\u015flemi belirli bir nedenden dolay\u0131 s\u00fcrekli ba\u015far\u0131s\u0131z oluyorsa, ba\u015far\u0131s\u0131z olan olaylar\u0131 bir Amazon SQS kuyru\u011funa veya SNS konusuna g\u00f6ndermek i\u00e7in bir DLQ yap\u0131land\u0131rabilirsiniz. Bu, ba\u015far\u0131s\u0131z i\u015fleri yeniden denemek veya analiz etmek i\u00e7in olanak tan\u0131r.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ handler.js i\u00e7indeki hata y\u00f6netimi \u00f6rne\u011fi\nexports.handler = async (event, context) => {\n    let browser = null;\n    try {\n        \/\/ ... Puppeteer ba\u015flatma ve PDF olu\u015fturma\n    } catch (error) {\n        console.error('Kritik PDF olu\u015fturma hatas\u0131:', error);\n        \/\/ Hatan\u0131n detaylar\u0131n\u0131 CloudWatch'a loglay\u0131n\n        \/\/ Belki bu hatay\u0131 bir DLQ'ye g\u00f6nderin veya bir bildirim servisine y\u00f6nlendirin\n        throw new Error('PDF olu\u015fturma ba\u015far\u0131s\u0131z oldu.'); \/\/ Lambda'ya hatay\u0131 ilet\n    } finally {\n        if (browser !== null) {\n            await browser.close(); \/\/ Her durumda taray\u0131c\u0131y\u0131 kapat\n        }\n    }\n};\n<\/pre>\n<p><\/code><\/p>\n<p>Bu geli\u015fmi\u015f senaryolar\u0131 ve g\u00fcvenlik uygulamalar\u0131n\u0131 dikkate alarak, AWS Lambda ve Puppeteer ile sadece \u00e7al\u0131\u015fan de\u011fil, ayn\u0131 zamanda g\u00fcvenilir, bak\u0131m\u0131 kolay ve profesyonel kalitede PDF \u00e7\u00f6z\u00fcmleri geli\u015ftirebilirsiniz.<\/p>\n<h2>Vaka Analizi: Ger\u00e7ek D\u00fcnya Kullan\u0131m Durumlar\u0131<\/h2>\n<p>AWS Lambda ve Puppeteer ikilisi, \u00e7e\u015fitli end\u00fcstrilerde dinamik PDF olu\u015fturma ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131lamak i\u00e7in ba\u015far\u0131yla kullan\u0131lmaktad\u0131r. Bu b\u00f6l\u00fcm, ger\u00e7ek d\u00fcnya senaryolar\u0131n\u0131 inceleyerek bu teknolojilerin pratik uygulamalar\u0131n\u0131 daha iyi anlamam\u0131z\u0131 sa\u011flayacakt\u0131r.<\/p>\n<h3>1. E-ticaret: Otomatik Fatura ve Sipari\u015f Belgesi Olu\u015fturma<\/h3>\n<p><strong>Senaryo:<\/strong> Bir e-ticaret \u015firketi, her sipari\u015f tamamland\u0131\u011f\u0131nda m\u00fc\u015fterilerine \u00f6zel, markal\u0131 fatura ve sipari\u015f \u00f6zeti PDF'leri g\u00f6ndermek istiyor. Geleneksel olarak, bu t\u00fcr belgelerin olu\u015fturulmas\u0131, sunucuda kaynak yo\u011fun i\u015flemler gerektirir ve sipari\u015f hacmi artt\u0131k\u00e7a \u00f6l\u00e7eklenebilirlik sorunlar\u0131na yol a\u00e7abilir.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm:<\/strong> \u015eirket, bu s\u00fcreci AWS Lambda ve Puppeteer kullanarak otomatikle\u015ftirmeye karar verdi.<\/p>\n<p>*   <strong>Tetikleyici:<\/strong> Her yeni sipari\u015f tamamland\u0131\u011f\u0131nda, e-ticaret platformu bir Amazon SQS (Simple Queue Service) kuyru\u011funa veya Amazon EventBridge'e bir olay g\u00f6nderir.<br \/>\n*   <strong>Lambda Fonksiyonu:<\/strong> Bu olay, <code>generateInvoicePdf<\/code> ad\u0131nda bir AWS Lambda fonksiyonunu tetikler.<br \/>\n*   <strong>Veri \u0130\u015fleme:<\/strong> Lambda fonksiyonu, sipari\u015f detaylar\u0131n\u0131 (m\u00fc\u015fteri bilgileri, \u00fcr\u00fcnler, fiyatlar, vergiler vb.) veritaban\u0131ndan (\u00f6rne\u011fin, Amazon DynamoDB veya RDS) \u00e7eker.<br \/>\n*   <strong>HTML \u015eablonu ve Puppeteer:<\/strong> Fonksiyon, \u00f6nceden haz\u0131rlanm\u0131\u015f bir HTML fatura \u015fablonunu (Handlebars veya EJS ile) ald\u0131\u011f\u0131 sipari\u015f verileriyle birle\u015ftirir. Ard\u0131ndan Puppeteer'\u0131 ba\u015flat\u0131r ve bu dinamik HTML'i PDF'e d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. \u015eablon, \u015firketin marka renkleri, logosu ve mobil uyumlu CSS stillerini i\u00e7erir, b\u00f6ylece PDF'in bask\u0131 kalitesi garanti edilir.<br \/>\n*   <strong>Depolama ve Da\u011f\u0131t\u0131m:<\/strong> Olu\u015fturulan PDF, Amazon S3'e (Simple Storage Service) g\u00fcvenli bir \u015fekilde y\u00fcklenir. S3'e y\u00fcklenen dosyan\u0131n URL'si m\u00fc\u015fteriye e-posta ile g\u00f6nderilir veya e-ticaret platformunun kullan\u0131c\u0131 paneline entegre edilir.<br \/>\n*   <strong>Faydalar\u0131:<\/strong><br \/>\n    *   <strong>\u00d6l\u00e7eklenebilirlik:<\/strong> Y\u00fcksek sipari\u015f hacimlerinde bile Lambda otomatik olarak \u00f6l\u00e7eklenir, bu da herhangi bir darbo\u011faz olmadan milyonlarca faturan\u0131n olu\u015fturulmas\u0131n\u0131 sa\u011flar.<br \/>\n    *   <strong>Maliyet Etkinli\u011fi:<\/strong> Yaln\u0131zca kullan\u0131lan kaynaklar i\u00e7in \u00f6deme yap\u0131l\u0131r; bo\u015fta bekleyen sunucu maliyeti olmaz.<br \/>\n    *   <strong>Bak\u0131m Kolayl\u0131\u011f\u0131:<\/strong> Sunucu y\u00f6netimi ve g\u00fcncellemeleri AWS taraf\u0131ndan yap\u0131l\u0131r, b\u00f6ylece geli\u015ftiriciler \u00e7ekirdek i\u015f mant\u0131\u011f\u0131na odaklanabilir.<\/p>\n<div class=\"uzman-ipucu\">\n  <strong>Uzman \u0130pucu:<\/strong> Faturalar gibi hassas belgeler i\u00e7in S3'e y\u00fcklenen PDF'lerin \u015fifrelenmi\u015f oldu\u011fundan (\u00f6rne\u011fin, SSE-S3 veya KMS ile) ve eri\u015fim politikalar\u0131n\u0131n uygun \u015fekilde yap\u0131land\u0131r\u0131ld\u0131\u011f\u0131ndan emin olun.\n<\/div>\n<h3>2. E\u011fitim Platformu: Dinamik Sertifika Olu\u015fturma<\/h3>\n<p><strong>Senaryo:<\/strong> Bir online e\u011fitim platformu, kursu ba\u015far\u0131yla tamamlayan \u00f6\u011frencilere otomatik olarak ki\u015fiselle\u015ftirilmi\u015f sertifikalar vermek istiyor. Her sertifika, \u00f6\u011frencinin ad\u0131, kurs ad\u0131, tamamlanma tarihi ve benzersiz bir sertifika kimli\u011fi i\u00e7ermelidir.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm:<\/strong><\/p>\n<p>*   <strong>Tetikleyici:<\/strong> \u00d6\u011frencinin kursu tamamlama olay\u0131 (veritaban\u0131nda bir durum de\u011fi\u015fikli\u011fi veya bir API \u00e7a\u011fr\u0131s\u0131) bir Lambda fonksiyonunu tetikler.<br \/>\n*   <strong>Veri Toplama:<\/strong> Lambda, \u00f6\u011frencinin bilgilerini, kurs detaylar\u0131n\u0131 ve dinamik olarak olu\u015fturulan sertifika kimli\u011fini veri taban\u0131ndan al\u0131r.<br \/>\n*   <strong>Puppeteer ile Render:<\/strong> Fonksiyon, sertifika i\u00e7in tasarlanm\u0131\u015f bir HTML \u015fablonunu (g\u00fczel yaz\u0131 tipleri, arka plan g\u00f6rselleri ve dinamik alanlar i\u00e7erir) Puppeteer ile PDF'e d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. Puppeteer, y\u00fcksek \u00e7\u00f6z\u00fcn\u00fcrl\u00fckl\u00fc g\u00f6rselleri ve \u00f6zel fontlar\u0131 do\u011fru bir \u015fekilde render ederek profesyonel g\u00f6r\u00fcn\u00fcml\u00fc bir sertifika olu\u015fturur.<br \/>\n*   <strong>Depolama ve Teslimat:<\/strong> Olu\u015fturulan PDF sertifikas\u0131 Amazon S3'e y\u00fcklenir ve \u00f6\u011frenciye e-posta ile g\u00f6nderilir. \u00d6\u011frenci ayr\u0131ca platformdaki kendi profil sayfas\u0131ndan da sertifikas\u0131n\u0131 indirebilir.<br \/>\n*   <strong>Faydalar\u0131:<\/strong><br \/>\n    *   <strong>Ki\u015fiselle\u015ftirme:<\/strong> Her \u00f6\u011frenciye \u00f6zel, do\u011fru bilgilerle donat\u0131lm\u0131\u015f sertifikalar otomatik olarak olu\u015fturulur.<br \/>\n    *   <strong>Otomasyon:<\/strong> Manuel sertifika olu\u015fturma ve g\u00f6nderme s\u00fcre\u00e7lerini ortadan kald\u0131r\u0131r, insan hatas\u0131n\u0131 azalt\u0131r.<br \/>\n    *   <strong>H\u0131z:<\/strong> \u00d6\u011frenci kursu tamamlad\u0131\u011f\u0131 anda sertifikas\u0131n\u0131 an\u0131nda alabilir.<\/p>\n<h3>3. \u0130\u015f Raporlama: G\u00fcnl\u00fck\/Haftal\u0131k Analitik Raporlar\u0131n PDF'e D\u00f6n\u00fc\u015ft\u00fcr\u00fclmesi<\/h3>\n<p><strong>Senaryo:<\/strong> Bir SaaS \u015firketi, m\u00fc\u015fterilerine g\u00fcnl\u00fck veya haftal\u0131k olarak hizmet kullan\u0131mlar\u0131 hakk\u0131nda \u00f6zelle\u015ftirilmi\u015f analiz raporlar\u0131 sunuyor. Bu raporlar, interaktif grafikler, tablolar ve metin analizlerini i\u00e7eren dinamik web sayfalar\u0131 olarak olu\u015fturuluyor. M\u00fc\u015fteriler, bu raporlar\u0131 e-posta yoluyla PDF olarak almak istiyor.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm:<\/strong><\/p>\n<p>*   <strong>Tetikleyici:<\/strong> Amazon EventBridge zamanlanm\u0131\u015f bir kural (\u00f6rne\u011fin, her gece yar\u0131s\u0131 veya haftal\u0131k olarak) bir Lambda fonksiyonunu tetikler.<br \/>\n*   <strong>M\u00fc\u015fteri Verileri:<\/strong> Lambda, rapor olu\u015fturulacak t\u00fcm m\u00fc\u015fterilerin listesini al\u0131r.<br \/>\n*   <strong>Web Sayfas\u0131n\u0131 Ziyaret Etme:<\/strong> Her m\u00fc\u015fteri i\u00e7in, Lambda Puppeteer'\u0131 ba\u015flat\u0131r ve ilgili m\u00fc\u015fterinin \u00f6zel analiz raporu web sayfas\u0131na (kimlik do\u011frulama \u00e7erezleri veya token'lar\u0131 kullanarak) gider. Sayfa tamamen y\u00fcklendikten ve t\u00fcm dinamik grafikler (JavaScript ile olu\u015fturulan) render edildikten sonra, Puppeteer sayfan\u0131n PDF'ini olu\u015fturur.<br \/>\n*   <strong>S3 ve E-posta:<\/strong> Olu\u015fturulan PDF'ler, ilgili m\u00fc\u015fterinin S3 klas\u00f6r\u00fcne kaydedilir ve m\u00fc\u015fterilere ki\u015fiselle\u015ftirilmi\u015f e-postalar arac\u0131l\u0131\u011f\u0131yla g\u00f6nderilir.<br \/>\n*   <strong>Faydalar\u0131:<\/strong><br \/>\n    *   <strong>Kapsaml\u0131 Raporlama:<\/strong> Dinamik ve interaktif web raporlar\u0131n\u0131n t\u00fcm zenginli\u011fini PDF'e ta\u015f\u0131ma yetene\u011fi.<br \/>\n    *   <strong>Zamanlama ve Otomasyon:<\/strong> Raporlar\u0131n d\u00fczenli aral\u0131klarla otomatik olarak olu\u015fturulmas\u0131 ve da\u011f\u0131t\u0131lmas\u0131.<br \/>\n    *   <strong>Tutarl\u0131l\u0131k:<\/strong> T\u00fcm m\u00fc\u015fteriler i\u00e7in tutarl\u0131 bir raporlama format\u0131 sa\u011flar.<\/p>\n<p>Bu vaka analizleri, AWS Lambda ve Puppeteer'\u0131n, sadece basit PDF'ler olu\u015fturmakla kalmay\u0131p, ayn\u0131 zamanda karma\u015f\u0131k, dinamik ve \u00f6l\u00e7eklenebilir belge olu\u015fturma ihtiya\u00e7lar\u0131n\u0131 nas\u0131l kar\u015f\u0131layabilece\u011fini a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Bu teknolojilerin birle\u015fimi, \u015firketlerin operasyonel verimliliklerini art\u0131rmalar\u0131na ve m\u00fc\u015fteri deneyimlerini geli\u015ftirmelerine olanak tan\u0131r.<\/p>\n<h2>Sonu\u00e7: AWS Lambda ve Puppeteer ile Gelece\u011fin PDF \u00c7\u00f6z\u00fcmleri<\/h2>\n<p>Bu makale boyunca, AWS Lambda ve Puppeteer'\u0131 bir araya getirerek dinamik PDF olu\u015fturman\u0131n g\u00fcc\u00fcn\u00fc ve potansiyelini detayl\u0131ca inceledik. Geleneksel PDF olu\u015fturma yakla\u015f\u0131mlar\u0131n\u0131n getirdi\u011fi altyap\u0131 maliyeti, \u00f6l\u00e7eklenebilirlik zorluklar\u0131 ve y\u00f6netim y\u00fck\u00fc gibi sorunlara kar\u015f\u0131 sunucusuz mimarinin sundu\u011fu pratik ve verimli \u00e7\u00f6z\u00fcmleri ele ald\u0131k. Puppeteer'\u0131n ger\u00e7ek bir taray\u0131c\u0131 motoru kullanarak HTML, CSS ve JavaScript ile olu\u015fturulmu\u015f karma\u015f\u0131k web sayfalar\u0131n\u0131 y\u00fcksek kaliteli PDF'lere d\u00f6n\u00fc\u015ft\u00fcrme yetene\u011fi, Lambda'n\u0131n olay tabanl\u0131, otomatik \u00f6l\u00e7eklenen ve sadece kullan\u0131lan kaynak kadar \u00fccretlendirme yapan yap\u0131s\u0131yla birle\u015fti\u011finde, gelece\u011fin belge olu\u015fturma altyap\u0131s\u0131n\u0131 kurmak i\u00e7in ideal bir kombinasyon olu\u015fturuyor.<\/p>\n<p>\u00d6zellikle e-ticaret sitelerinde fatura ve sipari\u015f \u00f6zeti olu\u015fturmaktan, e\u011fitim platformlar\u0131nda ki\u015fiselle\u015ftirilmi\u015f sertifikalar vermeye, kurumsal raporlama sistemlerinde dinamik analitik raporlar \u00fcretmeye kadar bir\u00e7ok ger\u00e7ek d\u00fcnya senaryosunda bu ikilinin nas\u0131l ba\u015far\u0131l\u0131 bir \u015fekilde kullan\u0131labilece\u011fini vaka analizleri ile peki\u015ftirdik. Performans optimizasyonu, maliyet y\u00f6netimi, so\u011fuk ba\u015flang\u0131\u00e7lar\u0131n minimize edilmesi, dinamik i\u00e7erik entegrasyonu ve robust hata y\u00f6netimi gibi ileri d\u00fczey konulara de\u011finerek, sadece bir \u00e7\u00f6z\u00fcm\u00fcn nas\u0131l kurulaca\u011f\u0131n\u0131 de\u011fil, ayn\u0131 zamanda en iyi uygulamalarla nas\u0131l s\u00fcrd\u00fcr\u00fclebilir ve verimli hale getirilebilece\u011fini de g\u00f6sterdik.<\/p>\n<p>Lambda ve Puppeteer'\u0131n sundu\u011fu bu esneklik ve g\u00fc\u00e7, geli\u015ftiricilerin altyap\u0131 endi\u015felerinden ar\u0131narak do\u011frudan i\u015f mant\u0131\u011f\u0131na odaklanmalar\u0131n\u0131 sa\u011fl\u0131yor. Bu sayede, daha h\u0131zl\u0131 geli\u015ftirme s\u00fcre\u00e7leri, daha az operasyonel y\u00fck ve nihayetinde daha iyi bir son kullan\u0131c\u0131 deneyimi elde ediliyor. PDF olu\u015fturma ihtiyac\u0131n\u0131z ne olursa olsun, bu g\u00fc\u00e7l\u00fc sunucusuz kombinasyon, modern uygulamalar\u0131n\u0131z i\u00e7in maliyet etkin, \u00f6l\u00e7eklenebilir ve y\u00fcksek performansl\u0131 bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<p><strong>1. AWS Lambda'n\u0131n paket boyut limitini Puppeteer ile nas\u0131l a\u015fabiliriz?<\/strong><br \/>\nLambda'n\u0131n s\u0131k\u0131\u015ft\u0131r\u0131lm\u0131\u015f paket boyutu 50MB, s\u0131k\u0131\u015ft\u0131r\u0131lmam\u0131\u015f boyutu ise 250MB't\u0131r. Puppeteer'\u0131n i\u00e7erdi\u011fi Chromium ikilisi genellikle bu limitleri a\u015far. Bu sorunu a\u015fmak i\u00e7in <code>chrome-aws-lambda<\/code> gibi optimize edilmi\u015f bir Chromium paketi kullanmal\u0131 ve bunu bir Lambda Katman\u0131 (Layer) olarak da\u011f\u0131tmal\u0131s\u0131n\u0131z. Bu sayede ana fonksiyon kodunuz k\u00fc\u00e7\u00fck kal\u0131r ve Chromium ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131 birden fazla fonksiyon aras\u0131nda payla\u015fabilirsiniz.<\/p>\n<p><strong>2. Puppeteer i\u00e7in uygun Lambda belle\u011fi (memorySize) ne kadar olmal\u0131d\u0131r?<\/strong><br \/>\nMinimum 512MB bellek \u00f6nerilir, ancak karma\u015f\u0131k HTML i\u00e7eri\u011fi, \u00e7ok say\u0131da g\u00f6rsel veya \u00f6zel fontlar i\u00e7eren PDF'ler i\u00e7in 1GB veya 2GB daha uygun olabilir. Bellek tahsisi, ayn\u0131 zamanda Lambda fonksiyonuna daha fazla CPU g\u00fcc\u00fc de sa\u011flar, bu da Puppeteer'\u0131n daha h\u0131zl\u0131 \u00e7al\u0131\u015fmas\u0131na yard\u0131mc\u0131 olur. En uygun de\u011feri bulmak i\u00e7in farkl\u0131 bellek ayarlamalar\u0131yla testler yapman\u0131z \u00f6nerilir.<\/p>\n<p><strong>3. Lambda'daki Puppeteer i\u00e7in so\u011fuk ba\u015flang\u0131\u00e7lar\u0131 (cold start) nas\u0131l minimize edebiliriz?<\/strong><br \/>\nSo\u011fuk ba\u015flang\u0131\u00e7lar\u0131 minimize etmek i\u00e7in <code>Provisioned Concurrency<\/code> kullanabilir, bu sayede Lambda'n\u0131n belirli say\u0131da fonksiyon \u00f6rne\u011fini her zaman haz\u0131r tutmas\u0131n\u0131 sa\u011flayabilirsiniz. Alternatif olarak, <code>Webpack<\/code> veya <code>Parcel<\/code> gibi ara\u00e7larla fonksiyon paketinizin boyutunu k\u00fc\u00e7\u00fcltebilir ve gereksiz ba\u011f\u0131ml\u0131l\u0131klar\u0131 temizleyebilirsiniz. D\u00fczenli aral\u0131klarla fonksiyonu tetikleyerek (keep-alive) s\u0131cak kalmas\u0131n\u0131 sa\u011flamak da bir y\u00f6ntemdir ancak ek maliyet getirebilir.<\/p>\n<p><strong>4. PDF olu\u015fturma i\u015flemi ne kadar s\u00fcrer ve bu s\u00fcreyi nas\u0131l etkileyebiliriz?<\/strong><br \/>\nPDF olu\u015fturma s\u00fcresi, HTML i\u00e7eri\u011finin karma\u015f\u0131kl\u0131\u011f\u0131na, sayfa say\u0131s\u0131na, g\u00f6rsellerin boyutuna ve Lambda fonksiyonuna atanan bellek miktar\u0131na ba\u011fl\u0131d\u0131r. Daha fazla bellek ve CPU g\u00fcc\u00fc tahsis etmek, olu\u015fturma s\u00fcresini k\u0131saltabilir. Ayr\u0131ca, <code>page.setContent()<\/code> i\u00e7inde <code>waitUntil: &#039;networkidle0&#039;<\/code> yerine <code>waitUntil: &#039;domcontentloaded&#039;<\/code> veya belirli bir <code>timeout<\/code> kullanmak, sayfan\u0131n y\u00fcklenmesini bekleme s\u00fcresini optimize edebilir. HTML \u015fablonunuzu sade ve optimize tutmak da performans\u0131 art\u0131racakt\u0131r.<\/p>\n","protected":false},"excerpt":{"rendered":"AWS Lambda&#8217;da Puppeteer ile Dinamik PDF Olu\u015fturma G\u00fcn\u00fcm\u00fcz\u00fcn dijital d\u00fcnyas\u0131nda dinamik PDF belgeleri olu\u015fturmak, i\u015fletmeler i\u00e7in kritik bir&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1406],"tags":[],"class_list":{"0":"post-32764","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-aws","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Neden AWS Lambda ve Puppeteer ile PDF Olu\u015fturmal\u0131y\u0131z?<\/title>\n<meta name=\"description\" content=\"Hi\u00e7bir etiketi bulunamad\u0131.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/neden-aws-lambda-ve-puppeteer-ile-pdf-olusturmaliyiz\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Neden AWS Lambda ve Puppeteer ile PDF Olu\u015fturmal\u0131y\u0131z?\" \/>\n<meta property=\"og:description\" content=\"Hi\u00e7bir etiketi bulunamad\u0131.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/neden-aws-lambda-ve-puppeteer-ile-pdf-olusturmaliyiz\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-25T15:31:43+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"27 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/neden-aws-lambda-ve-puppeteer-ile-pdf-olusturmaliyiz\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/neden-aws-lambda-ve-puppeteer-ile-pdf-olusturmaliyiz\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Neden AWS Lambda ve Puppeteer ile PDF Olu\u015fturmal\u0131y\u0131z?\",\"datePublished\":\"2025-10-25T15:31:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/neden-aws-lambda-ve-puppeteer-ile-pdf-olusturmaliyiz\/\"},\"wordCount\":4820,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"AWS\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/neden-aws-lambda-ve-puppeteer-ile-pdf-olusturmaliyiz\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/neden-aws-lambda-ve-puppeteer-ile-pdf-olusturmaliyiz\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/neden-aws-lambda-ve-puppeteer-ile-pdf-olusturmaliyiz\/\",\"name\":\"Neden AWS Lambda ve Puppeteer ile PDF Olu\u015fturmal\u0131y\u0131z?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-25T15:31:43+00:00\",\"description\":\"Hi\u00e7bir etiketi bulunamad\u0131.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/neden-aws-lambda-ve-puppeteer-ile-pdf-olusturmaliyiz\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/neden-aws-lambda-ve-puppeteer-ile-pdf-olusturmaliyiz\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/neden-aws-lambda-ve-puppeteer-ile-pdf-olusturmaliyiz\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Neden AWS Lambda ve Puppeteer ile PDF Olu\u015fturmal\u0131y\u0131z?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Neden AWS Lambda ve Puppeteer ile PDF Olu\u015fturmal\u0131y\u0131z?","description":"Hi\u00e7bir etiketi bulunamad\u0131.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/neden-aws-lambda-ve-puppeteer-ile-pdf-olusturmaliyiz\/","og_locale":"tr_TR","og_type":"article","og_title":"Neden AWS Lambda ve Puppeteer ile PDF Olu\u015fturmal\u0131y\u0131z?","og_description":"Hi\u00e7bir etiketi bulunamad\u0131.","og_url":"https:\/\/fatihsoysal.com\/blog\/neden-aws-lambda-ve-puppeteer-ile-pdf-olusturmaliyiz\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-25T15:31:43+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"27 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/neden-aws-lambda-ve-puppeteer-ile-pdf-olusturmaliyiz\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/neden-aws-lambda-ve-puppeteer-ile-pdf-olusturmaliyiz\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Neden AWS Lambda ve Puppeteer ile PDF Olu\u015fturmal\u0131y\u0131z?","datePublished":"2025-10-25T15:31:43+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/neden-aws-lambda-ve-puppeteer-ile-pdf-olusturmaliyiz\/"},"wordCount":4820,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["AWS"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/neden-aws-lambda-ve-puppeteer-ile-pdf-olusturmaliyiz\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/neden-aws-lambda-ve-puppeteer-ile-pdf-olusturmaliyiz\/","url":"https:\/\/fatihsoysal.com\/blog\/neden-aws-lambda-ve-puppeteer-ile-pdf-olusturmaliyiz\/","name":"Neden AWS Lambda ve Puppeteer ile PDF Olu\u015fturmal\u0131y\u0131z?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-25T15:31:43+00:00","description":"Hi\u00e7bir etiketi bulunamad\u0131.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/neden-aws-lambda-ve-puppeteer-ile-pdf-olusturmaliyiz\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/neden-aws-lambda-ve-puppeteer-ile-pdf-olusturmaliyiz\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/neden-aws-lambda-ve-puppeteer-ile-pdf-olusturmaliyiz\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Neden AWS Lambda ve Puppeteer ile PDF Olu\u015fturmal\u0131y\u0131z?"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32764","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=32764"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32764\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32764"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32764"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32764"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}