{"id":27359,"date":"2024-04-05T05:00:00","date_gmt":"2024-04-05T03:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/price-tracker-a-practical-dive-into-serverless-applications\/"},"modified":"2024-04-03T14:08:13","modified_gmt":"2024-04-03T12:08:13","slug":"price-tracker-praktyczne-zanurzenie-sie-w-aplikacjach-serverless","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/price-tracker-praktyczne-zanurzenie-sie-w-aplikacjach-serverless\/","title":{"rendered":"Price Tracker \u2013 praktyczne zanurzenie si\u0119 w aplikacjach serverless"},"content":{"rendered":"\n<p>W dziedzinie nowoczesnych rozwi\u0105za\u0144 chmurowych architektura serverless jest modnym has\u0142em, cho\u0107 jej praktyczne zastosowania cz\u0119sto pozostaj\u0105 niezbadane. Celem tego artyku\u0142u jest wype\u0142nienie tej luki poprzez zademonstrowanie aplikacji internetowej Price Tracker. Opr\u00f3cz wiedzy teoretycznej, artyku\u0142 k\u0142adzie nacisk na praktyczne zastosowania, aby pokaza\u0107, jak te koncepcje mog\u0105 zosta\u0107 wykorzystane w rzeczywistych scenariuszach.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Wprowadzenie do architektury serverless oraz chmury AWS<\/strong><\/h2>\n\n\n\n<p>Architektura serverless to rewolucyjny paradygmat przetwarzania w chmurze, kt\u00f3ry umo\u017cliwia programistom tworzenie i uruchamianie aplikacji bez konieczno\u015bci zarz\u0105dzania serwerami. Takie podej\u015bcie daje mo\u017cliwo\u015b\u0107 skupienia si\u0119 na kodzie, a nie na infrastrukturze, co pozwala na wi\u0119ksz\u0105 elastyczno\u015b\u0107 i innowacyjno\u015b\u0107.<\/p>\n\n\n\n<p>AWS Cloud, dostarczyciel us\u0142ug przetwarzania w chmurze, oferuje kompleksowy ekosystem do skutecznego wdra\u017cania architektury serverless. Pakiet us\u0142ug jak:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Lambda,<\/li>\n\n\n\n<li>API Gateway,<\/li>\n\n\n\n<li>DynamoDB,<\/li>\n<\/ul>\n\n\n\n<p>umo\u017cliwia programistom wdra\u017canie skalowalnych, wysoce dost\u0119pnych aplikacji. Dzi\u0119ki wykorzystaniu AWS koncepcja serverless wykracza poza teori\u0119, oferuj\u0105c solidn\u0105 platform\u0119, kt\u00f3r\u0105 mo\u017cna u\u017cy\u0107 do rozwi\u0105zywania z\u0142o\u017conych problem\u00f3w.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>O aplikacji<\/strong><\/h2>\n\n\n\n<p>Aplikacja Price Tracker przeznaczona jest dla os\u00f3b zainteresowanych obserwacj\u0105 zmian cen produkt\u00f3w w czasie. Narz\u0119dzie automatycznie sprawdza zmiany cen, przechowuje je w bazie danych i wy\u015bwietla te informacje w formie wykres\u00f3w. Jest to szczeg\u00f3lnie przydatne w celach edukacyjnych, skupiaj\u0105cych si\u0119 na praktycznym zastosowaniu technologii serverless oraz tworzeniu aplikacji internetowych.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;uploadedSrc&quot;:&quot;https:\\\/\\\/sii.pl\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/02\\\/final_view.png&quot;,&quot;figureClassNames&quot;:&quot;wp-block-image aligncenter size-large&quot;,&quot;figureStyles&quot;:null,&quot;imgClassNames&quot;:&quot;wp-image-26901&quot;,&quot;imgStyles&quot;:null,&quot;targetWidth&quot;:2852,&quot;targetHeight&quot;:1104,&quot;scaleAttr&quot;:false,&quot;ariaLabel&quot;:&quot;Powi\\u0119ksz obrazek: Widok aplikacji&quot;,&quot;alt&quot;:&quot;Widok aplikacji&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image aligncenter size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"396\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/final_view-1024x396.png\" alt=\"Widok aplikacji\" class=\"wp-image-26901\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/final_view-1024x396.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/final_view-300x116.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/final_view-768x297.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/final_view-1536x595.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/final_view-2048x793.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz obrazek: Widok aplikacji\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on-async--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"context.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"context.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Ryc. 1 Widok aplikacji<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Przegl\u0105d architektury<\/h2>\n\n\n\n<p>Architektura aplikacji Price Tracker zbudowanej na platformie AWS stanowi przyk\u0142ad projektu serverless, kt\u00f3ry wykorzystuje mo\u017cliwo\u015bci oraz elastyczno\u015b\u0107 zasob\u00f3w chmury. Poni\u017cej zaprezentuj\u0119 wizualn\u0105 reprezentacj\u0119 architektury wraz ze szczeg\u00f3\u0142owym wyja\u015bnieniem.\u00a0\u00a0<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;uploadedSrc&quot;:&quot;https:\\\/\\\/sii.pl\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/02\\\/architecture_overview.svg&quot;,&quot;figureClassNames&quot;:&quot;wp-block-image aligncenter size-large&quot;,&quot;figureStyles&quot;:null,&quot;imgClassNames&quot;:&quot;wp-image-26903&quot;,&quot;imgStyles&quot;:null,&quot;targetWidth&quot;:501,&quot;targetHeight&quot;:476,&quot;scaleAttr&quot;:false,&quot;ariaLabel&quot;:&quot;Powi\\u0119ksz obrazek: Przegl\\u0105d architektury&quot;,&quot;alt&quot;:&quot;Przegl\\u0105d architektury&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image aligncenter size-large wp-lightbox-container\"><img decoding=\"async\" width=\"501\" height=\"476\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/architecture_overview.svg\" alt=\"Przegl\u0105d architektury\" class=\"wp-image-26903\"\/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz obrazek: Przegl\u0105d architektury\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on-async--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"context.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"context.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Ryc. 2 Przegl\u0105d architektury<\/figcaption><\/figure>\n\n\n\n<p>System dzia\u0142a poprzez szereg skoordynowanych dzia\u0142a\u0144 pomi\u0119dzy us\u0142ugami AWS w celu zarz\u0105dzania danymi:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Tracking Lambda <\/strong>\u2013funkcja stanowi serce operacji \u015bledzenia cen. Jej zadaniem jest zebranie i zwr\u00f3cenie odpowiednich danych o produkcie, kt\u00f3ry jest obserwowany: aktualnej ceny oraz znacznika czasu.<\/li>\n\n\n\n<li><strong>EventBridge Rule <\/strong>\u2013 regu\u0142a skonfigurowana za pomoc\u0105 narz\u0119dzia EventBridge odpowiada za uruchamianie funkcji Tracking Lambda w regularnych odst\u0119pach czasu. Taka konfiguracja zapewnia okresowe \u015bledzenie przedmiotu, dzi\u0119ki czemu proces gromadzenia danych jest sp\u00f3jny i zautomatyzowany.<\/li>\n\n\n\n<li><strong>Handler Lambda <\/strong>\u2013 gdy funkcja Tracking Lambda zbierze dane, funkcja Handler Lambda przejmuje kontrol\u0119. Przetwarza te dane i przechowuje je w tabeli DynamoDB. Opr\u00f3cz tego funkcja jest r\u00f3wnie\u017c odpowiedzialna za generowanie wykres\u00f3w obserwowanych produkt\u00f3w, kt\u00f3re nast\u0119pnie przesy\u0142a do S3 bucket.<\/li>\n\n\n\n<li><strong>Gateway Lambda i API Gateway <\/strong>\u2013 funkcja Gateway Lambda \u0142\u0105czy si\u0119 z bram\u0105 API Gateway, kt\u00f3ra dzia\u0142a jako interfejs u\u017cytkownika. Kiedy u\u017cytkownik wysy\u0142a \u017c\u0105danie do serwera funkcja generuje kod html i przekazuje go u\u017cytkownikowi jako odpowied\u017a na jego \u017c\u0105danie.<\/li>\n\n\n\n<li><strong>S3 bucket (public) <\/strong>\u2013 aplikacja Price Tracker ma w kodzie html zawarte linki do wykres\u00f3w ze zmianami cen. Wykresy s\u0105 przechowywane w S3 bucket.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Hands-on<\/strong><\/h2>\n\n\n\n<p>W cz\u0119\u015bci praktycznej mo\u017cna wybra\u0107 jedn\u0105 z dw\u00f3ch opcji \u2013 r\u0119czn\u0105 konfiguracj\u0119 aplikacji Price Tracker za po\u015brednictwem AWS Management Console (zalecane) lub opcj\u0119 opart\u0105 na skryptach.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>metoda r\u0119czna za pomoc\u0105 konsoli zapewnia dog\u0142\u0119bne zrozumienie krok po kroku, jakie operacje s\u0105 wykonywane,<\/li>\n\n\n\n<li>opcja skryptowa jest przeznaczona dla programist\u00f3w posiadaj\u0105cych przynajmniej podstawow\u0105 wiedz\u0119 z AWS; pozwala na szybk\u0105 i zautomatyzowan\u0105 konfiguracj\u0119 \u015brodowiska AWS i uruchomienie projektu.<\/li>\n<\/ul>\n\n\n\n<p>Niezale\u017cnie od tego, kt\u00f3r\u0105 opcj\u0119 wybierzemy, nale\u017cy wykona\u0107 nast\u0119puj\u0105ce kroki:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Utw\u00f3rz policies.<\/li>\n\n\n\n<li>Utw\u00f3rz roles.<\/li>\n\n\n\n<li>Utw\u00f3rz bucket (wi\u0119cej informacji w sekcji: Uwagi dotycz\u0105ce S3 bucket).<\/li>\n\n\n\n<li>Utw\u00f3rz Tracking Lambda.<\/li>\n\n\n\n<li>Utw\u00f3rz Handler Lambda.<\/li>\n\n\n\n<li>Dodaj Handler Lambda jako&nbsp;destinations&nbsp;do Tracking Lambda.<\/li>\n\n\n\n<li>Dodaj regu\u0142\u0119 EventBridge (wyzwalaj procedur\u0119 co dwie minuty).<\/li>\n\n\n\n<li>Utw\u00f3rz Gateway Lambda.<\/li>\n\n\n\n<li>W API Gateway stw\u00f3rz&nbsp;http endpoint,&nbsp;route&nbsp;oraz&nbsp;integration.<\/li>\n\n\n\n<li>Przetestuj aplikacje (wygenerowanie wykresu mo\u017ce zaj\u0105\u0107 kilka minut).<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Wymagania<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Docker, instalacja:\u00a0<a aria-label=\" (opens in a new tab)\" href=\"https:\/\/www.docker.com\/\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >docker.com<\/a>.,<\/li>\n\n\n\n<li>Dost\u0119p do AWS Management Console:\u00a0<a aria-label=\" (opens in a new tab)\" href=\"https:\/\/aws.amazon.com\/console\/\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >link<\/a>\u00a0(opcja 1.),<\/li>\n\n\n\n<li>Skonfigurowane AWS CLI, instalacja:\u00a0<a aria-label=\" (opens in a new tab)\" href=\"https:\/\/docs.aws.amazon.com\/cli\/latest\/userguide\/getting-started-install.html\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >link<\/a>,\u00a0konfiguracja\u00a0<a aria-label=\" (opens in a new tab)\" href=\"https:\/\/docs.aws.amazon.com\/cli\/latest\/userguide\/getting-started-quickstart.html\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >link<\/a>\u00a0(opcja 2.).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Uwagi dotycz\u0105ce S3 bucket<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Nazwa S3 bucket musi by\u0107 unikalna w\u015br\u00f3d wszystkich istniej\u0105cych bucket\u00f3w w Amazon S3, a nie tylko w obr\u0119bie Twojego w\u0142asnego konta AWS lub okre\u015blonego regionu AWS. Istnieje du\u017ca szansa, \u017ce nie mo\u017cna u\u017cy\u0107 domy\u015blnie u\u017cywanej nazwy \u201eprice-tracker-plots\u201d. Z tego powodu nazw\u0119 mo\u017cna dostosowa\u0107 w pliku app.config. Po zmianie pliku&nbsp;app.config&nbsp;nale\u017cy ponownie zbudowa\u0107 projekt.<\/li>\n\n\n\n<li>Aplikacja Price Tracker ma w kodzie html zawarte linki do wykres\u00f3w ze zmianami cen. Z uwagi na to, \u017ce wykresy te znajduj\u0105 si\u0119 w S3 bucket, aby u\u017cytkownik ko\u0144cowy \u0142aduj\u0105c stron\u0119 mia\u0142 do nich dost\u0119p, dost\u0119p do bucketu musi by\u0107 publiczny.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Opcja 1.: AWS Management Console<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Pobierz repozytorium: <code>git clone git@github.com:czczajka\/price-tracker-serverless.git<\/code><\/li>\n\n\n\n<li>Zmodyfikuj nazw\u0119 S3 bucket w pliku app.config (wi\u0119cej informacji znajdziesz w sekcji: Uwagi dotycz\u0105ce S3 bucket, punkt 1).<\/li>\n\n\n\n<li>Zbuduj wszystkie niezb\u0119dne artefakty: <code>.\/scripts\/build.sh<\/code><\/li>\n\n\n\n<li>Obejrzyj film i odtw\u00f3rz wszystkie kroki w nim zawarte.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe title=\"Price Tracker Hands-on\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/nhlfUf5ZV1E?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Opcja 2.: zautomatyzowana, z wykorzystaniem AWS CLI<\/strong><\/h2>\n\n\n\n<p>W drugim podej\u015bciu u\u017cywamy skryptu, kt\u00f3ry wykorzystuje AWS CLI do wykonywania tej samej pracy w spos\u00f3b zautomatyzowany. Jest to opcja dodatkowa oraz zawiera pewne rozwi\u0105zania na skr\u00f3ty, np.: wykorzystuje polecenie\u00a0sleep\u00a0pomi\u0119dzy poszczeg\u00f3lnymi wywo\u0142aniami do AWS-a. Wynikiem ko\u0144cowym dzia\u0142ania skryptu jest adres URL, pod kt\u00f3rym dost\u0119pna jest aplikacja Price Tracker.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Wa\u017cne<\/h3>\n\n\n\n<p>Aby pomy\u015blnie uruchomi\u0107 skrypty&nbsp;deploy_aws.sh&nbsp;i&nbsp;cleanup_aws.sh&nbsp;u\u017cytkownik, skonfigurowany z AWS CLI, musi posiada\u0107 wymagane uprawnienia do przeprowadzenia wszystkich potrzebnych operacji. W pliku&nbsp;policy\/price-tracker-user.json&nbsp;znajduje si\u0119 przyk\u0142adowa polityka, kt\u00f3r\u0105 mo\u017cna do\u0142\u0105czy\u0107 do u\u017cytkownika.<\/p>\n\n\n\n<p>Kroki do powt\u00f3rzenia:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Zmodyfikuj nazw\u0119 S3 bucket w pliku app.config (wi\u0119cej informacji znajdziesz w sekcji: Uwagi dotycz\u0105ce S3 bucket, punkt 1).<\/li>\n\n\n\n<li>Uruchom skrypt: .\/scripts\/deploy_aws.sh<\/li>\n\n\n\n<li>Przejd\u017a do adresu URL (ostatnia linia zwracana ze skryptu) i sprawd\u017a, czy dzia\u0142a strona poprawnie. Zanim wykres b\u0119dzie dost\u0119pny, mo\u017ce min\u0105\u0107 kilka minut.<\/li>\n\n\n\n<li>Uruchom skrypt: .\/scripts\/cleanup_aws.sh<\/li>\n\n\n\n<li>Dobr\u0105 praktyk\u0105 jest sprawdzenie w AWS Management Console, czy wszystkie us\u0142ugi zosta\u0142y poprawnie usuni\u0119te za pomoc\u0105 skryptu czyszcz\u0105cego.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie<\/strong><\/h2>\n\n\n\n<p>W artykule \u201ePrice Tracker: praktyczne zanurzenie si\u0119 w aplikacjach serverless\u201d zaprezentowa\u0142em proces tworzenia aplikacji internetowej do \u015bledzenia cen produkt\u00f3w.<\/p>\n\n\n\n<p>Obejmuje on podstawy przetwarzania serverless, podstawowe informacje o chmurze AWS, od konfiguracji us\u0142ug takich jak Lambda i DynamoDB, planowanie wywo\u0142a\u0144 z serwisem Event Bridge Rule, po wdro\u017cenie ostatecznej aplikacji z wykorzystaniem API Gateway, demonstruj\u0105c przy tym praktyczne zastosowanie technologii serverless w rzeczywistych scenariuszach.<\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Je\u015bli interesuje Ci\u0119 temat narz\u0119dzi wykorzystywanych w IT, zajrzyj koniecznie r\u00f3wnie\u017c <a href=\"https:\/\/sii.pl\/blog\/all\/przeglad-narzedzi\/\" target=\"_blank\" aria-label=\"do innych artyku\u0142\u00f3w naszych specjalist\u00f3w (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">do innych artyku\u0142\u00f3w naszych specjalist\u00f3w<\/a>. <\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;27359&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;8&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;4.9&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;4.9\\\/5 ( votes: 8)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Price Tracker \u2013 praktyczne zanurzenie si\u0119 w aplikacjach serverless&quot;,&quot;width&quot;:&quot;136.6&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 136.6px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            4.9\/5 ( votes: 8)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>W dziedzinie nowoczesnych rozwi\u0105za\u0144 chmurowych architektura serverless jest modnym has\u0142em, cho\u0107 jej praktyczne zastosowania cz\u0119sto pozostaj\u0105 niezbadane. Celem tego artyku\u0142u &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/price-tracker-praktyczne-zanurzenie-sie-w-aplikacjach-serverless\/\">Continued<\/a><\/p>\n","protected":false},"author":481,"featured_media":26910,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[2165,1824,1546,1024,156],"class_list":["post-27359","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-pricetracker","tag-aplikacje","tag-przeglad-narzedzi","tag-aws","tag-cloud"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2024\/02\/Price-Tracker-\u2013-a-practical-dive-into-serverless-applications.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/27359"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/481"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=27359"}],"version-history":[{"count":1,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/27359\/revisions"}],"predecessor-version":[{"id":27361,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/27359\/revisions\/27361"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/26910"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=27359"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=27359"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=27359"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}