MongoDB Atlas com Terraform - Políticas de cluster e backup
Avalie esse Tutorial
Neste tutorial, mostrarei como criar um MongoDB cluster no Atlas usando Terraform. Vimos em um artigo anterior como criar uma API para começar a usar o Terraform e criar nosso primeiro módulo de projeto. Agora, vamos Go e criaremos nosso primeiro cluster. Se você não tiver uma API e um projeto, recomendamos que consulte o artigo anterior.
Este artigo é para qualquer pessoa que pretende usar ou já usa infraestrutura como código (IaC) na plataforma MongoDB Atlas ou deseja saber mais sobre ela.
Tudo o que fizermos aqui está contido na documentação do provedor/recurso: mongodmatlas_advanced_cluster | Recursos | mongodb/mongodbotlas | Terraform
Neste ponto, criaremos nosso primeiro cluster de conjunto de réplicas usando Terraform no MongoDB Atlas. Conforme discutido no artigo anterior, o Terraform é uma ferramenta avançada de infraestrutura como código que permite gerenciar e provisionar recursos de TI de forma eficiente e previsível. Ao usá-lo em conjunto com o MongoDB Atlas, você pode automatizar a criação e o gerenciamento de recursos de banco de dados na cloud, garantindo uma infraestrutura consistente e confiável.
Antes de começarmos, certifique-se de que todos os pré-requisitos mencionados no artigo anterior estejam configurados corretamente: Instalar o Terraform, criar uma chave de API no MongoDB Atlas e definir um projeto no Atlas. Essas etapas são essenciais para garantir o sucesso da criação do cluster de conjunto de réplicas.
A primeira etapa é configurar o provedor de Terraform para MongoDB Atlas. Isso permitirá que o Terraform se comunique com a API do MongoDB Atlas e gerencie recursos em sua conta. Adicione o seguinte bloco de código ao seu arquivo provider.tf:
1 provider "mongodbatlas" {}
No artigo anterior, configuramos o provedor Terraform inserindo diretamente nossas chaves pública e privada. Agora, para adotar práticas mais profissionais, optamos por usar variáveis de ambiente para autenticação. O fornecedor MongoDB Atlas, como muitos outros, oferece suporte a várias metodologias de autenticação. A opção mais segura e recomendada é usar variáveis de ambiente. Isso implica apenas definir o provedor em nosso código Terraform e exportar as variáveis de ambiente relevantes onde o Terraform será executado, seja no terminal, como um segredo no Kubernetes ou um segredo nas ações do GitHub, entre outros contextos possíveis. Existem outras formas de autenticação, como usar o MongoDB CLI, o AWS Secrets Manager, diretamente através de variáveis no Terraform, ou até mesmo especificando as chaves no código. No entanto, para garantir a segurança e evitar a exposição de nossas chaves em locais acessíveis, optamos pelas abordagens mais seguras mencionadas.
Dentro do arquivo version.tf, você começará especificando a versão do Terraform que seu projeto exige. Isso é importante para garantir que todos os usuários e ambientes CI/CD usem a mesma versão do Terraform, evitando possíveis incompatibilidades ou erros de execução. Além de definir a versão do Terraform, é igualmente importante especificar as versões dos fornecedores utilizados em seu projeto. Isso garante que os recursos sejam gerenciados de forma consistente. Por exemplo, para definir a versão do provedor MongoDB Atlas, você adicionaria um bloco
required_providers
dentro do bloco Terraform, como mostrado abaixo:1 terraform { 2 required_version = ">= 0.12" 3 required_providers { 4 mongodbatlas = { 5 source = "mongodb/mongodbatlas" 6 version = "1.14.0" 7 } 8 } 9 }
Após configurar o arquivo de versão e estabelecer as versões do Terraform e do provedor, a próxima etapa é definir o recurso de cluster no MongoDB Atlas. Isso é feito criando um arquivo .tf arquivo, por exemplo main.tf, onde você especificará as propriedades do cluster desejado. Como vamos criar um módulo que será reutilizável, usaremos variáveis e valores padrão para que outras chamadas possam criar clusters com arquiteturas ou tamanhos diferentes, sem precisar escrever um novo módulo.
Analisarei alguns atributos e parâmetros para deixar isso claro.
1 # ------------------------------------------------------------------------------ 2 # MONGODB CLUSTER 3 # ------------------------------------------------------------------------------ 4 resource "mongodbatlas_advanced_cluster" "default" { 5 project_id = data.mongodbatlas_project.default.id 6 name = var.name 7 cluster_type = var.cluster_type 8 backup_enabled = var.backup_enabled 9 pit_enabled = var.pit_enabled 10 mongo_db_major_version = var.mongo_db_major_version 11 disk_size_gb = var.disk_size_gb 12
Neste primeiro bloco, estamos especificando o nome do nosso cluster por meio do parâmetro nome , seu tipo (que pode ser
REPLICASET
, SHARDED
ou GEOSHARDED
) e se tivermos backup e ponto no tempo ativado, além da versão do banco de dados e a quantidade de armazenamento para o cluster.1 advanced_configuration { 2 fail_index_key_too_long = var.fail_index_key_too_long 3 javascript_enabled = var.javascript_enabled 4 minimum_enabled_tls_protocol = var.minimum_enabled_tls_protocol 5 no_table_scan = var.no_table_scan 6 oplog_size_mb = var.oplog_size_mb 7 default_read_concern = var.default_read_concern 8 default_write_concern = var.default_write_concern 9 oplog_min_retention_hours = var.oplog_min_retention_hours 10 transaction_lifetime_limit_seconds = var.transaction_lifetime_limit_seconds 11 sample_size_bi_connector = var.sample_size_bi_connector 12 sample_refresh_interval_bi_connector = var.sample_refresh_interval_bi_connector 13 }
Aqui, estamos especificando algumas configurações avançadas. Muitos desses valores não serão especificados em .tfvars pois eles têm valores padrão no arquivovariables.tf.
Os parâmetros incluem o tipo de read/write concern, tamanho do oplog em MB, protocolo TLS, se o JavaScript será habilitado no MongoDB e limite de vida útil da transação em segundos. O no_table_scan é para quando o cluster desativa a execução de qualquer query que exija uma verificação da coleção para retornar resultados, quando verdadeiro. Há mais parâmetros que você pode examinar na documentação, se tiver dúvidas.
1 replication_specs { 2 num_shards = var.cluster_type == "REPLICASET" ? null : var.num_shards 3 4 dynamic "region_configs" { 5 for_each = var.region_configs 6 7 content { 8 provider_name = region_configs.value.provider_name 9 priority = region_configs.value.priority 10 region_name = region_configs.value.region_name 11 12 electable_specs { 13 instance_size = region_configs.value.electable_specs.instance_size 14 node_count = region_configs.value.electable_specs.node_count 15 disk_iops = region_configs.value.electable_specs.instance_size == "M10" || region_configs.value.electable_specs.instance_size == "M20" ? null : region_configs.value.electable_specs.disk_iops 16 ebs_volume_type = region_configs.value.electable_specs.ebs_volume_type 17 } 18 19 auto_scaling { 20 disk_gb_enabled = region_configs.value.auto_scaling.disk_gb_enabled 21 compute_enabled = region_configs.value.auto_scaling.compute_enabled 22 compute_scale_down_enabled = region_configs.value.auto_scaling.compute_scale_down_enabled 23 compute_min_instance_size = region_configs.value.auto_scaling.compute_min_instance_size 24 compute_max_instance_size = region_configs.value.auto_scaling.compute_max_instance_size 25 } 26 27 analytics_specs { 28 instance_size = try(region_configs.value.analytics_specs.instance_size, "M10") 29 node_count = try(region_configs.value.analytics_specs.node_count, 0) 30 disk_iops = try(region_configs.value.analytics_specs.disk_iops, null) 31 ebs_volume_type = try(region_configs.value.analytics_specs.ebs_volume_type, "STANDARD") 32 } 33 34 analytics_auto_scaling { 35 disk_gb_enabled = try(region_configs.value.analytics_auto_scaling.disk_gb_enabled, null) 36 compute_enabled = try(region_configs.value.analytics_auto_scaling.compute_enabled, null) 37 compute_scale_down_enabled = try(region_configs.value.analytics_auto_scaling.compute_scale_down_enabled, null) 38 compute_min_instance_size = try(region_configs.value.analytics_auto_scaling.compute_min_instance_size, null) 39 compute_max_instance_size = try(region_configs.value.analytics_auto_scaling.compute_max_instance_size, null) 40 } 41 42 read_only_specs { 43 instance_size = try(region_configs.value.read_only_specs.instance_size, "M10") 44 node_count = try(region_configs.value.read_only_specs.node_count, 0) 45 disk_iops = try(region_configs.value.read_only_specs.disk_iops, null) 46 ebs_volume_type = try(region_configs.value.read_only_specs.ebs_volume_type, "STANDARD") 47 } 48 } 49 } 50 }
Neste momento, estamos colocando o número de shards que queremos, caso nosso cluster não seja um REPLICASET. Além disso, especificamos a configuração das configurações de cluster, região, nuvem, prioridade para failover, autoscaling, elegíveis, analítica e read-only, além de suas configurações de autoscaling.
1 dynamic "tags" { 2 for_each = local.tags 3 content { 4 key = tags.key 5 value = tags.value 6 } 7 } 8 9 bi_connector_config { 10 enabled = var.bi_connector_enabled 11 read_preference = var.bi_connector_read_preference 12 } 13 14 lifecycle { 15 ignore_changes = [ 16 disk_size_gb, 17 ] 18 } 19 }
Em seguida, criamos um bloco dinâmico para fazer um loop para cada variável de tag que incluímos. Além disso, especificamos o BI Connector, se desejado, e o bloco do ciclo de vida. Aqui, estamos especificando
disk_size_gb
apenas para um exemplo, mas é recomendável ler a documentação que contém avisos importantes sobre esse bloco, como incluir instance_size
, pois o dimensionamento automático pode mudar e você não deseja remover acidentalmente um instância durante os horários de pico.1 # ------------------------------------------------------------------------------ 2 # MONGODB BACKUP SCHEDULE 3 # ------------------------------------------------------------------------------ 4 resource "mongodbatlas_cloud_backup_schedule" "default" { 5 project_id = data.mongodbatlas_project.default.id 6 cluster_name = mongodbatlas_advanced_cluster.default.name 7 update_snapshots = var.update_snapshots 8 reference_hour_of_day = var.reference_hour_of_day 9 reference_minute_of_hour = var.reference_minute_of_hour 10 restore_window_days = var.restore_window_days 11 12 policy_item_hourly { 13 frequency_interval = var.policy_item_hourly_frequency_interval 14 retention_unit = var.policy_item_hourly_retention_unit 15 retention_value = var.policy_item_hourly_retention_value 16 } 17 18 policy_item_daily { 19 frequency_interval = var.policy_item_daily_frequency_interval 20 retention_unit = var.policy_item_daily_retention_unit 21 retention_value = var.policy_item_daily_retention_value 22 } 23 24 policy_item_weekly { 25 frequency_interval = var.policy_item_weekly_frequency_interval 26 retention_unit = var.policy_item_weekly_retention_unit 27 retention_value = var.policy_item_weekly_retention_value 28 } 29 30 policy_item_monthly { 31 frequency_interval = var.policy_item_monthly_frequency_interval 32 retention_unit = var.policy_item_monthly_retention_unit 33 retention_value = var.policy_item_monthly_retention_value 34 } 35 }
Por fim, criamos o bloco de backup, que contém as políticas e configurações relacionadas ao backup do nosso cluster.
Este módulo, embora detalhado, encapsula a funcionalidade completa oferecida pelos recursos
mongodbatlas_advanced_cluster
e mongodbatlas_cloud_backup_schedule
, fornecendo uma abordagem abrangente para criar e gerenciar clusters no MongoDB Atlas. Ele suporta a configuração de conjunto de réplicas, clusters fragmentados e geoespaciais, atendendo a uma variedade de necessidades de escalabilidade e distribuição geográfica.Um dos pontos fortes desse módulo é sua flexibilidade na configuração de políticas de backup, permitindo ajustes precisos que se alinham com precisão aos requisitos de cada banco de dados. Isso é essencial para garantir resiliência e recuperação eficaz de dados em qualquer cenário. Além disso, o módulo vem com o dimensionamento vertical ativado por padrão, além de oferecer recursos avançados de dimensionamento automático de armazenamento, garantindo que o cluster se ajuste dinamicamente ao volume de dados e à carga de trabalho.
Para complementar a robustez da configuração, o módulo permite a inclusão de nós analíticos e nós somente leitura, ampliando as possibilidades de uso do cluster para cenários que exigem análises aprofundadas ou operações de leitura intensiva sem impactar o desempenho geral.
A configuração padrão inclui valores de predefinidos inteligentes, como a versão do MongoDB, que é definida como "7 ".0" para aproveitar os recursos mais recentes, mantendo a opção de ajuste a versões específicas conforme necessário. Essa abordagem “best practices” garante um ponto de partida sólido para a maioria dos projetos, reduzindo a necessidade de ajustes manuais e simplificando o processo de implantação.
Além disso, a capacidade de implantar clusters em qualquer região e provedor de nuvem – como Amazon Web Services, Azure ou GCP – oferece flexibilidade incomparável, permitindo que as equipes escolham a melhor solução com base em suas preferências de custo, desempenho e conformidade.
Em resumo, este módulo não apenas facilita a configuração e o gerenciamento de clusters do MongoDB Atlas com uma ampla gama de opções e ajustes, mas também promove práticas de configuração seguras e eficientes, tornando-o uma ferramenta valiosa para desenvolvedores e administradores de banco de dados na implementação de soluções de dados escaláveis e confiáveis na nuvem.
O uso da diretiva de ciclo de vida com a opção
ignore_changes
no código do Terraform foi implementado especificamente para acomodar situações manuais de upscale do MongoDB Atlas cluster, que não deve ser automaticamente revertido pelo Terraform em execuções subsequentes. Essa abordagem garante que, após um aumento manual na capacidade de armazenamento (disk_size_gb
) ou outras configurações de replicação específicas (replication_specs
), o Terraform não tentará desfazer essas alterações para alinhar o estado do recurso com a definição original no código. Essenciais, ele permite ajustes de configuração feitos fora do Terraform, como um upscale para otimizar o desempenho ou atender a demanda crescente, para permanecer intacto sem ser substituído por futuras execuções do Terraform, garantindo flexibilidade operacional e mantendo o gerenciamento de infraestrutura como código.No arquivo variable.tf, criamos variáveis com valores padrão:
1 variable "name" { 2 description = "The name of the cluster." 3 type = string 4 } 5 6 variable "cluster_type" { 7 description = <<HEREDOC 8 Optional - Specifies the type of the cluster that you want to modify. You cannot convert 9 a sharded cluster deployment to a replica set deployment. Accepted values include: 10 REPLICASET for Replica set, SHARDED for Sharded cluster, and GEOSHARDED for Global Cluster 11 HEREDOC 12 default = "REPLICASET" 13 } 14 15 16 variable "mongo_db_major_version" { 17 description = <<HEREDOC 18 Optional - Version of the cluster to deploy. Atlas supports the following MongoDB versions 19 for M10+ clusters: 5.0, 6.0 or 7.0. 20 HEREDOC 21 default = "7.0" 22 } 23 24 variable "version_release_system" { 25 description = <<HEREDOC 26 Optional - Release cadence that Atlas uses for this cluster. This parameter defaults to LTS. 27 If you set this field to CONTINUOUS, you must omit the mongo_db_major_version field. Atlas accepts: 28 CONTINUOUS - Atlas deploys the latest version of MongoDB available for the cluster tier. 29 LTS - Atlas deploys the latest Long Term Support (LTS) version of MongoDB available for the cluster tier. 30 HEREDOC 31 default = "LTS" 32 } 33 34 35 36 variable "disk_size_gb" { 37 description = <<HEREDOC 38 Optional - Capacity, in gigabytes, of the host’s root volume. Increase this 39 number to add capacity, up to a maximum possible value of 4096 (i.e., 4 TB). This value must 40 be a positive integer. If you specify diskSizeGB with a lower disk size, Atlas defaults to 41 the minimum disk size value. Note: The maximum value for disk storage cannot exceed 50 times 42 the maximum RAM for the selected cluster. If you require additional storage space beyond this 43 limitation, consider upgrading your cluster to a higher tier. 44 HEREDOC 45 type = number 46 default = 10 47 } 48 49 variable "backup_enabled" { 50 description = <<HEREDOC 51 Optional - Flag indicating if the cluster uses Cloud Backup for backups. If true, the cluster 52 uses Cloud Backup for backups. The default is true. 53 HEREDOC 54 type = bool 55 default = true 56 } 57 58 variable "pit_enabled" { 59 description = <<HEREDOC 60 Optional - Flag that indicates if the cluster uses Continuous Cloud Backup. If set to true, 61 backup_enabled must also be set to true. The default is true. 62 HEREDOC 63 type = bool 64 default = true 65 } 66 67 variable "disk_gb_enabled" { 68 description = <<HEREDOC 69 Optional - Specifies whether disk auto-scaling is enabled. The default is true. 70 HEREDOC 71 type = bool 72 default = true 73 } 74 75 variable "region_configs" { 76 description = <<HEREDOC 77 Required - Physical location of the region. Each regionsConfig document describes 78 the region’s priority in elections and the number and type of MongoDB nodes Atlas 79 deploys to the region. You can be set that parameters: 80 81 - region_name - Optional - Physical location of your MongoDB cluster. The region you choose can affect network latency for clients accessing your databases. 82 83 - electable_nodes - Optional - Number of electable nodes for Atlas to deploy to the region. Electable nodes can become the primary and can facilitate local reads. The total number of electableNodes across all replication spec regions must total 3, 5, or 7. Specify 0 if you do not want any electable nodes in the region. You cannot create electable nodes in a region if priority is 0. 84 85 - priority - Optional - Election priority of the region. For regions with only read-only nodes, set this value to 0. For regions where electable_nodes is at least 1, each region must have a priority of exactly one (1) less than the previous region. The first region 86 must have a priority of 7. The lowest possible priority is 1. The priority 7 region identifies the Preferred Region of the cluster. Atlas places the primary node in the Preferred Region. Priorities 1 through 7 are exclusive - no more than one region per cluster can be assigned a given priority. Example: If you have three regions, their priorities would be 7, 6, and 5 respectively. If you added two more regions for supporting electable nodes, the priorities of those regions would be 4 and 3 respectively. 87 88 - read_only_nodes - Optional - Number of read-only nodes for Atlas to deploy to the region. 89 Read-only nodes can never become the primary, but can facilitate local-reads. Specify 0 if you do not want any read-only nodes in the region. 90 91 - analytics_nodes - Optional - The number of analytics nodes for Atlas to deploy to the region. 92 Analytics nodes are useful for handling analytic data such as reporting queries from BI Connector for Atlas. Analytics nodes are read-only, and can never become the primary. If you do not specify this option, no analytics nodes are deployed to the region. 93 HEREDOC 94 type = any 95 } 96 97 # ------------------------------------------------------------------------------ 98 # MONGODB BI CONNECTOR 99 # ------------------------------------------------------------------------------ 100 101 variable "bi_connector_enabled" { 102 description = <<HEREDOC 103 Optional - Specifies whether or not BI Connector for Atlas is enabled on the cluster. 104 Set to true to enable BI Connector for Atlas. Set to false to disable BI Connector for Atlas. 105 HEREDOC 106 type = bool 107 default = false 108 } 109 110 variable "bi_connector_read_preference" { 111 description = <<HEREDOC 112 Optional - Specifies the read preference to be used by BI Connector for Atlas on the cluster. 113 Each BI Connector for Atlas read preference contains a distinct combination of readPreference and readPreferenceTags options. For details on BI Connector for Atlas read preferences, refer to the BI Connector Read Preferences Table. 114 Set to "primary" to have BI Connector for Atlas read from the primary. Set to "secondary" to have BI Connector for Atlas read from a secondary member. Default if there are no analytics nodes in the cluster. Set to "analytics" to have BI Connector for Atlas read from an analytics node. Default if the cluster contains analytics nodes. 115 HEREDOC 116 type = string 117 default = "secondary" 118 } 119 120 # ------------------------------------------------------------------------------ 121 # MONGODB ADVANCED CONFIGURATION 122 # ------------------------------------------------------------------------------ 123 variable "fail_index_key_too_long" { 124 description = <<HEREDOC 125 Optional - When true, documents can only be updated or inserted if, for all indexed fields on the target collection, the corresponding index entries do not exceed 1024 bytes. When false, mongod writes documents that exceed the limit but does not index them. 126 HEREDOC 127 type = bool 128 default = false 129 } 130 131 variable "javascript_enabled" { 132 description = <<HEREDOC 133 Optional - When true, the cluster allows execution of operations that perform server-side executions of JavaScript. When false, the cluster disables execution of those operations. 134 HEREDOC 135 type = bool 136 default = true 137 } 138 139 variable "minimum_enabled_tls_protocol" { 140 description = <<HEREDOC 141 Optional - Sets the minimum Transport Layer Security (TLS) version the cluster accepts for incoming connections. Valid values are: TLS1_0, TLS1_1, TLS1_2. The default is "TLS1_2". 142 HEREDOC 143 default = "TLS1_2" 144 } 145 146 variable "no_table_scan" { 147 description = <<HEREDOC 148 Optional - When true, the cluster disables the execution of any query that requires a collection scan to return results. When false, the cluster allows the execution of those operations. 149 HEREDOC 150 type = bool 151 default = false 152 } 153 154 variable "oplog_size_mb" { 155 description = <<HEREDOC 156 Optional - The custom oplog size of the cluster. 157 Without a value that indicates that the cluster uses the default oplog size calculated by Atlas. 158 HEREDOC 159 type = number 160 default = null 161 } 162 163 variable "default_read_concern" { 164 description = <<HEREDOC 165 Optional - The default read concern for the cluster. The default is "local". 166 HEREDOC 167 default = "local" 168 } 169 170 variable "default_write_concern" { 171 description = <<HEREDOC 172 Optional - The default write concern for the cluster. The default is "majority". 173 HEREDOC 174 default = "majority" 175 } 176 177 variable "oplog_min_retention_hours" { 178 description = <<HEREDOC 179 Minimum retention window for cluster's oplog expressed in hours. 180 A value of null indicates that the cluster uses the default minimum oplog window that MongoDB Cloud calculates. 181 HEREDOC 182 type = number 183 default = null 184 } 185 186 variable "transaction_lifetime_limit_seconds" { 187 description = <<HEREDOC 188 Optional - Lifetime, in seconds, of multi-document transactions. Defaults to 60 seconds. 189 HEREDOC 190 type = number 191 default = 60 192 } 193 194 variable "sample_size_bi_connector" { 195 description = <<HEREDOC 196 Optional - Number of documents per database to sample when gathering schema information. Defaults to 100. 197 Available only for Atlas deployments in which BI Connector for Atlas is enabled. 198 HEREDOC 199 type = number 200 default = 100 201 } 202 203 variable "sample_refresh_interval_bi_connector" { 204 description = <<HEREDOC 205 Optional - Interval in seconds at which the mongosqld process re-samples data to create its relational schema. The default value is 300. 206 The specified value must be a positive integer. 207 Available only for Atlas deployments in which BI Connector for Atlas is enabled. 208 HEREDOC 209 type = number 210 default = 300 211 } 212 213 # ------------------------------------------------------------------------------ 214 # MONGODB REPLICATION SPECS 215 # ------------------------------------------------------------------------------ 216 variable "num_shards" { 217 description = <<HEREDOC 218 Optional - Number of shards, minimum 1. 219 The default is null if type is REPLICASET. 220 HEREDOC 221 type = number 222 default = null 223 } 224 225 # ------------------------------------------------------------------------------ 226 # MONGODB BACKUP POLICY 227 # ------------------------------------------------------------------------------ 228 variable "update_snapshots" { 229 description = <<HEREDOC 230 Optional - Specify true to apply the retention changes in the updated backup policy to snapshots that Atlas took previously. 231 HEREDOC 232 type = bool 233 default = false 234 } 235 236 variable "reference_hour_of_day" { 237 description = <<HEREDOC 238 Optional - Hour of the day in UTC at which Atlas takes the daily snapshots of the cluster. 239 HEREDOC 240 type = number 241 default = 3 242 } 243 244 variable "reference_minute_of_hour" { 245 description = <<HEREDOC 246 Optional - Minute of the hour in UTC at which Atlas takes the daily snapshots of the cluster. 247 HEREDOC 248 type = number 249 default = 30 250 } 251 252 variable "restore_window_days" { 253 description = <<HEREDOC 254 Optional - Number of days Atlas retains the backup snapshots in the snapshot schedule. 255 HEREDOC 256 type = number 257 default = 3 258 } 259 260 variable "policy_item_hourly_frequency_interval" { 261 description = <<HEREDOC 262 Optional - Interval, in hours, between snapshots that Atlas takes of the cluster. 263 HEREDOC 264 type = number 265 default = 12 266 } 267 268 variable "policy_item_hourly_retention_unit" { 269 description = <<HEREDOC 270 Optional - Unit of time that Atlas retains each snapshot in the hourly snapshot schedule. 271 HEREDOC 272 type = string 273 default = "days" 274 } 275 276 variable "policy_item_hourly_retention_value" { 277 description = <<HEREDOC 278 Optional - Number of units of time that Atlas retains each snapshot in the hourly snapshot schedule. 279 HEREDOC 280 type = number 281 default = 3 282 } 283 284 variable "policy_item_daily_frequency_interval" { 285 description = <<HEREDOC 286 Optional - Interval, in days, between snapshots that Atlas takes of the cluster. 287 HEREDOC 288 type = number 289 default = 1 290 } 291 292 variable "policy_item_daily_retention_unit" { 293 description = <<HEREDOC 294 Optional - Unit of time that Atlas retains each snapshot in the daily snapshot schedule. 295 HEREDOC 296 type = string 297 default = "days" 298 } 299 300 variable "policy_item_daily_retention_value" { 301 description = <<HEREDOC 302 Optional - Number of units of time that Atlas retains each snapshot in the daily snapshot schedule. 303 HEREDOC 304 type = number 305 default = 7 306 } 307 308 variable "policy_item_weekly_frequency_interval" { 309 description = <<HEREDOC 310 Optional - Interval, in weeks, between snapshots that Atlas takes of the cluster. 311 HEREDOC 312 type = number 313 default = 1 314 } 315 316 variable "policy_item_weekly_retention_unit" { 317 description = <<HEREDOC 318 Optional - Unit of time that Atlas retains each snapshot in the weekly snapshot schedule. 319 HEREDOC 320 type = string 321 default = "weeks" 322 } 323 324 variable "policy_item_weekly_retention_value" { 325 description = <<HEREDOC 326 Optional - Number of units of time that Atlas retains each snapshot in the weekly snapshot schedule. 327 HEREDOC 328 type = number 329 default = 4 330 } 331 332 333 variable "policy_item_monthly_frequency_interval" { 334 description = <<HEREDOC 335 Optional - Interval, in months, between snapshots that Atlas takes of the cluster. 336 HEREDOC 337 type = number 338 default = 1 339 } 340 341 variable "policy_item_monthly_retention_unit" { 342 description = <<HEREDOC 343 Optional - Unit of time that Atlas retains each snapshot in the monthly snapshot schedule. 344 HEREDOC 345 type = string 346 default = "months" 347 } 348 349 350 variable "policy_item_monthly_retention_value" { 351 description = <<HEREDOC 352 Optional - Number of units of time that Atlas retains each snapshot in the monthly snapshot schedule. 353 HEREDOC 354 type = number 355 default = 12 356 } 357 358 # ------------------------------------------------------------------------------ 359 # MONGODB TAGS 360 # ------------------------------------------------------------------------------ 361 variable "application" { 362 description = <<HEREDOC 363 Optional - Key-value pairs that tag and categorize the cluster for billing and organizational purposes. 364 HEREDOC 365 type = string 366 } 367 368 variable "environment" { 369 description = <<HEREDOC 370 Optional - Key-value pairs that tag and categorize the cluster for billing and organizational purposes. 371 HEREDOC 372 type = string 373 } 374 375 # ------------------------------------------------------------------------------ 376 # MONGODB DATA 377 # ------------------------------------------------------------------------------ 378 variable "project_name" { 379 description = <<HEREDOC 380 Required - The name of the Atlas project in which to create the cluster. 381 HEREDOC 382 type = string 383 }
Configuramos um arquivo chamado locals.tf especificamente para definir duas tags exemplares, com o objetivo de identificar o nome do nosso aplicativo e o ambiente no qual ele opera. Se preferir, é possível adotar um módulo de tag externo, semelhante aos usados na AWS, e integrá-lo a essa configuração.
1 locals { 2 tags = { 3 name = var.application 4 environment = var.environment 5 } 6 }
Neste artigo, adotamos o uso de fontes de dados no Terraform para estabelecer uma conexão dinâmica com recursos existentes, como o nosso projeto MongoDB Atlas. Especificamente, no arquivo data.tf, definimos uma fonte de dados
mongodbatlas_project
para acessar informações sobre um projeto existente com base em seu nome:1 data "mongodbatlas_project" "default" { 2 name = var.project_name 3 }
Aqui,
var.project_name
refere-se ao nome do projeto que queremos consultar, uma abordagem que nos permite manter nossa configuração flexível e reutilizável. O valor dessa variável pode ser fornecido de várias maneiras, expandindo significativamente as possibilidades de uso da nossa infraestrutura como código.O arquivo terraform.tfvars é usado para definir valores de variáveis que serão aplicados na configuração do Terraform, tornando a infraestrutura como código mais dinâmica e adaptável às necessidades específicas de cada projeto ou ambiente. No seu caso, o arquivo terraform.tfvars contém valores essenciais para criar um cluster no MongoDB Atlas, incluindo detalhes como o nome do projeto, características do cluster e configurações de auto-scaling. Veja abaixo como essas definições se aplicam:
1 project_name = "project-test" 2 name = "cluster-demo" 3 cluster_type = "REPLICASET" 4 application = "teste-cluster" 5 environment = "dev" 6 7 region_configs = [{ 8 provider_name = "AWS" 9 region_name = "US_EAST_1" 10 priority = 7 11 12 electable_specs = { 13 instance_size = "M10" 14 node_count = 3 15 disk_iops = 120 16 disk_size_gb = 10 17 ebs_volume_type = "STANDARD" 18 } 19 20 auto_scaling = { 21 disk_gb_enabled = true 22 compute_enabled = true 23 compute_scale_down_enabled = true 24 compute_min_instance_size = "M10" 25 compute_max_instance_size = "M30" 26 } 27 }]
Esses valores definidos em terraform.tfvars são usados pelo Terraform para preencher variáveis correspondentes em sua configuração. Por exemplo, se você tiver um módulo ou recurso que cria um cluster no MongoDB Atlas, você pode referenciar essas variáveis diretamente para configurar propriedades como nome do projeto, configurações do cluster e especificações regionais. Isso permite flexibilidade significativa na personalização de sua infraestrutura com base em diferentes ambientes ou requisitos de projeto.
A estrutura do arquivo era a seguinte:
- main.tf: Neste arquivo, definiremos o recurso principal, o mongodbotlas_advanced_cluster e mongodbanlas_cloud_backup_schedule. Aqui, você configurou o cluster e as rotinas de backup.
- provider.tf: Este arquivo é onde definimos o provedor que estamos usando - no nosso caso, mongodbatlas. Especificaremos o uso de variáveis de ambiente, conforme mencionado anteriormente.
- terraform.tfvars: Esse arquivo contém as variáveis que serão usadas em nosso cluster. Por exemplo, o nome do cluster, as informações do cluster, a versão, o tamanho, entre outros.
- variable.tf: Aqui, definimos as variáveis mencionadas no arquivo terraform.tfvars, especificando o tipo e, opcionalmente, um valor padrão.
- version.tf: Este arquivo é usado para especificar a versão do Terraform e os fornecedores que estamos usando.
- data.tf: Aqui, especificamos uma fonte de dados que nos trará informações sobre nosso projeto criado. Procuraremos seu nome e, para o nosso módulo, ele nos fornecerá o ID do projeto.
- locals.tf: Especificamos tags de exemplo para usar em nosso cluster.
Agora é a hora de se inscrever. =D
Executamos um
terraform init
no terminal na pasta onde os arquivos estão localizados para que ele baixe os provedores, módulos, etc.Observação: lembre-se de exportar as variáveis de ambiente com as chaves pública e privada.
1 export MONGODB_ATLAS_PUBLIC_KEY="public" 2 export MONGODB_ATLAS_PRIVATE_KEY="private"
Agora, executamos
terraform init
.1 (base) samuelmolling@Samuels-MacBook-Pro cluster % terraform init 2 3 Initializing the backend... 4 5 Initializing provider plugins... 6 - Finding mongodb/mongodbatlas versions matching "1.14.0"... 7 - Installing mongodb/mongodbatlas v1.14.0... 8 - Installed mongodb/mongodbatlas v1.14.0 (signed by a HashiCorp partner, key ID 2A32ED1F3AD25ABF) 9 10 Partner and community providers are signed by their developers. 11 If you'd like to know more about provider signing, you can read about it here: 12 https://www.terraform.io/docs/cli/plugins/signing.html 13 14 Terraform has created a lock file .terraform.lock.hcl to record the provider selections it made above. Include this file in your version control repository so that Terraform can guarantee to make the same selections by default when you run `terraform init` in the future. 15 16 Terraform has been successfully initialized! 17 18 You may now begin working with Terraform. Try running `terraform plan` to see any changes that are required for your infrastructure. All Terraform commands should now work. 19 20 If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your working directory. If you forget, other commands will detect it and remind you to do so if necessary.
Agora que o init funcionou, vamos executar
terraform plan
e avaliar o que acontecerá:1 (base) samuelmolling@Samuels-MacBook-Pro cluster % terraform plan 2 data.mongodbatlas_project.default: Reading... 3 data.mongodbatlas_project.default: Read complete after 2s [id=65bfd71a08b61c36ca4d8eaa] 4 5 Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: 6 + create 7 8 Terraform will perform the following actions: 9 10 # mongodbatlas_advanced_cluster.default will be created 11 + resource "mongodbatlas_advanced_cluster" "default" { 12 + advanced_configuration = [ 13 + { 14 + default_read_concern = "local" 15 + default_write_concern = "majority" 16 + fail_index_key_too_long = false 17 + javascript_enabled = true 18 + minimum_enabled_tls_protocol = "TLS1_2" 19 + no_table_scan = false 20 + oplog_size_mb = (known after apply) 21 + sample_refresh_interval_bi_connector = 300 22 + sample_size_bi_connector = 100 23 + transaction_lifetime_limit_seconds = 60 24 }, 25 ] 26 + backup_enabled = true 27 + cluster_id = (known after apply) 28 + cluster_type = "REPLICASET" 29 + connection_strings = (known after apply) 30 + create_date = (known after apply) 31 + disk_size_gb = 10 32 + encryption_at_rest_provider = (known after apply) 33 + id = (known after apply) 34 + mongo_db_major_version = "7.0" 35 + mongo_db_version = (known after apply) 36 + name = "cluster-demo" 37 + paused = (known after apply) 38 + pit_enabled = true 39 + project_id = "65bfd71a08b61c36ca4d8eaa" 40 + root_cert_type = (known after apply) 41 + state_name = (known after apply) 42 + termination_protection_enabled = (known after apply) 43 + version_release_system = (known after apply) 44 45 + bi_connector_config { 46 + enabled = false 47 + read_preference = "secondary" 48 } 49 50 + replication_specs { 51 + container_id = (known after apply) 52 + id = (known after apply) 53 + num_shards = 1 54 + zone_name = "ZoneName managed by Terraform" 55 56 + region_configs { 57 + priority = 7 58 + provider_name = "AWS" 59 + region_name = "US_EAST_1" 60 61 + analytics_auto_scaling { 62 + compute_enabled = (known after apply) 63 + compute_max_instance_size = (known after apply) 64 + compute_min_instance_size = (known after apply) 65 + compute_scale_down_enabled = (known after apply) 66 + disk_gb_enabled = (known after apply) 67 } 68 69 + analytics_specs { 70 + disk_iops = (known after apply) 71 + ebs_volume_type = "STANDARD" 72 + instance_size = "M10" 73 + node_count = 0 74 } 75 76 + auto_scaling { 77 + compute_enabled = true 78 + compute_max_instance_size = "M30" 79 + compute_min_instance_size = "M10" 80 + compute_scale_down_enabled = true 81 + disk_gb_enabled = true 82 } 83 84 + electable_specs { 85 + disk_iops = (known after apply) 86 + ebs_volume_type = "STANDARD" 87 + instance_size = "M10" 88 + node_count = 3 89 } 90 91 + read_only_specs { 92 + disk_iops = (known after apply) 93 + ebs_volume_type = "STANDARD" 94 + instance_size = "M10" 95 + node_count = 0 96 } 97 } 98 } 99 100 + tags { 101 + key = "environment" 102 + value = "dev" 103 } 104 + tags { 105 + key = "name" 106 + value = "teste-cluster" 107 } 108 } 109 110 # mongodbatlas_cloud_backup_schedule.default will be created 111 + resource "mongodbatlas_cloud_backup_schedule" "default" { 112 + auto_export_enabled = (known after apply) 113 + cluster_id = (known after apply) 114 + cluster_name = "cluster-demo" 115 + id = (known after apply) 116 + id_policy = (known after apply) 117 + next_snapshot = (known after apply) 118 + project_id = "65bfd71a08b61c36ca4d8eaa" 119 + reference_hour_of_day = 3 120 + reference_minute_of_hour = 30 121 + restore_window_days = 3 122 + update_snapshots = false 123 + use_org_and_group_names_in_export_prefix = (known after apply) 124 125 + policy_item_daily { 126 + frequency_interval = 1 127 + frequency_type = (known after apply) 128 + id = (known after apply) 129 + retention_unit = "days" 130 + retention_value = 7 131 } 132 133 + policy_item_hourly { 134 + frequency_interval = 12 135 + frequency_type = (known after apply) 136 + id = (known after apply) 137 + retention_unit = "days" 138 + retention_value = 3 139 } 140 141 + policy_item_monthly { 142 + frequency_interval = 1 143 + frequency_type = (known after apply) 144 + id = (known after apply) 145 + retention_unit = "months" 146 + retention_value = 12 147 } 148 149 + policy_item_weekly { 150 + frequency_interval = 1 151 + frequency_type = (known after apply) 152 + id = (known after apply) 153 + retention_unit = "weeks" 154 + retention_value = 4 155 } 156 } 157 158 Plan: 2 to add, 0 to change, 0 to destroy. 159 160 ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── 161 162 Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run `terraform apply` now.
Show! Era exatamente o resultado que esperávamos ver, a criação de um recurso de cluster com as políticas de backup. Vamos aplicar isso!
Ao executar o comando
terraform apply
, você será solicitado para aprovação com yes
ou no
. Digite yes
.1 (base) samuelmolling@Samuels-MacBook-Pro cluster % terraform apply 2 3 data.mongodbatlas_project.default: Reading... 4 5 data.mongodbatlas_project.default: Read complete after 2s [id=65bfd71a08b61c36ca4d8eaa] 6 7 Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: 8 + create 9 10 Terraform will perform the following actions: 11 12 # mongodbatlas_advanced_cluster.default will be created 13 + resource "mongodbatlas_advanced_cluster" "default" { 14 + advanced_configuration = [ 15 + { 16 + default_read_concern = "local" 17 + default_write_concern = "majority" 18 + fail_index_key_too_long = false 19 + javascript_enabled = true 20 + minimum_enabled_tls_protocol = "TLS1_2" 21 + no_table_scan = false 22 + oplog_size_mb = (known after apply) 23 + sample_refresh_interval_bi_connector = 300 24 + sample_size_bi_connector = 100 25 + transaction_lifetime_limit_seconds = 60 26 }, 27 ] 28 + backup_enabled = true 29 + cluster_id = (known after apply) 30 + cluster_type = "REPLICASET" 31 + connection_strings = (known after apply) 32 + create_date = (known after apply) 33 + disk_size_gb = 10 34 + encryption_at_rest_provider = (known after apply) 35 + id = (known after apply) 36 + mongo_db_major_version = "7.0" 37 + mongo_db_version = (known after apply) 38 + name = "cluster-demo" 39 + paused = (known after apply) 40 + pit_enabled = true 41 + project_id = "65bfd71a08b61c36ca4d8eaa" 42 + root_cert_type = (known after apply) 43 + state_name = (known after apply) 44 + termination_protection_enabled = (known after apply) 45 + version_release_system = (known after apply) 46 + bi_connector_config { 47 + enabled = false 48 + read_preference = "secondary" 49 } 50 51 + replication_specs { 52 + container_id = (known after apply) 53 + id = (known after apply) 54 + num_shards = 1 55 + zone_name = "ZoneName managed by Terraform" 56 57 + region_configs { 58 + priority = 7 59 + provider_name = "AWS" 60 + region_name = "US_EAST_1" 61 62 + analytics_auto_scaling { 63 + compute_enabled = (known after apply) 64 + compute_max_instance_size = (known after apply) 65 + compute_min_instance_size = (known after apply) 66 + compute_scale_down_enabled = (known after apply) 67 + disk_gb_enabled = (known after apply) 68 } 69 70 + analytics_specs { 71 + disk_iops = (known after apply) 72 + ebs_volume_type = "STANDARD" 73 + instance_size = "M10" 74 + node_count = 0 75 } 76 77 + auto_scaling { 78 + compute_enabled = true 79 + compute_max_instance_size = "M30" 80 + compute_min_instance_size = "M10" 81 + compute_scale_down_enabled = true 82 + disk_gb_enabled = true 83 } 84 85 + electable_specs { 86 + disk_iops = (known after apply) 87 + ebs_volume_type = "STANDARD" 88 + instance_size = "M10" 89 + node_count = 3 90 } 91 92 + read_only_specs { 93 + disk_iops = (known after apply) 94 + ebs_volume_type = "STANDARD" 95 + instance_size = "M10" 96 + node_count = 0 97 } 98 } 99 } 100 101 + tags { 102 + key = "environment" 103 + value = "dev" 104 } 105 + tags { 106 + key = "name" 107 + value = "teste-cluster" 108 } 109 } 110 111 # mongodbatlas_cloud_backup_schedule.default will be created 112 + resource "mongodbatlas_cloud_backup_schedule" "default" { 113 + auto_export_enabled = (known after apply) 114 + cluster_id = (known after apply) 115 + cluster_name = "cluster-demo" 116 + id = (known after apply) 117 + id_policy = (known after apply) 118 + next_snapshot = (known after apply) 119 + project_id = "65bfd71a08b61c36ca4d8eaa" 120 + reference_hour_of_day = 3 121 + reference_minute_of_hour = 30 122 + restore_window_days = 3 123 + update_snapshots = false 124 + use_org_and_group_names_in_export_prefix = (known after apply) 125 + policy_item_daily { 126 + frequency_interval = 1 127 + frequency_type = (known after apply) 128 + id = (known after apply) 129 + retention_unit = "days" 130 + retention_value = 7 131 } 132 133 + policy_item_hourly { 134 + frequency_interval = 12 135 + frequency_type = (known after apply) 136 + id = (known after apply) 137 + retention_unit = "days" 138 + retention_value = 3 139 } 140 141 + policy_item_monthly { 142 + frequency_interval = 1 143 + frequency_type = (known after apply) 144 + id = (known after apply) 145 + retention_unit = "months" 146 + retention_value = 12 147 } 148 149 + policy_item_weekly { 150 + frequency_interval = 1 151 + frequency_type = (known after apply) 152 + id = (known after apply) 153 + retention_unit = "weeks" 154 + retention_value = 4 155 } 156 } 157 158 Plan: 2 to add, 0 to change, 0 to destroy. 159 160 Do you want to perform these actions? 161 Terraform will perform the actions described above. 162 Only 'yes' will be accepted to approve. 163 164 Enter a value: yes 165 166 mongodbatlas_advanced_cluster.default: Creating... 167 mongodbatlas_advanced_cluster.default: Still creating... [10s elapsed] 168 mongodbatlas_advanced_cluster.default: Still creating... [8m40s elapsed] 169 mongodbatlas_advanced_cluster.default: Creation complete after 8m46s [id=Y2x1c3Rlcl9pZA==:NjViZmRmYzczMTBiN2Y2ZDFhYmIxMmQ0-Y2x1c3Rlcl9uYW1l:Y2x1c3Rlci1kZW1v-cHJvamVjdF9pZA==:NjViZmQ3MWEwOGI2MWMzNmNhNGQ4ZWFh] 170 mongodbatlas_cloud_backup_schedule.default: Creating... 171 mongodbatlas_cloud_backup_schedule.default: Creation complete after 2s [id=Y2x1c3Rlcl9uYW1l:Y2x1c3Rlci1kZW1v-cHJvamVjdF9pZA==:NjViZmQ3MWEwOGI2MWMzNmNhNGQ4ZWFh] 172 173 Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
Este processo levou oito minutos e 40 segundos para ser executado. Encurtei a saída do log, mas não se preocupe se essa etapa levar tempo.
Agora, vamos dar uma olhada no Atlas para ver se o cluster foi criado com sucesso...
Conseguimos criar nosso primeiro conjunto de réplicas com uma política de backup padrão com PITR e snapshots agendados.
Neste tutorial, vimos como criar o primeiro cluster em nosso projeto criado no último artigo. Criamos um módulo que também inclui uma política de backup. Em um próximo artigo, vamos ver como criar uma chave de API e um usuário usando Terraform e Atlas.
Para saber mais sobre o MongoDB e várias ferramentas, Convido você a visitar o Centro do Desenvolvedor para ler os outros artigos.
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.