Explore o novo chatbot do Developer Center! O MongoDB AI chatbot pode ser acessado na parte superior da sua navegação para responder a todas as suas perguntas sobre o MongoDB .

Learn why MongoDB was selected as a leader in the 2024 Gartner® Magic Quadrant™
Desenvolvedor do MongoDB
Central de desenvolvedor do MongoDBchevron-right
Produtoschevron-right
Atlaschevron-right

MongoDB Atlas com Terraform - Políticas de cluster e backup

SM
Samuel Molling22 min read • Published Sep 11, 2024 • Updated Sep 11, 2024
TerraformAtlas
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
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
Observação: não usaremos um arquivo de backend. No entanto, para implementações produtivos, é extremamente importante e seguro armazenar o arquivo de estado em um local remoto, como S3, GCS, Azurermetc.

Criando um cluster

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.

Configuração do provedor de Terraform para MongoDB Atlas

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: 
1provider "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.

Criando o arquivo de versão do Terraform

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 blocorequired_providers dentro do bloco Terraform, como mostrado abaixo:
1terraform {
2  required_version = ">= 0.12"
3  required_providers {
4    mongodbatlas = {
5      source = "mongodb/mongodbatlas"
6      version = "1.14.0"
7    }
8  }
9}

Definir o recurso do cluster

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# ------------------------------------------------------------------------------
4resource "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, SHARDEDou 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_gbapenas 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# ------------------------------------------------------------------------------
4resource "mongodbatlas_cloud_backup_schedule" "default" {
5project_id = data.mongodbatlas_project.default.id
6cluster_name = mongodbatlas_advanced_cluster.default.name
7update_snapshots = var.update_snapshots
8reference_hour_of_day = var.reference_hour_of_day
9reference_minute_of_hour = var.reference_minute_of_hour
10restore_window_days = var.restore_window_days
11
12policy_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
18policy_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
24policy_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
30policy_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 recursosmongodbatlas_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çãoignore_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:
1variable "name" {
2description = "The name of the cluster."
3type = string
4}
5
6variable "cluster_type" {
7description = <<HEREDOC
8Optional - Specifies the type of the cluster that you want to modify. You cannot convert
9a sharded cluster deployment to a replica set deployment. Accepted values include:
10REPLICASET for Replica set, SHARDED for Sharded cluster, and GEOSHARDED for Global Cluster
11HEREDOC
12default = "REPLICASET"
13}
14
15
16variable "mongo_db_major_version" {
17description = <<HEREDOC
18Optional - Version of the cluster to deploy. Atlas supports the following MongoDB versions
19for M10+ clusters: 5.0, 6.0 or 7.0.
20HEREDOC
21default = "7.0"
22}
23
24variable "version_release_system" {
25description = <<HEREDOC
26Optional - Release cadence that Atlas uses for this cluster. This parameter defaults to LTS.
27If you set this field to CONTINUOUS, you must omit the mongo_db_major_version field. Atlas accepts:
28CONTINUOUS - Atlas deploys the latest version of MongoDB available for the cluster tier.
29LTS - Atlas deploys the latest Long Term Support (LTS) version of MongoDB available for the cluster tier.
30HEREDOC
31default = "LTS"
32}
33
34
35
36variable "disk_size_gb" {
37description = <<HEREDOC
38Optional - Capacity, in gigabytes, of the host’s root volume. Increase this
39number to add capacity, up to a maximum possible value of 4096 (i.e., 4 TB). This value must
40be a positive integer. If you specify diskSizeGB with a lower disk size, Atlas defaults to
41the minimum disk size value. Note: The maximum value for disk storage cannot exceed 50 times
42the maximum RAM for the selected cluster. If you require additional storage space beyond this
43limitation, consider upgrading your cluster to a higher tier.
44HEREDOC
45type = number
46default = 10
47}
48
49variable "backup_enabled" {
50description = <<HEREDOC
51Optional - Flag indicating if the cluster uses Cloud Backup for backups. If true, the cluster
52uses Cloud Backup for backups. The default is true.
53HEREDOC
54type = bool
55default = true
56}
57
58variable "pit_enabled" {
59description = <<HEREDOC
60Optional - Flag that indicates if the cluster uses Continuous Cloud Backup. If set to true,
61backup_enabled must also be set to true. The default is true.
62HEREDOC
63type = bool
64default = true
65}
66
67variable "disk_gb_enabled" {
68description = <<HEREDOC
69Optional - Specifies whether disk auto-scaling is enabled. The default is true.
70HEREDOC
71type = bool
72default = true
73}
74
75variable "region_configs" {
76description = <<HEREDOC
77Required - Physical location of the region. Each regionsConfig document describes
78the region’s priority in elections and the number and type of MongoDB nodes Atlas
79deploys 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
86must 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.
89Read-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.
92Analytics 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.
93HEREDOC
94type = any
95}
96
97# ------------------------------------------------------------------------------
98# MONGODB BI CONNECTOR
99# ------------------------------------------------------------------------------
100
101variable "bi_connector_enabled" {
102description = <<HEREDOC
103Optional - Specifies whether or not BI Connector for Atlas is enabled on the cluster.
104Set to true to enable BI Connector for Atlas. Set to false to disable BI Connector for Atlas.
105HEREDOC
106type = bool
107default = false
108}
109
110variable "bi_connector_read_preference" {
111description = <<HEREDOC
112Optional - Specifies the read preference to be used by BI Connector for Atlas on the cluster.
113Each 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.
114Set 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.
115HEREDOC
116type = string
117default = "secondary"
118}
119
120# ------------------------------------------------------------------------------
121# MONGODB ADVANCED CONFIGURATION
122# ------------------------------------------------------------------------------
123variable "fail_index_key_too_long" {
124description = <<HEREDOC
125Optional - 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.
126HEREDOC
127type = bool
128default = false
129}
130
131variable "javascript_enabled" {
132description = <<HEREDOC
133Optional - When true, the cluster allows execution of operations that perform server-side executions of JavaScript. When false, the cluster disables execution of those operations.
134HEREDOC
135type = bool
136default = true
137}
138
139variable "minimum_enabled_tls_protocol" {
140description = <<HEREDOC
141Optional - 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".
142HEREDOC
143default = "TLS1_2"
144}
145
146variable "no_table_scan" {
147description = <<HEREDOC
148Optional - 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.
149HEREDOC
150type = bool
151default = false
152}
153
154variable "oplog_size_mb" {
155description = <<HEREDOC
156Optional - The custom oplog size of the cluster.
157Without a value that indicates that the cluster uses the default oplog size calculated by Atlas.
158HEREDOC
159type = number
160default = null
161}
162
163variable "default_read_concern" {
164description = <<HEREDOC
165Optional - The default read concern for the cluster. The default is "local".
166HEREDOC
167default = "local"
168}
169
170variable "default_write_concern" {
171description = <<HEREDOC
172Optional - The default write concern for the cluster. The default is "majority".
173HEREDOC
174default = "majority"
175}
176
177variable "oplog_min_retention_hours" {
178description = <<HEREDOC
179Minimum retention window for cluster's oplog expressed in hours.
180A value of null indicates that the cluster uses the default minimum oplog window that MongoDB Cloud calculates.
181HEREDOC
182type = number
183default = null
184}
185
186variable "transaction_lifetime_limit_seconds" {
187description = <<HEREDOC
188Optional - Lifetime, in seconds, of multi-document transactions. Defaults to 60 seconds.
189HEREDOC
190type = number
191default = 60
192}
193
194variable "sample_size_bi_connector" {
195description = <<HEREDOC
196Optional - Number of documents per database to sample when gathering schema information. Defaults to 100.
197Available only for Atlas deployments in which BI Connector for Atlas is enabled.
198HEREDOC
199type = number
200default = 100
201}
202
203variable "sample_refresh_interval_bi_connector" {
204description = <<HEREDOC
205Optional - Interval in seconds at which the mongosqld process re-samples data to create its relational schema. The default value is 300.
206The specified value must be a positive integer.
207Available only for Atlas deployments in which BI Connector for Atlas is enabled.
208HEREDOC
209type = number
210default = 300
211}
212
213# ------------------------------------------------------------------------------
214# MONGODB REPLICATION SPECS
215# ------------------------------------------------------------------------------
216variable "num_shards" {
217description = <<HEREDOC
218Optional - Number of shards, minimum 1.
219The default is null if type is REPLICASET.
220HEREDOC
221type = number
222default = null
223}
224
225# ------------------------------------------------------------------------------
226# MONGODB BACKUP POLICY
227# ------------------------------------------------------------------------------
228variable "update_snapshots" {
229description = <<HEREDOC
230Optional - Specify true to apply the retention changes in the updated backup policy to snapshots that Atlas took previously.
231HEREDOC
232type = bool
233default = false
234}
235
236variable "reference_hour_of_day" {
237description = <<HEREDOC
238Optional - Hour of the day in UTC at which Atlas takes the daily snapshots of the cluster.
239HEREDOC
240type = number
241default = 3
242}
243
244variable "reference_minute_of_hour" {
245description = <<HEREDOC
246Optional - Minute of the hour in UTC at which Atlas takes the daily snapshots of the cluster.
247HEREDOC
248type = number
249default = 30
250}
251
252variable "restore_window_days" {
253description = <<HEREDOC
254Optional - Number of days Atlas retains the backup snapshots in the snapshot schedule.
255HEREDOC
256type = number
257default = 3
258}
259
260variable "policy_item_hourly_frequency_interval" {
261description = <<HEREDOC
262Optional - Interval, in hours, between snapshots that Atlas takes of the cluster.
263HEREDOC
264type = number
265default = 12
266}
267
268variable "policy_item_hourly_retention_unit" {
269description = <<HEREDOC
270Optional - Unit of time that Atlas retains each snapshot in the hourly snapshot schedule.
271HEREDOC
272type = string
273default = "days"
274}
275
276variable "policy_item_hourly_retention_value" {
277description = <<HEREDOC
278Optional - Number of units of time that Atlas retains each snapshot in the hourly snapshot schedule.
279HEREDOC
280type = number
281default = 3
282}
283
284variable "policy_item_daily_frequency_interval" {
285description = <<HEREDOC
286Optional - Interval, in days, between snapshots that Atlas takes of the cluster.
287HEREDOC
288type = number
289default = 1
290}
291
292variable "policy_item_daily_retention_unit" {
293description = <<HEREDOC
294Optional - Unit of time that Atlas retains each snapshot in the daily snapshot schedule.
295HEREDOC
296type = string
297default = "days"
298}
299
300variable "policy_item_daily_retention_value" {
301description = <<HEREDOC
302Optional - Number of units of time that Atlas retains each snapshot in the daily snapshot schedule.
303HEREDOC
304type = number
305default = 7
306}
307
308variable "policy_item_weekly_frequency_interval" {
309description = <<HEREDOC
310Optional - Interval, in weeks, between snapshots that Atlas takes of the cluster.
311HEREDOC
312type = number
313default = 1
314}
315
316variable "policy_item_weekly_retention_unit" {
317description = <<HEREDOC
318Optional - Unit of time that Atlas retains each snapshot in the weekly snapshot schedule.
319HEREDOC
320type = string
321default = "weeks"
322}
323
324variable "policy_item_weekly_retention_value" {
325description = <<HEREDOC
326Optional - Number of units of time that Atlas retains each snapshot in the weekly snapshot schedule.
327HEREDOC
328type = number
329default = 4
330}
331
332
333variable "policy_item_monthly_frequency_interval" {
334description = <<HEREDOC
335Optional - Interval, in months, between snapshots that Atlas takes of the cluster.
336HEREDOC
337type = number
338default = 1
339}
340
341variable "policy_item_monthly_retention_unit" {
342description = <<HEREDOC
343Optional - Unit of time that Atlas retains each snapshot in the monthly snapshot schedule.
344HEREDOC
345type = string
346default = "months"
347}
348
349
350variable "policy_item_monthly_retention_value" {
351description = <<HEREDOC
352Optional - Number of units of time that Atlas retains each snapshot in the monthly snapshot schedule.
353HEREDOC
354type = number
355default = 12
356}
357
358# ------------------------------------------------------------------------------
359# MONGODB TAGS
360# ------------------------------------------------------------------------------
361variable "application" {
362description = <<HEREDOC
363Optional - Key-value pairs that tag and categorize the cluster for billing and organizational purposes.
364HEREDOC
365type = string
366}
367
368variable "environment" {
369description = <<HEREDOC
370Optional - Key-value pairs that tag and categorize the cluster for billing and organizational purposes.
371HEREDOC
372type = string
373}
374
375# ------------------------------------------------------------------------------
376# MONGODB DATA
377# ------------------------------------------------------------------------------
378variable "project_name" {
379description = <<HEREDOC
380Required - The name of the Atlas project in which to create the cluster.
381HEREDOC
382type = 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.
1locals {
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 dadosmongodbatlas_projectpara acessar informações sobre um projeto existente com base em seu nome:
1data "mongodbatlas_project" "default" {
2name = 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:
1project_name = "project-test"
2name = "cluster-demo"
3cluster_type = "REPLICASET"
4application = "teste-cluster"
5environment = "dev"
6
7region_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.
1export MONGODB_ATLAS_PUBLIC_KEY="public"                    
2export MONGODB_ATLAS_PRIVATE_KEY="private"
Agora, executamos terraform init.
1(base) samuelmolling@Samuels-MacBook-Pro cluster % terraform init
2
3Initializing the backend...
4
5Initializing 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
10Partner and community providers are signed by their developers.
11If you'd like to know more about provider signing, you can read about it here:
12https://www.terraform.io/docs/cli/plugins/signing.html
13
14Terraform 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
16Terraform has been successfully initialized!
17
18You 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
20If 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
2data.mongodbatlas_project.default: Reading...
3data.mongodbatlas_project.default: Read complete after 2s [id=65bfd71a08b61c36ca4d8eaa]
4
5Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
6  + create
7
8Terraform 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
158Plan: 2 to add, 0 to change, 0 to destroy.
159
160─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
161
162Note: 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 comandoterraform apply, você será solicitado para aprovação com yes ou no. Digite yes.
1(base) samuelmolling@Samuels-MacBook-Pro cluster % terraform apply 
2
3data.mongodbatlas_project.default: Reading...
4
5data.mongodbatlas_project.default: Read complete after 2s [id=65bfd71a08b61c36ca4d8eaa]
6
7Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
8  + create
9
10Terraform 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
158Plan: 2 to add, 0 to change, 0 to destroy.
159
160Do 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
166mongodbatlas_advanced_cluster.default: Creating...
167mongodbatlas_advanced_cluster.default: Still creating... [10s elapsed]
168mongodbatlas_advanced_cluster.default: Still creating... [8m40s elapsed]
169mongodbatlas_advanced_cluster.default: Creation complete after 8m46s [id=Y2x1c3Rlcl9pZA==:NjViZmRmYzczMTBiN2Y2ZDFhYmIxMmQ0-Y2x1c3Rlcl9uYW1l:Y2x1c3Rlci1kZW1v-cHJvamVjdF9pZA==:NjViZmQ3MWEwOGI2MWMzNmNhNGQ4ZWFh]
170mongodbatlas_cloud_backup_schedule.default: Creating...
171mongodbatlas_cloud_backup_schedule.default: Creation complete after 2s [id=Y2x1c3Rlcl9uYW1l:Y2x1c3Rlci1kZW1v-cHJvamVjdF9pZA==:NjViZmQ3MWEwOGI2MWMzNmNhNGQ4ZWFh]
172
173Apply 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...
Atlas Cluster overview Tela de informações de backup do Atlas cluster
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.
Iniciar a conversa

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Tutorial

Usando o driver Node.js MongoDB com AWS Lambda


Jan 23, 2024 | 5 min read
Artigo

Atlas Search é uma virada de jogo!


Sep 09, 2024 | 2 min read
Tutorial

Como criar um sistema RAG avançado com recuperação autoquery


Sep 12, 2024 | 21 min read
Tutorial

Como criar um sistema RAG usando o Claude 3 Opus e o MongoDB


Aug 28, 2024 | 15 min read
Sumário
  • Criando um cluster