{"id":10130,"date":"2021-04-27T11:47:02","date_gmt":"2021-04-27T09:47:02","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=10130"},"modified":"2023-01-05T15:19:46","modified_gmt":"2023-01-05T14:19:46","slug":"infrastruktura-jako-kod-z-wykorzystaniem-terraform","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\/","title":{"rendered":"Infrastruktura jako kod z wykorzystaniem terraform"},"content":{"rendered":"\n<p>Ca\u0142kiem niedawno na naszym blogu pojawi\u0142 si\u0119&nbsp;<a href=\"https:\/\/sii.pl\/blog\/zalety-podejscia-infrastruktura-jako-kod-w-testowaniu-funkcjonalnym\/?category=testowanie&amp;tag=iac,infrastructure-as-code,infrastuktura-jako-kod,testowanie-funkcjonalne\">artyku\u0142&nbsp;dot. koncepcji&nbsp;\u201einfrastruktury jako kodu&#8221;<\/a>(infrastructure as code, IaC). Znaj\u0105c ju\u017c zalety takiego podej\u015bcia do zarz\u0105dzania infrastruktur\u0105, chcia\u0142bym troch\u0119 ten temat rozwin\u0105\u0107 i przedstawi\u0107 jedno z narz\u0119dzi, kt\u00f3re mo\u017cemy w tym celu wykorzysta\u0107 \u2014 terraform.<\/p>\n\n\n\n<p>Zanim jednak przejd\u0119 do przedstawiania terraformu, chcia\u0142bym wspomnie\u0107 o r\u00f3\u017cnych kategoriach narz\u0119dzi IaC:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>narz\u0119dzia do zarz\u0105dzania konfiguracj\u0105 (configuration management),<\/li><li>narz\u0119dzia instrumentacji (orchestration),<\/li><li>narz\u0119dzia do tworzenia zasob\u00f3w\/infrastruktury chmurowej (provisioning).<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Zarz\u0105dzanie konfiguracj\u0105 (configuration management)<\/strong><\/h2>\n\n\n\n<p>Do najpopularniejszych narz\u0119dzi zarz\u0105dzania konfiguracj\u0105 nale\u017c\u0105:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Ansible,<\/li><li>Puppet,<\/li><li>Chef, SaltStack.<\/li><\/ul>\n\n\n\n<p>S\u0105 to narz\u0119dzia, kt\u00f3re najcz\u0119\u015bciej s\u0142u\u017c\u0105 do instalowania oprogramowania, zarz\u0105dzania us\u0142ugami i og\u00f3lnej konfiguracji systemu. Ich cech\u0105 charakterystyczn\u0105 (jednocze\u015bnie wielk\u0105 zalet\u0105) jest powtarzalno\u015b\u0107, tzn. to, \u017ce kod raz stworzony mo\u017cemy uruchamia\u0107 wielokrotnie i za ka\u017cdym razem otrzymamy ten sam rezultat (t\u0119 sam\u0105 zadeklarowan\u0105 konfiguracj\u0119). Je\u017celi chcieliby\u015bmy napisa\u0107 skrypt w bashu, kt\u00f3ry tworzy\u0142by nam nowego u\u017cytkownika, u\u017cyliby\u015bmy:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n#!\/bin\/bash\nuseradd newuser\n<\/pre><\/div>\n\n\n<p>Przy pierwszym uruchomieniu zostanie stworzony u\u017cytkownik \u201dnewuser\u201d. Przy kolejnym uruchomieniu skryptu zostanie zwr\u00f3cony b\u0142\u0105d:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nuseradd: user 'newuser' already exists\n<\/pre><\/div>\n\n\n<p>Aby naprawi\u0107 nasz skrypt, musieliby\u015bmy doda\u0107 logik\u0119, kt\u00f3ra sprawdza\u0142aby, czy u\u017cytkownik ju\u017c istnieje, czy nie.<\/p>\n\n\n\n<p>Narz\u0119dzia do zarz\u0105dzania konfiguracj\u0105 maj\u0105 t\u0119 przewag\u0119, \u017ce nie oczekuj\u0105 od nas podawania krok\u00f3w, kt\u00f3re maj\u0105 by\u0107 wykonane (dla przyk\u0142adu: sprawd\u017a, czy folder istnieje, stw\u00f3rz folder, sprawd\u017a, czy u\u017cytkownik istnieje, stw\u00f3rz u\u017cytkownika), a oczekuj\u0105 od nas jedynie konfiguracji, kt\u00f3r\u0105 chcemy osi\u0105gn\u0105\u0107.<\/p>\n\n\n\n<p>Poni\u017cej podaj\u0119 przyk\u0142adowy kod&nbsp;ansible&nbsp;na stworzenie u\u017cytkownika:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n- name: Dodawanie nowego u\u017cytkownika \"newuser\"\n  user:\n    name: newuser\n    shell: \/bin\/bash\n    groups: admins,developers\n    append: yes\n<\/pre><\/div>\n\n\n<p>Przy pierwszym uruchomieniu Ansible&nbsp;zorientuje si\u0119, \u017ce taki u\u017cytkownik nie istnieje i go stworzy. Przy kolejnym uruchomieniu Ansible&nbsp;sprawdzi, \u017ce taki u\u017cytkownik ju\u017c zosta\u0142 stworzony i nie ma potrzeby na wykonanie kroku dodania nowego u\u017cytkownika. To jest w\u0142a\u015bnie przewaga narz\u0119dzi&nbsp;configuration management, kt\u00f3re nie oczekuj\u0105 od nas dok\u0142adnego podawania krok\u00f3w, kt\u00f3re maj\u0105 nas zaprowadzi\u0107 do celu. Wystarczy, \u017ce zdefiniujemy nasz cel, a narz\u0119dzia te postaraj\u0105 si\u0119 ten cel osi\u0105gn\u0105\u0107.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>R\u00f3\u017cnice w narz\u0119dziach do zarz\u0105dzania konfiguracj\u0105<\/strong><\/h2>\n\n\n\n<p>Je\u015bli chodzi o r\u00f3\u017cnice pomi\u0119dzy r\u00f3\u017cnymi narz\u0119dziami, to poza form\u0105 deklarowania zmian w konfiguracji (Ansible \u2014 YAML; Puppet \u2014 w\u0142asny j\u0119zyk), r\u00f3\u017cni\u0105 si\u0119 te\u017c tym, czy ich dzia\u0142anie opiera si\u0119 na pracy z agentami instalowanymi na docelowej maszynie.<\/p>\n\n\n\n<p>Wygodny pod tym wzgl\u0119dem wydaje si\u0119 Ansible, kt\u00f3ry nie wymaga od nas instalowania \u017cadnego agenta. Zaletami podej\u015bcia wykorzystuj\u0105cego agenta jest to, \u017ce taki agent jest w stanie nieustannie kontrolowa\u0107 stan naszego serwera i go poprawia\u0107 w przypadku r\u0119cznych modyfikacji, kt\u00f3re odbiegaj\u0105 od tych zadeklarowanych. Je\u017celi agent monitoruje nasz serwer, a jeden z admin\u00f3w r\u0119cznie wy\u0142\u0105czy\u0142 us\u0142ug\u0119, kt\u00f3ra wcze\u015bniej zosta\u0142a zadeklarowana jako&nbsp;w\u0142\u0105czona, to taki agent automatycznie t\u0119 us\u0142ug\u0119 w\u0142\u0105czy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Instrumentacja (orchestration)<\/strong><\/h2>\n\n\n\n<p>Do tej grupy mo\u017cemy zaliczy\u0107 narz\u0119dzia, kt\u00f3re wspieraj\u0105 prac\u0119 z kontenerami, takie jak Kubernetes, Amazon ECS\/Fargate, Docker Swarm. Do zada\u0144 tych narz\u0119dzi nale\u017cy m.in.:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Nadzorowanie aktualnego stanu naszej aplikacji, a w przypadku wykrycia zmian, doprowadzenia stanu, kt\u00f3ry zdefiniowali\u015bmy i kt\u00f3rego oczekujemy (desired state).<\/li><li>Monitorowanie prawid\u0142owego dzia\u0142ania naszych kontener\u00f3w i zast\u0119powanie ich w przypadku wykrycia nieprawid\u0142owo\u015bci.<\/li><li>Zapewnianie komunikacji pomi\u0119dzy naszymi kontenerami \/ maszynami.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Tworzenie zasob\u00f3w (provisioning)<\/strong><\/h2>\n\n\n\n<p>Zapewne ka\u017cdy na pocz\u0105tku swojej przygody z kt\u00f3r\u0105kolwiek chmur\u0105, zaczyna\u0142 od tworzenia zasob\u00f3w, wykorzystuj\u0105c do tego interfejs webowy&nbsp;\u2014 dobry na pocz\u0105tek, przejrzysty, \u0142atwy. Z czasem pojawia si\u0119 jednak konieczno\u015b\u0107 zautomatyzowania wielu czynno\u015bci i u\u0142atwienia sobie pracy. Czas na kolejny krok, kt\u00f3rym jest wykorzystanie gotowych narz\u0119dzi CLI.<\/p>\n\n\n\n<p>Szybko dochodzimy jednak do wniosku, \u017ce takie zarz\u0105dzanie infrastruktur\u0105 za pomoc\u0105, czy to AWS CLI czy Azure CLI, zaczyna przypomina\u0107 zarz\u0105dzanie konfiguracj\u0105 serwera za pomoc\u0105 basha. Nadchodzi czas na wykorzystanie dedykowanego narz\u0119dzia, kt\u00f3re zosta\u0142o stworzone w\u0142a\u015bnie w tym celu. W przypadku pracy z AWS mamy do dyspozycji CloudFormation, w przypadku Azure b\u0119d\u0105 to ARM Templates.<\/p>\n\n\n\n<p>Je\u015bli jednak chcieliby\u015bmy, aby nasz zainwestowany czas nie ogranicza\u0142 nas tylko do jednego dostawcy, powinni\u015bmy zdecydowa\u0107 si\u0119 na terraform.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Terraform<\/strong><\/h2>\n\n\n\n<p>Terraform pobieramy ze strony&nbsp;<a href=\"https:\/\/www.terraform.io\/downloads.html\" rel=\"nofollow\" >terraform.io<\/a>. Dzi\u0119ki temu, \u017ce jest napisany w j\u0119zyku Go, mamy do czynienia z pojedynczym plikiem binarnym, kt\u00f3ry umieszczamy w dowolnym miejscu w naszej \u015bcie\u017cce systemowej&nbsp;PATH.<\/p>\n\n\n\n<p><strong>Wskaz\u00f3wka:<\/strong> je\u015bli pracujemy z chmur\u0105 Azure, mo\u017cemy korzysta\u0107 z terraform, wykorzystuj\u0105c do tego \u201dcloud shell\u201d, czyli terminal uruchamiany w przegl\u0105darce dla naszego konta.<\/p>\n\n\n\n<p>Konfiguracj\u0119 naszej infrastruktury definiujemy w j\u0119zyku&nbsp;HCL, Hashicorp Configuration Language, w plikach z rozszerzeniem&nbsp;*.tf, kt\u00f3re w wielkim uproszczeniu maj\u0105 nast\u0119puj\u0105c\u0105 sk\u0142adni\u0119:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nresource \"rodzaj_zasobu\" \"nazwa_dla_naszego_zasobu_w_terraform\" {\n    name     = \"nazwa_zasobu_w_chmurze\"\n    location = \"westeurope\" # atrybut\n  }\n<\/pre><\/div>\n\n\n<p>Przyk\u0142ad dla tworzenia \u201eGrupy zasob\u00f3w\u201d (Resource group) w chmurze Azure:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nresource \"azurerm_resource_group\" \"moja_grupa\" {\n    name     = \"ResourceGroup\"\n    location = \"West Europe\"\n  }\n<\/pre><\/div>\n\n\n<p>Przyk\u0142ad dla wirtualnej maszyny w AWS:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n  resource \"aws_instance\" \"vm1\" {\n    ami           = \"ami-830c94e3\"\n    instance_type = \"t2.micro\"\n  }\n<\/pre><\/div>\n\n\n<p>Jedn\u0105 z wielu zalet terraform jest fakt, \u017ce za jego pomoc\u0105 mo\u017cemy tworzy\u0107 zasoby po stronie r\u00f3\u017cnych dostawc\u00f3w us\u0142ug chmurowych i to nie tylko tych najwi\u0119kszych jak AWS, Azure, GCP, ale r\u00f3wnie\u017c tych mniejszych (np. DigitalOcean). Terraform komunikuje si\u0119 bezpo\u015brednio z API danego dostawcy us\u0142ug, tworz\u0105c zasoby, kt\u00f3re zdefiniowali\u015bmy w plikach&nbsp;*.tf.<\/p>\n\n\n\n<p>Aby terraform\u00a0wiedzia\u0142,\u00a0czy ma do czynienia z AWS, Azure czy GCP, definiujemy dostawc\u0119 (provider) dla naszego kodu:<\/p>\n\n\n\n<p>Przyk\u0142ad dla Azure:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n  terraform {\n    required_providers {\n      azurerm = {\n        source  = &quot;hashicorp\/azurerm&quot;\n        version = &quot;~&gt; 2.39&quot;\n      }\n    }\n  }\n\n  provider &quot;azurerm&quot; {\n    subscription_id = &quot;id_naszej_subskrypcji&quot;\n    features {}\n  }\n<\/pre><\/div>\n\n\n<p>i dla AWS:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n  terraform {\n    required_providers {\n      aws = {\n        source  = &quot;hashicorp\/aws&quot;\n        version = &quot;~&gt; 3.0&quot;\n      }\n    }\n  }\n\n  provider &quot;aws&quot; {\n    region = &quot;region&quot;\n    features {}\n  }\n<\/pre><\/div>\n\n\n<p>Jak mo\u017cna zauwa\u017cy\u0107, w \u017cadnym miejscu dotychczas nie podali\u015bmy informacji uwierzytelniaj\u0105cych.<br>Je\u017celi pracujemy z chmur\u0105 Azure, mamy lokalnie zainstalowany \u201eazure cli\u201d i chcemy z naszej lokalnej maszyny wykona\u0107 kod terraform, to nie potrzebujemy podawa\u0107 \u017cadnych dodatkowych informacji. Terraform automatycznie wykorzysta azure cli, \u017ceby si\u0119 uwierzytelni\u0107. W przypadku serwer\u00f3w CI (lub braku azure cli) mo\u017cemy stworzy\u0107 w chmurze \u201eJednostk\u0119 Us\u0142ugi\u201d (ang. Service Principal) i ustawi\u0107 na danym ho\u015bcie zmienne \u015brodowiskowe:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nARM_CLIENT_ID=\"00000000-0000-0000-0000-000000000000\"\nARM_CLIENT_SECRET=\"00000000-0000-0000-0000-000000000000\"\nARM_SUBSCRIPTION_ID=\"00000000-0000-0000-0000-000000000000\"\nARM_TENANT_ID=\"00000000-0000-0000-0000-000000000000\"\n<\/pre><\/div>\n\n\n<p>W przypadku AWS, jednym ze sposob\u00f3w uwierzytelnienia b\u0119dzie zdefiniowanie zmiennych \u015brodowiskowych:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nAWS_ACCESS_KEY_ID=\"xxx\"\nAWS_SECRET_ACCESS_KEY=\"zzz\"\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong>Terraform \u2013 przyk\u0142ad<\/strong><\/h2>\n\n\n\n<p>Maj\u0105c ju\u017c skonfigurowanego terraforma, przedstawi\u0119 poni\u017cej przyk\u0142ad dla Azure\u2019a kt\u00f3ry tworzy:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Grup\u0119 Zasob\u00f3w<\/li><li>App Service Plan<\/li><li>App Service<\/li><\/ul>\n\n\n\n<p>Nasza konfiguracja dla Azure:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nterraform {\n    required_providers {\n      azurerm = {\n        source  = &quot;hashicorp\/azurerm&quot;\n        version = &quot;~&gt; 2.39&quot;\n      }\n    }\n  }\n\n  provider &quot;azurerm&quot; {\n    subscription_id = &quot;id_naszej_subskrypcji&quot;\n    features {}\n  }\n<\/pre><\/div>\n\n\n<p>Definiujemy nowy zas\u00f3b typu azurerm_resource_group (Grupa Zasob\u00f3w), przypisujemy mu nazw\u0119 &#8222;example&#8221;, kt\u00f3rej b\u0119dziemy mogli u\u017cy\u0107, aby odwo\u0142a\u0107 si\u0119 do tego zasobu<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nresource \"azurerm_resource_group\" \"example\" {\n    name     = \"example-resources\" \/\/ Nazwa pod jak\u0105 dany zas\u00f3b zostanie stworzony w chmurze\n    location = \"West Europe\"       \/\/ Region, w kt\u00f3rym dany zas\u00f3b zostanie stworzony\n  }\n<\/pre><\/div>\n\n\n<p>Definiujemy kolejny zas\u00f3b typu azurerm_app_service_plan (App Service Plan)<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nresource \"azurerm_app_service_plan\" \"example\" {\n    name = \"example-appserviceplan\"\n    location = azurerm_resource_group.example.location\n<\/pre><\/div>\n\n\n<p>Jako \u017ce ka\u017cdy zas\u00f3b musi by\u0107 umieszczony w grupie zasob\u00f3w, a w naszym przypadku grupa zasob\u00f3w jest tworzona wy\u017cej w kodzie, odwo\u0142ujemy si\u0119 do nazwy tej nowo tworzonej grupy i &#8222;pobieramy&#8221; warto\u015b\u0107 atrybutu &#8222;name&#8221;<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nresource_group_name = azurerm_resource_group.example.name\n<\/pre><\/div>\n\n\n<p>Definiujemy parametry dla App Service Planu<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n    sku {\n      tier = \"Standard\"\n      size = \"S1\"\n    }\n  }\n<\/pre><\/div>\n\n\n<p>Definiujemy nowy zas\u00f3b typu azurerm_app_service (App Service)<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nresource \"azurerm_app_service\" \"example\" {\n    name = \"example-app-service\"\n<\/pre><\/div>\n\n\n<p>Poni\u017cej odwo\u0142ujemy si\u0119 do grupy zasob\u00f3w, pobieramy warto\u015b\u0107 dla regionu i ustawiamy tak\u0105 sam\u0105 warto\u015b\u0107 dla naszego app service&#8217;u.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nlocation = azurerm_resource_group.example.location\n    resource_group_name = azurerm_resource_group.example.name\n<\/pre><\/div>\n\n\n<p>Definiujemy, w jakim planie powinien zosta\u0107 stworzony nasz app service<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\napp_service_plan_id = azurerm_app_service_plan.example.id\n<\/pre><\/div>\n\n\n<p>Definiujemy dodatkow\u0105 konfiguracj\u0119<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n    site_config {\n      dotnet_framework_version = \"v4.0\"\n    }\n\n    app_settings = {\n      \"SOME_KEY\" = \"some-value\"\n    }\n\n    connection_string {\n      name  = \"Database\"\n      type  = \"SQLServer\"\n      value = \"Server=some-server.mydomain.com;Integrated Security=SSPI\"\n    }\n  }\n<\/pre><\/div>\n\n\n<p>Maj\u0105c w jednym katalogu plik *.tf z powy\u017csz\u0105 tre\u015bci\u0105, wykonujemy kolejno:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>terraform init&nbsp;(zainicjalozowanie terraforma; pobranie odpowiednich wtyczek pod odpowiedniego dostawc\u0119 \u2014 w naszym przypadku azure),<\/li><li>terraform plan&nbsp;(por\u00f3wnanie naszej zdefiniowanej konfiguracji w plikach *.tf ze stanem faktycznym zasob\u00f3w w chmurze i przedstawienie zmian):<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nAn execution plan has been generated and is shown below.\n  Resource actions are indicated with the following symbols:\n    + create\n\n  Terraform will perform the following actions:\n\n    # azurerm_app_service.example will be created\n    + resource \"azurerm_app_service\" \"example\" {\n        + app_service_plan_id               = (known after apply)\n        + app_settings                      = {\n            + \"SOME_KEY\" = \"some-value\"\n          }\n  ------------\n  wyci\u0119te informacje na temat zasob\u00f3w i zmian\n  ------------\n\n  Plan: 3 to add, 0 to change, 0 to destroy.\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>terraform apply&nbsp;(wprowadzenie zmian, kt\u00f3re zosta\u0142y nam przedstawione w wyniku komendy terraform plan).<\/li><\/ul>\n\n\n\n<p>Po wykonaniu ostatniej komendy powinni\u015bmy widzie\u0107 nasze nowo zdefiniowane zasoby w chmurze.<br>Je\u015bli chcemy pozby\u0107 si\u0119 zasob\u00f3w zarz\u0105dzanych przez terraform, mo\u017cemy u\u017cy\u0107 polecenia&nbsp;terraform destroy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Terraform \u2013 co dalej<\/strong><\/h2>\n\n\n\n<p>Niestety niemo\u017cliwe jest kompletne przedstawienie narz\u0119dzia terraform w jednym wpisie. Nie zosta\u0142 poruszony temat plik\u00f3w stanu (*.tfstate), bezpiecze\u0144stwa konfiguracji i integracji terraform z systemami CI\/CD.<\/p>\n\n\n\n<p>Je\u015bli na co dzie\u0144 jeste\u015b odpowiedzialny za zarz\u0105dzanie zasobami w chmurze lub po prostu zaciekawi\u0142o ci\u0119 to narz\u0119dzie, to zach\u0119cam do udania si\u0119 na oficjaln\u0105 stron\u0119&nbsp;<a href=\"https:\/\/www.terraform.io\/intro\/index.html\" rel=\"nofollow\" >terraform.io<\/a>&nbsp;po wi\u0119cej informacji i przyk\u0142ad\u00f3w.<\/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;10130&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;9&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;2&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5&quot;,&quot;size&quot;:&quot;30&quot;,&quot;title&quot;:&quot;Infrastruktura jako kod z wykorzystaniem terraform&quot;,&quot;width&quot;:&quot;159&quot;,&quot;_legend&quot;:&quot;{score}\\\/5&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: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 159px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 24px;\">\n            5\/5    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Ca\u0142kiem niedawno na naszym blogu pojawi\u0142 si\u0119&nbsp;artyku\u0142&nbsp;dot. koncepcji&nbsp;\u201einfrastruktury jako kodu&#8221;(infrastructure as code, IaC). Znaj\u0105c ju\u017c zalety takiego podej\u015bcia do zarz\u0105dzania &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\/\">Continued<\/a><\/p>\n","protected":false},"author":271,"featured_media":10495,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":5,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[560,1024,961],"class_list":["post-10130","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-architektura-it","tag-aws","tag-azure"],"acf":[],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.9 - aioseo.com -->\n\t<meta name=\"description\" content=\"W artykule rozwijam temat infrastruktury jako kodu, uwzgl\u0119dniaj\u0105c narz\u0119dzie, kt\u00f3re warto do tego wykorzysta\u0107, czyli terraform i jego przyk\u0142adowe zastosowanie\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Hubert Trzeci\u0144ski\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/sii.pl\/blog\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.9\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"blogersii\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Infrastruktura jako kod z wykorzystaniem terraform\" \/>\n\t\t<meta property=\"og:description\" content=\"W artykule rozwijam temat infrastruktury jako kodu, uwzgl\u0119dniaj\u0105c narz\u0119dzie, kt\u00f3re warto do tego wykorzysta\u0107, czyli terraform i jego przyk\u0142adowe zastosowanie\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/sii.pl\/blog\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/01\/blog.png\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/01\/blog.png\" \/>\n\t\t<meta property=\"og:image:width\" content=\"850\" \/>\n\t\t<meta property=\"og:image:height\" content=\"416\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2021-04-27T09:47:02+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2023-01-05T14:19:46+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Sii.Polska\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Infrastruktura jako kod z wykorzystaniem terraform\" \/>\n\t\t<meta name=\"twitter:description\" content=\"W artykule rozwijam temat infrastruktury jako kodu, uwzgl\u0119dniaj\u0105c narz\u0119dzie, kt\u00f3re warto do tego wykorzysta\u0107, czyli terraform i jego przyk\u0142adowe zastosowanie\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/01\/blog.png\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\\\/#article\",\"name\":\"Infrastruktura jako kod z wykorzystaniem terraform\",\"description\":\"W artykule rozwijam temat infrastruktury jako kodu, uwzgl\\u0119dniaj\\u0105c narz\\u0119dzie, kt\\u00f3re warto do tego wykorzysta\\u0107, czyli terraform i jego przyk\\u0142adowe zastosowanie\",\"inLanguage\":\"pl-PL\",\"headline\":\"Infrastruktura jako kod z wykorzystaniem terraform\",\"author\":{\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/author\\\/hubert-trzecinski\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/sii.pl\\\/#organization\"},\"datePublished\":\"2021-04-27T09:47:02+02:00\",\"dateModified\":\"2023-01-05T14:19:46+01:00\",\"articleSection\":\"Development na twardo, Architektura IT, AWS, Azure\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\\\/#webpage\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/sii.pl\\\/blog\\\/wp-content\\\/uploads\\\/2021\\\/01\\\/blog.png\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\\\/#articleImage\",\"width\":850,\"height\":416}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/sii.pl\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/development-na-twardo\\\/#listItem\",\"name\":\"Development na twardo\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/development-na-twardo\\\/#listItem\",\"position\":2,\"name\":\"Development na twardo\",\"item\":\"https:\\\/\\\/sii.pl\\\/blog\\\/development-na-twardo\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\\\/#listItem\",\"name\":\"Infrastruktura jako kod z wykorzystaniem terraform\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\\\/#listItem\",\"position\":3,\"name\":\"Infrastruktura jako kod z wykorzystaniem terraform\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/development-na-twardo\\\/#listItem\",\"name\":\"Development na twardo\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/sii.pl\\\/#organization\",\"name\":\"Sii Polska\",\"url\":\"https:\\\/\\\/sii.pl\\\/blog\\\/\",\"sameAs\":[\"https:\\\/\\\/www.instagram.com\\\/siipolska\\\/\",\"https:\\\/\\\/www.tiktok.com\\\/@siipolska\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCQ3UQ7RJPEYnAWC_rPE5Dxg\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/sii-polska\",\"https:\\\/\\\/clutch.co\\\/profile\\\/sii-poland\",\"https:\\\/\\\/www.crunchbase.com\\\/organization\\\/sii\",\"https:\\\/\\\/www.wikidata.org\\\/wiki\\\/Q16601096\"]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\\\/#webpage\",\"url\":\"https:\\\/\\\/sii.pl\\\/blog\\\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\\\/\",\"name\":\"Infrastruktura jako kod z wykorzystaniem terraform\",\"description\":\"W artykule rozwijam temat infrastruktury jako kodu, uwzgl\\u0119dniaj\\u0105c narz\\u0119dzie, kt\\u00f3re warto do tego wykorzysta\\u0107, czyli terraform i jego przyk\\u0142adowe zastosowanie\",\"inLanguage\":\"pl-PL\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\\\/#breadcrumblist\"},\"author\":\"https:\\\/\\\/sii.pl\\\/blog\\\/author\\\/hubert-trzecinski\\\/#author\",\"creator\":\"https:\\\/\\\/sii.pl\\\/blog\\\/author\\\/hubert-trzecinski\\\/#author\",\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/sii.pl\\\/blog\\\/wp-content\\\/uploads\\\/2021\\\/01\\\/blog.png\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\\\/#mainImage\",\"width\":850,\"height\":416},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\\\/#mainImage\"},\"datePublished\":\"2021-04-27T09:47:02+02:00\",\"dateModified\":\"2023-01-05T14:19:46+01:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/sii.pl\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/sii.pl\\\/blog\\\/\",\"name\":\"blogersii\",\"description\":\"Blog technologiczny Sii \\u2013 praktyczna wiedza od ekspert\\u00f3w\",\"inLanguage\":\"pl-PL\",\"publisher\":{\"@id\":\"https:\\\/\\\/sii.pl\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Infrastruktura jako kod z wykorzystaniem terraform","description":"W artykule rozwijam temat infrastruktury jako kodu, uwzgl\u0119dniaj\u0105c narz\u0119dzie, kt\u00f3re warto do tego wykorzysta\u0107, czyli terraform i jego przyk\u0142adowe zastosowanie","canonical_url":"https:\/\/sii.pl\/blog\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/sii.pl\/blog\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\/#article","name":"Infrastruktura jako kod z wykorzystaniem terraform","description":"W artykule rozwijam temat infrastruktury jako kodu, uwzgl\u0119dniaj\u0105c narz\u0119dzie, kt\u00f3re warto do tego wykorzysta\u0107, czyli terraform i jego przyk\u0142adowe zastosowanie","inLanguage":"pl-PL","headline":"Infrastruktura jako kod z wykorzystaniem terraform","author":{"@id":"https:\/\/sii.pl\/blog\/author\/hubert-trzecinski\/#author"},"publisher":{"@id":"https:\/\/sii.pl\/#organization"},"datePublished":"2021-04-27T09:47:02+02:00","dateModified":"2023-01-05T14:19:46+01:00","articleSection":"Development na twardo, Architektura IT, AWS, Azure","mainEntityOfPage":{"@id":"https:\/\/sii.pl\/blog\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\/#webpage"},"isPartOf":{"@id":"https:\/\/sii.pl\/blog\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\/#webpage"},"image":{"@type":"ImageObject","url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/01\/blog.png","@id":"https:\/\/sii.pl\/blog\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\/#articleImage","width":850,"height":416}},{"@type":"BreadcrumbList","@id":"https:\/\/sii.pl\/blog\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/sii.pl\/blog#listItem","position":1,"name":"Home","item":"https:\/\/sii.pl\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/sii.pl\/blog\/development-na-twardo\/#listItem","name":"Development na twardo"}},{"@type":"ListItem","@id":"https:\/\/sii.pl\/blog\/development-na-twardo\/#listItem","position":2,"name":"Development na twardo","item":"https:\/\/sii.pl\/blog\/development-na-twardo\/","nextItem":{"@type":"ListItem","@id":"https:\/\/sii.pl\/blog\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\/#listItem","name":"Infrastruktura jako kod z wykorzystaniem terraform"},"previousItem":{"@type":"ListItem","@id":"https:\/\/sii.pl\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/sii.pl\/blog\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\/#listItem","position":3,"name":"Infrastruktura jako kod z wykorzystaniem terraform","previousItem":{"@type":"ListItem","@id":"https:\/\/sii.pl\/blog\/development-na-twardo\/#listItem","name":"Development na twardo"}}]},{"@type":"Organization","@id":"https:\/\/sii.pl\/#organization","name":"Sii Polska","url":"https:\/\/sii.pl\/blog\/","sameAs":["https:\/\/www.instagram.com\/siipolska\/","https:\/\/www.tiktok.com\/@siipolska","https:\/\/www.youtube.com\/channel\/UCQ3UQ7RJPEYnAWC_rPE5Dxg","https:\/\/www.linkedin.com\/company\/sii-polska","https:\/\/clutch.co\/profile\/sii-poland","https:\/\/www.crunchbase.com\/organization\/sii","https:\/\/www.wikidata.org\/wiki\/Q16601096"]},{"@type":"WebPage","@id":"https:\/\/sii.pl\/blog\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\/#webpage","url":"https:\/\/sii.pl\/blog\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\/","name":"Infrastruktura jako kod z wykorzystaniem terraform","description":"W artykule rozwijam temat infrastruktury jako kodu, uwzgl\u0119dniaj\u0105c narz\u0119dzie, kt\u00f3re warto do tego wykorzysta\u0107, czyli terraform i jego przyk\u0142adowe zastosowanie","inLanguage":"pl-PL","isPartOf":{"@id":"https:\/\/sii.pl\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/sii.pl\/blog\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\/#breadcrumblist"},"author":"https:\/\/sii.pl\/blog\/author\/hubert-trzecinski\/#author","creator":"https:\/\/sii.pl\/blog\/author\/hubert-trzecinski\/#author","image":{"@type":"ImageObject","url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/01\/blog.png","@id":"https:\/\/sii.pl\/blog\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\/#mainImage","width":850,"height":416},"primaryImageOfPage":{"@id":"https:\/\/sii.pl\/blog\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\/#mainImage"},"datePublished":"2021-04-27T09:47:02+02:00","dateModified":"2023-01-05T14:19:46+01:00"},{"@type":"WebSite","@id":"https:\/\/sii.pl\/blog\/#website","url":"https:\/\/sii.pl\/blog\/","name":"blogersii","description":"Blog technologiczny Sii \u2013 praktyczna wiedza od ekspert\u00f3w","inLanguage":"pl-PL","publisher":{"@id":"https:\/\/sii.pl\/#organization"}}]},"og:locale":"pl_PL","og:site_name":"blogersii","og:type":"article","og:title":"Infrastruktura jako kod z wykorzystaniem terraform","og:description":"W artykule rozwijam temat infrastruktury jako kodu, uwzgl\u0119dniaj\u0105c narz\u0119dzie, kt\u00f3re warto do tego wykorzysta\u0107, czyli terraform i jego przyk\u0142adowe zastosowanie","og:url":"https:\/\/sii.pl\/blog\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\/","og:image":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/01\/blog.png","og:image:secure_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/01\/blog.png","og:image:width":850,"og:image:height":416,"article:published_time":"2021-04-27T09:47:02+00:00","article:modified_time":"2023-01-05T14:19:46+00:00","article:publisher":"https:\/\/www.facebook.com\/Sii.Polska","twitter:card":"summary","twitter:title":"Infrastruktura jako kod z wykorzystaniem terraform","twitter:description":"W artykule rozwijam temat infrastruktury jako kodu, uwzgl\u0119dniaj\u0105c narz\u0119dzie, kt\u00f3re warto do tego wykorzysta\u0107, czyli terraform i jego przyk\u0142adowe zastosowanie","twitter:image":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/01\/blog.png"},"aioseo_meta_data":{"post_id":"10130","title":"Infrastruktura jako kod z wykorzystaniem terraform","description":"W artykule rozwijam temat infrastruktury jako kodu, uwzgl\u0119dniaj\u0105c narz\u0119dzie, kt\u00f3re warto do tego wykorzysta\u0107, czyli terraform i jego przyk\u0142adowe zastosowanie","keywords":[],"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":"","og_description":"","og_object_type":"article","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":"","og_article_tags":"","twitter_use_og":false,"twitter_card":"summary","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":{"id":"#aioseo-article-64670e8f23ff8","slug":"article","graphName":"Article","label":"Article","properties":{"type":"BlogPosting","name":"#post_title","headline":"#post_title","description":"#post_excerpt","image":"","keywords":"","author":{"name":"#author_name","url":"#author_url"},"dates":{"include":true,"datePublished":"","dateModified":""}}},"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":"{\"article\":{\"articleType\":\"BlogPosting\"},\"course\":{\"name\":\"\",\"description\":\"\",\"provider\":\"\"},\"faq\":{\"pages\":[]},\"product\":{\"reviews\":[]},\"recipe\":{\"ingredients\":[],\"instructions\":[],\"keywords\":[]},\"software\":{\"reviews\":[],\"operatingSystems\":[]},\"webPage\":{\"webPageType\":\"WebPage\"}}","pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"limit_modified_date":false,"created":"2021-10-15 05:16:54","updated":"2023-05-19 05:52:15","ai":null,"breadcrumb_settings":null,"seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/sii.pl\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/sii.pl\/blog\/development-na-twardo\/\" title=\"Development na twardo\">Development na twardo<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tInfrastruktura jako kod z wykorzystaniem terraform\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/sii.pl\/blog"},{"label":"Development na twardo","link":"https:\/\/sii.pl\/blog\/development-na-twardo\/"},{"label":"Infrastruktura jako kod z wykorzystaniem terraform","link":"https:\/\/sii.pl\/blog\/infrastruktura-jako-kod-z-wykorzystaniem-terraform\/"}],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/01\/blog.png","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/10130","targetHints":{"allow":["GET"]}}],"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\/271"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=10130"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/10130\/revisions"}],"predecessor-version":[{"id":18211,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/10130\/revisions\/18211"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/10495"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=10130"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=10130"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=10130"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}