{"id":8019,"date":"2024-07-02T14:55:42","date_gmt":"2024-07-02T12:55:42","guid":{"rendered":"https:\/\/www.credativ.de\/?p=8019"},"modified":"2024-07-02T13:22:11","modified_gmt":"2024-07-02T11:22:11","slug":"instaclustr-managed-postgres-with-terraform-part-1","status":"publish","type":"post","link":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/instaclustr-managed-postgres-with-terraform-part-1\/","title":{"rendered":"Instaclustr Managed Postgres with Terraform Part 1"},"content":{"rendered":"<p><a href=\"https:\/\/www.terraform.io\/\">Hashicorp Terraform<\/a> is a well-known infrastructure automation tool mostly targeting cloud deployments. <a href=\"https:\/\/www.instaclustr.com\/\">Instaclustr<\/a> (a part of NetApp\u2019s CloudOps division and credativ\u2019s parent company) provides a managed service for various data stores, including PostgreSQL. Provisioning managed clusters is possible via the <a href=\"https:\/\/console2.instaclustr.com\/\">Instaclustr console<\/a>, a <a href=\"https:\/\/www.instaclustr.com\/support\/api-integrations\/api-reference\/provisioning-api\/\">REST API<\/a> or through the <a href=\"https:\/\/registry.terraform.io\/providers\/instaclustr\/instaclustr\/latest\">Instaclustr Terraform Provider<\/a>.<\/p>\n<p>In this first part of a blog series, it is shown how a Postgres cluster can be provisioned using the Instaclustr Terraform Provider, including whitelisting the IP address and finally connecting to it via the <code>psql<\/code> command-line client.<\/p>\n<h2 id=\"initial-setup\">Initial Setup<\/h2>\n<p>The general requirement is having an account for the Instaclustr Managed service. The web console is located at <a class=\"uri\" href=\"https:\/\/console2.instaclustr.com\/\">https:\/\/console2.instaclustr.com\/<\/a>. Next, a provisioning API key needs to be created if not available already, as explained <a href=\"https:\/\/www.instaclustr.com\/support\/documentation\/console-features\/api-keys\/\">here<\/a>.<\/p>\n<p>Terraform providers are usually defined and configured in a file called <code>provider.tf<\/code>. For the Instaclustr Terraform provider, this means adding it to the list of required providers and setting the API key mentioned above:<\/p>\n<pre class=\"hcl\"><code>terraform {\r\n  required_providers {\r\n    instaclustr = {\r\n      source  = \"instaclustr\/instaclustr\"\r\n      version = \"&gt;= 2.0.0, &lt; 3.0.0\"\r\n    }\r\n  }\r\n}\r\n\r\nvariable \"ic_username\" {\r\n  type = string\r\n}\r\nvariable \"ic_api_key\" {\r\n  type = string\r\n}\r\n\r\nprovider \"instaclustr\" {\r\n    terraform_key = \"Instaclustr-Terraform ${var.ic_username}:${var.ic_api_key}\"\r\n}<\/code><\/pre>\n<p>Here, <code>ic_username<\/code> and <code>ic_api_key<\/code> are defined as variables. They should be set in a <code>terraform.tfvars<\/code> file in the same directory<\/p>\n<pre><code>ic_username       = \"username\"\r\nic_api_key        = \"0db87a8bd1[...]\"<\/code><\/pre>\n<p>As the final preparatory step, Terraform needs to be initialized, installing the provider:<\/p>\n<pre><code>$ terraform init\r\n\r\nInitializing the backend...\r\n\r\nInitializing provider plugins...\r\n- Finding instaclustr\/instaclustr versions matching \"&gt;= 2.0.0, &lt; 3.0.0\"...\r\n- Installing instaclustr\/instaclustr v2.0.136...\r\n- Installed instaclustr\/instaclustr v2.0.136 (self-signed, key ID 58D5F4E6CBB68583)\r\n\r\n[...]\r\n\r\nTerraform has been successfully initialized!<\/code><\/pre>\n<h2 id=\"defining-resources\">Defining Resources<\/h2>\n<p>Terraform resources define infrastructure objects, in our case a managed PostgreSQL cluster. Customarily, they are defined in a <code>main.tf<\/code> file, but any other file name can be chosen:<\/p>\n<pre class=\"hcl\"><code>resource \"instaclustr_postgresql_cluster_v2\" \"main\" {\r\n  name                    = \"username-test1\"\r\n  postgresql_version      = \"16.2.0\"\r\n  private_network_cluster = false\r\n  sla_tier                = \"NON_PRODUCTION\"\r\n  synchronous_mode_strict = false\r\n  data_centre {\r\n    name                         = \"AWS_VPC_US_EAST_1\"\r\n    cloud_provider               = \"AWS_VPC\"\r\n    region                       = \"US_EAST_1\"\r\n    node_size                    = \"PGS-DEV-t4g.small-5\"\r\n    number_of_nodes              = \"2\"\r\n    network                      = \"10.4.0.0\/16\"\r\n    client_to_cluster_encryption = true\r\n    intra_data_centre_replication {\r\n      replication_mode           = \"ASYNCHRONOUS\"\r\n    }\r\n    inter_data_centre_replication {\r\n      is_primary_data_centre = true\r\n    }\r\n  }\r\n}<\/code><\/pre>\n<p>The above defines a 2-node cluster named <code>username-test1<\/code> (and referred to internally as <code>main<\/code> by Terraform) in the AWS <code>US_EAST_1<\/code> region with <code>PGS-DEV-t4g.small-5<\/code> instance sizes (2 vCores, 2 GB RAM, 5 GB data disk) for the nodes. Test\/developer instance sizes for the other cloud providers would be:<\/p>\n<table>\n<colgroup>\n<col style=\"width: 17%;\" \/>\n<col style=\"width: 17%;\" \/>\n<col style=\"width: 35%;\" \/>\n<col style=\"width: 11%;\" \/>\n<col style=\"width: 8%;\" \/>\n<col style=\"width: 9%;\" \/> <\/colgroup>\n<thead>\n<tr class=\"header\">\n<th>Cloud Provider<\/th>\n<th>Default Region<\/th>\n<th>Instance Size<\/th>\n<th>Data Disk<\/th>\n<th>RAM<\/th>\n<th>CPU<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr class=\"odd\">\n<td><code>AWS_VPC<\/code><\/td>\n<td><code>US_EAST_1<\/code><\/td>\n<td><code>PGS-DEV-t4g.small-5<\/code><\/td>\n<td>5 GB<\/td>\n<td>2 GB<\/td>\n<td>2 Cores<\/td>\n<\/tr>\n<tr class=\"even\">\n<td><code>AWS_VPC<\/code><\/td>\n<td><code>US_EAST_1<\/code><\/td>\n<td><code>PGS-DEV-t4g.medium-30<\/code><\/td>\n<td>30 GB<\/td>\n<td>4 GB<\/td>\n<td>2 Cores<\/td>\n<\/tr>\n<tr class=\"odd\">\n<td><code>AZURE_AZ<\/code><\/td>\n<td><code>CENTRAL_US<\/code><\/td>\n<td><code>PGS-DEV-Standard_DS1_v2-5-an<\/code><\/td>\n<td>5 GB<\/td>\n<td>3.5 GB<\/td>\n<td>1 Core<\/td>\n<\/tr>\n<tr class=\"even\">\n<td><code>AZURE_AZ<\/code><\/td>\n<td><code>CENTRAL_US<\/code><\/td>\n<td><code>PGS-DEV-Standard_DS1_v2-30-an<\/code><\/td>\n<td>30 GB<\/td>\n<td>3.5 GB<\/td>\n<td>1 Core<\/td>\n<\/tr>\n<tr class=\"odd\">\n<td><code>GCP<\/code><\/td>\n<td><code>us-west1<\/code><\/td>\n<td><code>PGS-DEV-n2-standard-2-5<\/code><\/td>\n<td>5 GB<\/td>\n<td>8 GB<\/td>\n<td>2 Cores<\/td>\n<\/tr>\n<tr class=\"even\">\n<td><code>GCP<\/code><\/td>\n<td><code>us-west1<\/code><\/td>\n<td><code>PGS-DEV-n2-standard-2-30<\/code><\/td>\n<td>30 GB<\/td>\n<td>8 GB<\/td>\n<td>2 Core<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Other instance sizes or regions can be looked up in the console or in the section <code>node_size<\/code> of the <a href=\"https:\/\/registry.terraform.io\/providers\/instaclustr\/instaclustr\/latest\/docs\/resources\/postgresql_cluster_v2#nested-schema-for-data_centre\">Instaclustr Terraform Provider documentation<\/a>.<\/p>\n<h2 id=\"running-terraform\">Running Terraform<\/h2>\n<p>Before letting Terraform provision the defined resources, it is best-practice to run <code>terraform plan<\/code>. This lets Terraform plan the provisioning as a dry-run, and makes it possible to review the expected actions before creating any actual infrastructure:<\/p>\n<pre><code>$ terraform plan\r\n\r\nTerraform used the selected providers to generate the following execution plan. Resource actions are\r\nindicated with the following symbols:\r\n  + create\r\n\r\nTerraform will perform the following actions:\r\n\r\n  # instaclustr_postgresql_cluster_v2.main will be created\r\n  + resource \"instaclustr_postgresql_cluster_v2\" \"main\" {\r\n      + current_cluster_operation_status = (known after apply)\r\n      + default_user_password            = (sensitive value)\r\n      + description                      = (known after apply)\r\n      + id                               = (known after apply)\r\n      + name                             = \"username-test1\"\r\n      + pci_compliance_mode              = (known after apply)\r\n      + postgresql_version               = \"16.2.0\"\r\n      + private_network_cluster          = false\r\n      + sla_tier                         = \"NON_PRODUCTION\"\r\n      + status                           = (known after apply)\r\n      + synchronous_mode_strict          = false\r\n\r\n      + data_centre {\r\n          + client_to_cluster_encryption     = true\r\n          + cloud_provider                   = \"AWS_VPC\"\r\n          + custom_subject_alternative_names = (known after apply)\r\n          + id                               = (known after apply)\r\n          + name                             = \"AWS_VPC_US_EAST_1\"\r\n          + network                          = \"10.4.0.0\/16\"\r\n          + node_size                        = \"PGS-DEV-t4g.small-5\"\r\n          + number_of_nodes                  = 2\r\n          + provider_account_name            = (known after apply)\r\n          + region                           = \"US_EAST_1\"\r\n          + status                           = (known after apply)\r\n\r\n          + intra_data_centre_replication {\r\n              + replication_mode = \"ASYNCHRONOUS\"\r\n            }\r\n        }\r\n    }\r\n\r\nPlan: 1 to add, 0 to change, 0 to destroy.\r\n[...]\r\n<\/code><\/pre>\n<p>When the planned output looks reasonable, it can be applied via <code>terraform apply<\/code>:<\/p>\n<pre><code>$ terraform apply\r\n\r\nTerraform used the selected providers to generate the following execution plan. Resource actions are\r\nindicated with the following symbols:\r\n  + create\r\n[...]\r\nPlan: 1 to add, 0 to change, 0 to destroy.\r\n\r\nDo you want to perform these actions?\r\n  Terraform will perform the actions described above.\r\n  Only 'yes' will be accepted to approve.\r\n\r\n  Enter a value: yes\r\n\r\ninstaclustr_postgresql_cluster_v2.main: Creating...\r\ninstaclustr_postgresql_cluster_v2.main: Still creating... [10s elapsed]\r\n[...]\r\ninstaclustr_postgresql_cluster_v2.main: Creation complete after 5m37s [id=704e1c20-bda6-410c-b95b-8d22ef3f5a04]\r\n\r\nApply complete! Resources: 1 added, 0 changed, 0 destroyed.<\/code><\/pre>\n<p>That is it! The PostgreSQL cluster is now up and running after barely 5 minutes.<\/p>\n<h2 id=\"ip-whitelisting\">IP Whitelisting<\/h2>\n<p>In order to access the PostgreSQL cluster, firewall rules need to be defined for IP-whitelisting. In general, any network address block can be defined, but in order to allow access from the host running Terraform, a firewall rule for the local public IP address can be set via a service like <a href=\"https:\/\/icanhazip.com\">icanhazip.com<\/a>, appending to <code>main.tf<\/code>:<\/p>\n<pre class=\"hcl\"><code>data \"http\" \"myip\" {\r\n  url = \"https:\/\/ipecho.net\/plain\"\r\n}\r\n\r\nresource \"instaclustr_cluster_network_firewall_rules_v2\" \"main\" {\r\n  cluster_id = resource.instaclustr_postgresql_cluster_v2.main.id\r\n\r\n  firewall_rule {\r\n    network = \"${chomp(data.http.myip.response_body)}\/32\"\r\n    type    = \"POSTGRESQL\"\r\n  }\r\n}<\/code><\/pre>\n<p>The usage of the <code>http<\/code> Terraform module also needs an update to the <code>providers.tf<\/code> file, adding it to the list of required providers:<\/p>\n<pre class=\"hcl\"><code>terraform {\r\n  required_providers {\r\n    instaclustr = {\r\n      source  = \"instaclustr\/instaclustr\"\r\n      version = \"&gt;= 2.0.0, &lt; 3.0.0\"\r\n    }\r\n    http = {\r\n      source = \"hashicorp\/http\"\r\n      version = \"3.4.3\"\r\n    }\r\n  }\r\n}<\/code><\/pre>\n<p>And a subsequent re-run of <code>terraform init<\/code>, followed by <code>terraform apply<\/code>:<\/p>\n<pre><code>$ terraform init\r\n\r\nInitializing the backend...\r\n\r\nInitializing provider plugins...\r\n- Reusing previous version of instaclustr\/instaclustr from the dependency lock file\r\n- Finding hashicorp\/http versions matching \"3.4.3\"...\r\n- Using previously-installed instaclustr\/instaclustr v2.0.136\r\n- Installing hashicorp\/http v3.4.3...\r\n- Installed hashicorp\/http v3.4.3 (signed by HashiCorp)\r\n\r\n[...]\r\nTerraform has been successfully initialized!\r\n[...]\r\n\r\n$ terraform apply\r\n\r\ndata.http.myip: Reading...\r\ninstaclustr_postgresql_cluster_v2.main: Refreshing state... [id=704e1c20-bda6-410c-b95b-8d22ef3f5a04]\r\ndata.http.myip: Read complete after 1s [id=https:\/\/ipv4.icanhazip.com]\r\n\r\nTerraform used the selected providers to generate the following execution plan. Resource actions are\r\nindicated with the following symbols:\r\n  + create\r\n\r\nTerraform will perform the following actions:\r\n\r\n  # instaclustr_cluster_network_firewall_rules_v2.main will be created\r\n  + resource \"instaclustr_cluster_network_firewall_rules_v2\" \"main\" {\r\n      + cluster_id = \"704e1c20-bda6-410c-b95b-8d22ef3f5a04\"\r\n      + id         = (known after apply)\r\n      + status     = (known after apply)\r\n\r\n      + firewall_rule {\r\n          + deferred_reason = (known after apply)\r\n          + id              = (known after apply)\r\n          + network         = \"123.134.145.5\/32\"\r\n          + type            = \"POSTGRESQL\"\r\n        }\r\n    }\r\n\r\nPlan: 1 to add, 0 to change, 0 to destroy.\r\n\r\nDo you want to perform these actions?\r\n  Terraform will perform the actions described above.\r\n  Only 'yes' will be accepted to approve.\r\n\r\n  Enter a value: yes\r\n\r\ninstaclustr_cluster_network_firewall_rules_v2.main: Creating...\r\ninstaclustr_cluster_network_firewall_rules_v2.main: Creation complete after 2s [id=704e1c20-bda6-410c-b95b-8d22ef3f5a04]\r\n\r\nApply complete! Resources: 1 added, 0 changed, 0 destroyed.<\/code><\/pre>\n<h2 id=\"connecting-to-the-cluster\">Connecting to the Cluster<\/h2>\n<p>In order to connect to the newly-provisioned Postgres cluster, we need the public IP addresses of the nodes, and the password of the administrative database user, <code>icpostgresql<\/code>. Those are retrieved and stored in the Terraform state by the Instaclustr Terraform provider, by default in a local file <code>terraform.tfstate<\/code>. To secure the password, one can change the password after initial connection, secure the host Terraform is run from, or <a href=\"https:\/\/developer.hashicorp.com\/terraform\/language\/settings\/backends\/remote\">store the Terraform state remotely<\/a>.<\/p>\n<p>The combined connection string can be setup as an output variable in a <code>outputs.tf<\/code> file:<\/p>\n<pre class=\"hcl\"><code>output \"connstr\" {\r\n  value = format(\"host=%s user=icpostgresql password=%s dbname=postgres target_session_attrs=read-write\",\r\n          join(\",\", [for node in instaclustr_postgresql_cluster_v2.main.data_centre[0].nodes:\r\n               format(\"%s\", node.public_address)]),\r\n                      instaclustr_postgresql_cluster_v2.main.default_user_password\r\n                )\r\n  sensitive = true\r\n}<\/code><\/pre>\n<p>After another <code>terraform apply<\/code> to set the output variable, it is possible to connect to the PostgreSQL cluster without having to type or paste the default password via:<\/p>\n<pre><code>$ psql \"$(terraform output -raw connstr)\"\r\npsql (16.3 (Debian 16.3-1.pgdg120+1), server 16.2 (Debian 16.2-1.pgdg110+2))\r\nSSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)\r\nType \"help\" for help.\r\n\r\npostgres=&gt; <\/code><\/pre>\n<h2 id=\"conclusion\">Conclusion<\/h2>\n<p>In this first part, the provisioning of an Instaclustr Managed PostgreSQL cluster with Terraform was demonstrated. In the next part of this blog series, we plan to present a Terraform module that makes it even easier to provision PostgreSQL clusters. We will also check out which input variables can be set to further customize the managed PostgreSQL cluster.<\/p>\n<p>Instaclustr offers a 30-day free trial for its managed service which allows to provision clusters with development instance sizes, so you can <a href=\"https:\/\/console2.instaclustr.com\/signup\">signup<\/a> and try the above yourself today!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hashicorp Terraform is a well-known infrastructure automation tool mostly targeting cloud deployments. Instaclustr (a part of NetApp\u2019s CloudOps division and credativ\u2019s parent company) provides a managed service for various data stores, including PostgreSQL. Provisioning managed clusters is possible via the Instaclustr console, a REST API or through the Instaclustr Terraform Provider. In this first part [&hellip;]<\/p>\n","protected":false},"author":37,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1708,1951],"tags":[1725,1801,1952],"class_list":["post-8019","post","type-post","status-publish","format-standard","hentry","category-postgresql-en","category-terraform","tag-instaclustr-en","tag-postgresql-en","tag-terraform"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.1 (Yoast SEO v28.1) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Instaclustr Managed Postgres with Terraform Part 1 - credativ\u00ae<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/instaclustr-managed-postgres-with-terraform-part-1\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Instaclustr Managed Postgres with Terraform Part 1\" \/>\n<meta property=\"og:description\" content=\"Hashicorp Terraform is a well-known infrastructure automation tool mostly targeting cloud deployments. Instaclustr (a part of NetApp\u2019s CloudOps division and credativ\u2019s parent company) provides a managed service for various data stores, including PostgreSQL. Provisioning managed clusters is possible via the Instaclustr console, a REST API or through the Instaclustr Terraform Provider. In this first part [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/instaclustr-managed-postgres-with-terraform-part-1\/\" \/>\n<meta property=\"og:site_name\" content=\"credativ\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/credativDE\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-07-02T12:55:42+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.credativ.de\/wp-content\/uploads\/2019\/07\/Portfolio-Loesungen.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"550\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Michael Banck\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@credativde\" \/>\n<meta name=\"twitter:site\" content=\"@credativde\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Michael Banck\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/instaclustr-managed-postgres-with-terraform-part-1\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/instaclustr-managed-postgres-with-terraform-part-1\\\/\"},\"author\":{\"name\":\"Michael Banck\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/#\\\/schema\\\/person\\\/038c79105ce9b5fd885631da3f806698\"},\"headline\":\"Instaclustr Managed Postgres with Terraform Part 1\",\"datePublished\":\"2024-07-02T12:55:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/instaclustr-managed-postgres-with-terraform-part-1\\\/\"},\"wordCount\":669,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/#organization\"},\"keywords\":[\"Instaclustr\",\"PostgreSQL\u00ae\",\"Terraform\"],\"articleSection\":[\"PostgreSQL\u00ae\",\"Terraform\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/instaclustr-managed-postgres-with-terraform-part-1\\\/#respond\"]}],\"copyrightYear\":\"2024\",\"copyrightHolder\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/instaclustr-managed-postgres-with-terraform-part-1\\\/\",\"url\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/instaclustr-managed-postgres-with-terraform-part-1\\\/\",\"name\":\"Instaclustr Managed Postgres with Terraform Part 1 - credativ\u00ae\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/#website\"},\"datePublished\":\"2024-07-02T12:55:42+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/instaclustr-managed-postgres-with-terraform-part-1\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/instaclustr-managed-postgres-with-terraform-part-1\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/instaclustr-managed-postgres-with-terraform-part-1\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Instaclustr Managed Postgres with Terraform Part 1\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/\",\"name\":\"credativ GmbH\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Organization\",\"Place\"],\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/#organization\",\"name\":\"credativ\u00ae\",\"url\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/\",\"logo\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/instaclustr-managed-postgres-with-terraform-part-1\\\/#local-main-organization-logo\"},\"image\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/instaclustr-managed-postgres-with-terraform-part-1\\\/#local-main-organization-logo\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/credativDE\\\/\",\"https:\\\/\\\/x.com\\\/credativde\",\"https:\\\/\\\/mastodon.social\\\/@credativde\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/credativ-gmbh\",\"https:\\\/\\\/www.instagram.com\\\/credativ\\\/\",\"https:\\\/\\\/www.northdata.de\\\/credativ GmbH, M\u00f6nchengladbach\\\/Amtsgericht Moenchengladbach HRB 23003\",\"https:\\\/\\\/github.com\\\/credativ\"],\"description\":\"credativ GmbH is an owner-managed, vendor-independent IT services and consulting company specializing in open source software, and one of the leading providers in this field. Founded in 1999, the company has been independently run by its management since March 2025 and is not part of any corporate group. We offer comprehensive, professional services ranging from consulting and infrastructure operations to 24\\\/7 support, custom solutions, and training. Our focus is on the holistic management of business-critical open source systems, including operating systems (e.g. Linux), databases (e.g. PostgreSQL), configuration management (e.g. Ansible, Puppet), and virtualization (e.g. Proxmox). As a committed member of the open source community, we help our customers use the benefits of free software securely, reliably, and efficiently in their IT environments.\",\"legalName\":\"credativ GmbH\",\"foundingDate\":\"1999-03-01\",\"duns\":\"316387060\",\"numberOfEmployees\":{\"@type\":\"QuantitativeValue\",\"minValue\":\"11\",\"maxValue\":\"50\"},\"address\":{\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/instaclustr-managed-postgres-with-terraform-part-1\\\/#local-main-place-address\"},\"geo\":{\"@type\":\"GeoCoordinates\",\"latitude\":\"51.1732374\",\"longitude\":\"6.392010099999999\"},\"telephone\":[\"+4921619174200\",\"08002733284\"],\"contactPoint\":{\"@type\":\"ContactPoint\",\"telephone\":\"08002733284\",\"email\":\"vertrieb@credativ.de\"},\"openingHoursSpecification\":[{\"@type\":\"OpeningHoursSpecification\",\"dayOfWeek\":[\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\"],\"opens\":\"09:00\",\"closes\":\"17:00\"},{\"@type\":\"OpeningHoursSpecification\",\"dayOfWeek\":[\"Saturday\",\"Sunday\"],\"opens\":\"00:00\",\"closes\":\"00:00\"}],\"email\":\"info@credativ.de\",\"areaServed\":\"D-A-CH\",\"vatID\":\"DE452151696\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/#\\\/schema\\\/person\\\/038c79105ce9b5fd885631da3f806698\",\"name\":\"Michael Banck\",\"description\":\"Michael Banck ist seit 2009 Mitarbeiter der credativ GmbH, sowie seit 2001 Mitglied des Debian Projekts und auch in weiteren Open Source Projekten aktiv. Als Mitglied des Datenbank-Teams von credativ hat er in den letzten Jahren verschiedene Kunden bei der L\u00f6sung von Problemen mit und dem t\u00e4glichen Betrieb von PostgreSQL\u00ae, sowie bei der Einf\u00fchrung von Hochverf\u00fcgbarkeits-L\u00f6sungen im Bereich Datenbanken unterst\u00fctzt und beraten.\"},{\"@type\":\"PostalAddress\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/instaclustr-managed-postgres-with-terraform-part-1\\\/#local-main-place-address\",\"streetAddress\":\"Hennes-Weisweiler-Allee 23\",\"addressLocality\":\"M\u00f6nchengladbach\",\"postalCode\":\"41179\",\"addressRegion\":\"Deutschland\",\"addressCountry\":\"DE\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.credativ.de\\\/en\\\/blog\\\/postgresql-en\\\/instaclustr-managed-postgres-with-terraform-part-1\\\/#local-main-organization-logo\",\"url\":\"https:\\\/\\\/www.credativ.de\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/credativ-logo-right.svg\",\"contentUrl\":\"https:\\\/\\\/www.credativ.de\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/credativ-logo-right.svg\",\"caption\":\"credativ\u00ae\"}]}<\/script>\n<meta name=\"geo.placename\" content=\"M\u00f6nchengladbach\" \/>\n<meta name=\"geo.position\" content=\"51.1732374;6.392010099999999\" \/>\n<meta name=\"geo.region\" content=\"Germany\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Instaclustr Managed Postgres with Terraform Part 1 - credativ\u00ae","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:\/\/www.credativ.de\/en\/blog\/postgresql-en\/instaclustr-managed-postgres-with-terraform-part-1\/","og_locale":"en_US","og_type":"article","og_title":"Instaclustr Managed Postgres with Terraform Part 1","og_description":"Hashicorp Terraform is a well-known infrastructure automation tool mostly targeting cloud deployments. Instaclustr (a part of NetApp\u2019s CloudOps division and credativ\u2019s parent company) provides a managed service for various data stores, including PostgreSQL. Provisioning managed clusters is possible via the Instaclustr console, a REST API or through the Instaclustr Terraform Provider. In this first part [&hellip;]","og_url":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/instaclustr-managed-postgres-with-terraform-part-1\/","og_site_name":"credativ\u00ae","article_publisher":"https:\/\/www.facebook.com\/credativDE\/","article_published_time":"2024-07-02T12:55:42+00:00","og_image":[{"width":800,"height":550,"url":"https:\/\/www.credativ.de\/wp-content\/uploads\/2019\/07\/Portfolio-Loesungen.jpg","type":"image\/jpeg"}],"author":"Michael Banck","twitter_card":"summary_large_image","twitter_creator":"@credativde","twitter_site":"@credativde","twitter_misc":{"Written by":"Michael Banck","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/instaclustr-managed-postgres-with-terraform-part-1\/#article","isPartOf":{"@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/instaclustr-managed-postgres-with-terraform-part-1\/"},"author":{"name":"Michael Banck","@id":"https:\/\/www.credativ.de\/en\/#\/schema\/person\/038c79105ce9b5fd885631da3f806698"},"headline":"Instaclustr Managed Postgres with Terraform Part 1","datePublished":"2024-07-02T12:55:42+00:00","mainEntityOfPage":{"@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/instaclustr-managed-postgres-with-terraform-part-1\/"},"wordCount":669,"commentCount":0,"publisher":{"@id":"https:\/\/www.credativ.de\/en\/#organization"},"keywords":["Instaclustr","PostgreSQL\u00ae","Terraform"],"articleSection":["PostgreSQL\u00ae","Terraform"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/instaclustr-managed-postgres-with-terraform-part-1\/#respond"]}],"copyrightYear":"2024","copyrightHolder":{"@id":"https:\/\/www.credativ.de\/#organization"}},{"@type":"WebPage","@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/instaclustr-managed-postgres-with-terraform-part-1\/","url":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/instaclustr-managed-postgres-with-terraform-part-1\/","name":"Instaclustr Managed Postgres with Terraform Part 1 - credativ\u00ae","isPartOf":{"@id":"https:\/\/www.credativ.de\/en\/#website"},"datePublished":"2024-07-02T12:55:42+00:00","breadcrumb":{"@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/instaclustr-managed-postgres-with-terraform-part-1\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/instaclustr-managed-postgres-with-terraform-part-1\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/instaclustr-managed-postgres-with-terraform-part-1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.credativ.de\/en\/"},{"@type":"ListItem","position":2,"name":"Instaclustr Managed Postgres with Terraform Part 1"}]},{"@type":"WebSite","@id":"https:\/\/www.credativ.de\/en\/#website","url":"https:\/\/www.credativ.de\/en\/","name":"credativ GmbH","description":"","publisher":{"@id":"https:\/\/www.credativ.de\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.credativ.de\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Organization","Place"],"@id":"https:\/\/www.credativ.de\/en\/#organization","name":"credativ\u00ae","url":"https:\/\/www.credativ.de\/en\/","logo":{"@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/instaclustr-managed-postgres-with-terraform-part-1\/#local-main-organization-logo"},"image":{"@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/instaclustr-managed-postgres-with-terraform-part-1\/#local-main-organization-logo"},"sameAs":["https:\/\/www.facebook.com\/credativDE\/","https:\/\/x.com\/credativde","https:\/\/mastodon.social\/@credativde","https:\/\/www.linkedin.com\/company\/credativ-gmbh","https:\/\/www.instagram.com\/credativ\/","https:\/\/www.northdata.de\/credativ GmbH, M\u00f6nchengladbach\/Amtsgericht Moenchengladbach HRB 23003","https:\/\/github.com\/credativ"],"description":"credativ GmbH is an owner-managed, vendor-independent IT services and consulting company specializing in open source software, and one of the leading providers in this field. Founded in 1999, the company has been independently run by its management since March 2025 and is not part of any corporate group. We offer comprehensive, professional services ranging from consulting and infrastructure operations to 24\/7 support, custom solutions, and training. Our focus is on the holistic management of business-critical open source systems, including operating systems (e.g. Linux), databases (e.g. PostgreSQL), configuration management (e.g. Ansible, Puppet), and virtualization (e.g. Proxmox). As a committed member of the open source community, we help our customers use the benefits of free software securely, reliably, and efficiently in their IT environments.","legalName":"credativ GmbH","foundingDate":"1999-03-01","duns":"316387060","numberOfEmployees":{"@type":"QuantitativeValue","minValue":"11","maxValue":"50"},"address":{"@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/instaclustr-managed-postgres-with-terraform-part-1\/#local-main-place-address"},"geo":{"@type":"GeoCoordinates","latitude":"51.1732374","longitude":"6.392010099999999"},"telephone":["+4921619174200","08002733284"],"contactPoint":{"@type":"ContactPoint","telephone":"08002733284","email":"vertrieb@credativ.de"},"openingHoursSpecification":[{"@type":"OpeningHoursSpecification","dayOfWeek":["Monday","Tuesday","Wednesday","Thursday","Friday"],"opens":"09:00","closes":"17:00"},{"@type":"OpeningHoursSpecification","dayOfWeek":["Saturday","Sunday"],"opens":"00:00","closes":"00:00"}],"email":"info@credativ.de","areaServed":"D-A-CH","vatID":"DE452151696"},{"@type":"Person","@id":"https:\/\/www.credativ.de\/en\/#\/schema\/person\/038c79105ce9b5fd885631da3f806698","name":"Michael Banck","description":"Michael Banck ist seit 2009 Mitarbeiter der credativ GmbH, sowie seit 2001 Mitglied des Debian Projekts und auch in weiteren Open Source Projekten aktiv. Als Mitglied des Datenbank-Teams von credativ hat er in den letzten Jahren verschiedene Kunden bei der L\u00f6sung von Problemen mit und dem t\u00e4glichen Betrieb von PostgreSQL\u00ae, sowie bei der Einf\u00fchrung von Hochverf\u00fcgbarkeits-L\u00f6sungen im Bereich Datenbanken unterst\u00fctzt und beraten."},{"@type":"PostalAddress","@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/instaclustr-managed-postgres-with-terraform-part-1\/#local-main-place-address","streetAddress":"Hennes-Weisweiler-Allee 23","addressLocality":"M\u00f6nchengladbach","postalCode":"41179","addressRegion":"Deutschland","addressCountry":"DE"},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.credativ.de\/en\/blog\/postgresql-en\/instaclustr-managed-postgres-with-terraform-part-1\/#local-main-organization-logo","url":"https:\/\/www.credativ.de\/wp-content\/uploads\/2025\/04\/credativ-logo-right.svg","contentUrl":"https:\/\/www.credativ.de\/wp-content\/uploads\/2025\/04\/credativ-logo-right.svg","caption":"credativ\u00ae"}]},"geo.placename":"M\u00f6nchengladbach","geo.position":{"lat":"51.1732374","long":"6.392010099999999"},"geo.region":"Germany"},"_links":{"self":[{"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/posts\/8019","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/users\/37"}],"replies":[{"embeddable":true,"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/comments?post=8019"}],"version-history":[{"count":0,"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/posts\/8019\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/media?parent=8019"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/categories?post=8019"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.credativ.de\/en\/wp-json\/wp\/v2\/tags?post=8019"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}