Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save glaszczak/5794860fbb1d9d6816d48ea4047e682c to your computer and use it in GitHub Desktop.
Save glaszczak/5794860fbb1d9d6816d48ea4047e682c to your computer and use it in GitHub Desktop.

How to Connect MongoDB Atlas Database with AWS using terraform


Initialize Terraform

$ terraform init
$ terraform apply

IMPORTANT

Always use "_" sign in the resource name (project_name, cluster_name etc). Sign "-" is forbidden!


Create Local Variables

AWS Variables

AWS_REGION > Name of the AWS region selected by user in AWS console (e.x. "eu-central-1")

AWS_DEFAULT_VPD_CIDR > Go to AWS Console > Services > VPC > Your VPCs (left menu) > Select 'IPv4 CIDR' field for specific VPC

AWS_DEFAULT_VPC_ID > Go to AWS Console > Services > VPC > Your VPCs (left menu) > Select 'VPC ID' field for specific VPC

AWS_ACCOUNT_ID > Go to AWS Console > Select 'My Account' (top dropdown mentu for current user) > Copy 'Account Id'

MongoDB Atlas Variables

ATLAS_PUBLIC_KEY > This is the MongoDB Atlas API public_key which should be created by user > Go to MongoDB Atlas account > Projects > Access Manager > Api Keys tab > Create API Key or select existing

ATLAS_PRIVATE_KEY > Same section as above

ATLAS_ORGANIZATION_ID > Go to MongoDB Atlas account > Projects > Settings

ATLAS_CIDR_BLOCK > Go to MongoDB Atlas account > Projects > Select Project > Network Access > Peering tab > Add Peering Connection > Select aws > copy VPC CIDR


Some Arguments Explenation

provider_instance_size_name > M10 - will charge your account, to test it for free select M0

provider_region_name > location of MongoDB cluster - reference list for AWS


Output File with .tf extension

locals {
  aws_region           = AWS_REGION
  aws_default_vpc_cidr = AWS_DEFAULT_VPD_CIDR
  aws_default_vpc_id   = AWS_DEFAULT_VPC_ID
  aws_account_id       = AWS_ACCOUNT_ID

  atlas_mongo_public_key  = ATLAS_PUBLIC_KEY
  atlas_mongo_private_key = ATLAS_PRIVATE_KEY
  atlas_org_id            = ATLAS_ORGANIZATION_ID
  atlas_cidr_block        = ATLAS_CIDR_BLOCK
}


// PROVIDERS
provider "aws" {
  region                  = local.aws_region
  shared_credentials_file = "$HOME/.aws/credentials"
}

provider "mongodbatlas" {
  public_key  = local.atlas_mongo_public_key
  private_key = local.atlas_mongo_private_key
}

// MONGO SETUP
resource "mongodbatlas_project" "project_name" {
  name   = "project_name"
  org_id = local.atlas_org_id
}

resource "mongodbatlas_cluster" "cluster_name" {
  project_id = mongodbatlas_project.<project_name>.id
  name       = "cluster_name"
  num_shards = 1

  replication_factor           = 3
  provider_backup_enabled      = true
  auto_scaling_disk_gb_enabled = true
  mongo_db_major_version       = "4.2"

  provider_name               = "AWS"
  provider_volume_type        = "STANDARD"
  provider_instance_size_name = "M10"
  provider_region_name        = "EU_CENTRAL_1"
}

resource "mongodbatlas_network_container" "container_name" {
  project_id       = mongodbatlas_project.<project_name>.id
  atlas_cidr_block = local.atlas_cidr_block
  provider_name    = "AWS"
  region_name      = "EU_CENTRAL_1"
}

resource "mongodbatlas_network_peering" "network_peering_name" {
  accepter_region_name   = "EU_CENTRAL_1"
  project_id             = mongodbatlas_project.<project_name>.id
  container_id           = mongodbatlas_network_container.<container_name>.container_id
  provider_name          = "AWS"
  route_table_cidr_block = local.aws_default_vpc_cidr
  vpc_id                 = local.aws_default_vpc_id
  aws_account_id         = local.aws_account_id
}

resource "aws_vpc_peering_connection_accepter" "peer_name" {
  vpc_peering_connection_id = mongodbatlas_network_peering.<network_peering_name>.connection_id
  auto_accept               = true
}

Check if it works

$ terraform plan

Correct output: Plan: to add, 0 to change, 0 to destroy = SUCCESS


Apply infractucture

$ transform apply

To remove all infractucture

$ terraform destroy

Correct output: Plan: 0 to add, 0 to change, to destroy


Helpful Links

Configure Atlas API Access

AWS Provider

MongoDB Atlas Provider

MongoDB Atlas Project

MongoDB Atlas Cluster

MongoDB Atlas Network Container

MongoDB Atlas Network Peering

@stanlee321
Copy link

How I can connect to an actual db cluster from terraform ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment