Let’s Get Started with Terraform for Astra DB

Author: Jeff Davies

Terraform is the tool for managing the lifecycle of your infrastructure. It allows you to build, change, and version infrastructure efficiently and safely. Terraform can help you create databases, roles, security tokens, and access lists. Read on to see how you can get started.

DataStax has created an open-source Terraform provider for DataStax Astra DB. A provider that makes it easy to script the creation of an Astra DB database, roles, security tokens, and access lists for your database.

A provider is the translation layer provided by a vendor that allows the provider’s platform to execute Terraform engine commands. For example, Amazon AWS has a Terraform provider that will translate the Terraform scripts into real actions (i.e. creating compute instances or any other AWS asset). Similarly, there are providers for Google, Azure, Oracle, and over a thousand other service providers. You can find all current providers on the registry.terraform.io page.

It’s a bit misleading to say that the provider translates the Terraform commands. It’s not like the good folks at Hashicorp (the creators of Terraform) defined a single way of expressing every idea in cloud computing! That’s impossible (there is no spoon). But, they provide a framework to give you provider-specific commands from Terraform to the provider of your choice. You’ll see precisely how this works when we create the Astra database.

Terraform is very easy to use once you get your head wrapped around it. It’s not a procedural language or an object-oriented one. Instead, you create files that describe the desired end-state of your database, and Terraform will then create or destroy it, depending on your specific commands.

Getting started with Terraform for Astra

Getting started is as simple as installing Terraform and then telling Terraform to implement the Astra “provider.”

To install Terraform:

  1. Click on this link and press the “Download CLI” button.
  2. Follow the installation instructions from Terraform.
  3. Add the terraform directory to your system’s PATH environment variable so you can start it from anywhere.

Once Terraform is fully installed, create a folder on your local file system for your project, then change it into that new folder.

In your new project folder, create a file with the name main.tf. Technically you could name it anything you want, but main.tf is the traditional name for the file that contains the terraform{} declaration.

At this point, you technically have a working Terraform project. However, it doesn’t do much. All it does is install the Astra provider. To run it, use the terraform init command, which will produce the following output:

So far, our main.tf file has provided two instructions:

  1. Ensure we are running Terraform version 1.0.0 or greater
  2. Load the Astra provider for Terraform version 1.0.0 or higher

If you examine your project directory you’ll see a new hidden directory, .terraform.

Pro Tip: When specifying versions, it’s best to use the >= notation to ensure that you are getting the latest version (with the latest security patches, features, etc.).

Creating an Astra DB database

Let’s modify our project to create an Astra DB database. Before you can do that, you will need the following:

  1. An Astra DB Database account. You can register for free at astra.datastax.com/register.
  2. You’ll need to create an Astra DB API for the Organization Administrator or Database Administrator roles. The security token will allow Terraform to connect to the Astra API layer to execute its commands. If you’re new to Astra and unsure how to create your security token, check out this page.

Pro Tip (Security): When you create your organization security token, use an export statement to put it in a setenv.sh file along with the other Astra-required information and then set a .gitignore rule.

I’m very sensitive to accidentally sharing my security tokens, and I hope you feel the same way. When I created my organization security token, I put it in a setenv.sh file using an export statement, along with the other Astra information that will be needed:

Then, from the command line, I set that environment variable using a source setenv.sh command (Mac or Linux). Then set a .gitignore rule for that file. That way, it’s highly unlikely that my security token will even end up on GitHub!

Where can I find my Organization ID?

Logging into your main dashboard is the easiest way to find your organization ID. In the URL in your browser, your organization ID is the UUID listed after the astra.datastax.com/ in your browser’s address bar.

Define variables

You can pass information into the Terraform process using variables. In our case, we need to pass in ASTRA_API_TOKEN and ASTRA_ORGANIZATION_ID values from our environment variables. To do this, create a file called variables.tf and give it the following contents:

That tells the Terraform process that a variable exists, but it doesn’t define the contents of those variables. It’ll define the contents of these variables via the command line. Local variables are different, you’ll read about them in the next section.

Define resources

Terraform describes a resource as: “Each resource block describes one or more infrastructure objects, such as virtual networks, compute instances, or higher-level components such as DNS records.”

In simpler terms, a resource is something that you create. In Astra, that will be things like databases, roles, tokens, and access lists.

Get started by creating a resources.tf file in your project directory. Set the content of that file to the following:

Save the file. As you can probably guess, we’re instructing Astra to create a database named hello_astra with a keyspace of helloastra (the value of the local.keyspace variable) on the Google Cloud Platform (gcp) in the us_west1 region.

What isn’t so easy to guess is that this creates a variable named astra_database.hello_astra_db in the Terraform process. We have provided the required fields to create the database, which creates additional information fields like .data_endpoint_url, the base URL for REST APIs, and the .grafana_url, which is the URL to view the Grafana health charts for the database.

Now run the command:

When the command finishes successfully, you can then execute the terraform apply helloastra command to see the database being created:

Now open up the Astra DB web console and you’ll see your database has been created:

Figure 1. Astra DB web console showing your new database.

Pretty cool, but minimally useful in practice. There’s little reason to use Terraform only to create databases with key spaces. However, the database is just the top-level “container” for most projects. Real-world projects also contain roles, each of which needs a security token. You can also script the IP safe-listing using Terraform, which is where Terraform starts to shine for Astra DB.

Define a role

An Astra DB role is simply another resource type. So open up your resources.tf file and append the following text:

You can see there is a lot of thought required for creating a role. A solid understanding of the policies and the resources is required. That’s too much information to cover in this article, but you can find much more on the main Astra DevOps page. And you can find more information if you visit the Manage Roles with DevOps API page.

Note: I commented that many of the policies for the role we’re creating weren’t needed. However, I left them in the file as a quick and easy reference if the role you define needs different policies. Comment and uncomment at your whim!

There are two main sections in the role, the resources and the policy arrays. They are closely related. The resources section is where you select the resources for which you want to set policies. So in our resources section:

You can see, we are telling Terraform we want to create a role with privileges that are specific to:

  • Our organization
  • Database we are creating
  • Keyspace in that database
  • Tables in that keyspace

If you look at the Manage Roles with DevOps API page and scroll down, you’ll see a table that maps policies to specific resource types. So policies only apply to specific resources, which is a mistake you can make. Suppose you add policies to access the tables but don’t include the last resource for all tables (:table:*). You can end up table policies with no resource to which they could attach.

Define a security token

Now that we have a role, we need to define a security token that users can use to authenticate the right to use that role (and access the database and its data). So, still editing the resources.tf file, append the following lines of code:

You can see there can be any number of roles in the roles array. As a result, you should think about tokens aggregating roles, not working with a single role (as we are doing in this simple example).

Define access lists

An access list defines the IP addresses that are allowed to connect to the database. If you don’t define an access list, then ALL IP addresses are allowed to connect, assuming they have the correct security token. If you know of specific IP addresses or classless inter-domain routing (CIDR) blocks that you want to allow to connect (still requiring the security token though), then you can define your rules using the template code below.

The addresses{} object can contain multiple request{} objects, so your IP safe-listing can get to be very fine-grained. The address{} within each request{} is formatted as a CIDR block.

Pro Tip (Security): The terraform.tfstate file, created by the terraform plan command, contains sensitive information and should never be stored in a public repository!

Providing interesting output

Our script generates a lot of information that we’ll want to use elsewhere, namely the Astra DB security token for accessing our database using our role. To have Terraform show us the values we are interested in, open up the main.tf file and append the following lines at the bottom (outside of the terraform{} ) declaration:

Watching it all work together

We’ve done a lot of editing. Now let’s run our project to see the fruits of our labor. Execute the commands:

Destroying what you have wrought

Terraform also lets you delete/destroy what you create. After successfully performing an apply action in Terraform, you can then execute the delete action and destroy everything created by the apply action.

Destroying everything you created is especially handy when you are first developing your scripts and learning Terraform. The command to destroy/delete your Astra database with all of its roles and security tokens takes the following form:

How do I upgrade my providers? I want the latest version!

The file .terraform.lock.hcl “locks” in the provider versions last used. If you want to update all of your providers to the current version, delete the .terraform.lock.hcl file and run the terraform init command again.

What the Astra DB provider will not do

The Astra provider is great at what it does: creating databases, roles, security tokens, and access lists. In its current form, that’s all it does. It does not create tables or populate data. You still need to do that using traditional methods.

Hopefully, though, the veil of mystery that surrounds Terraform, and the Astra provider more specifically, has now been removed for you. The Astra provider is under active development, so be sure to check for updates often! You can find the main Astra DB provider page in the Terraform Registry, which provides complete instructions to guide you through all of its capabilities.

If you want to go deeper or contribute to the open-source project, you can do that on the Astra Provider GitHub page. You can also join the DataStax Developer’s Discord channel to learn more there.

Follow the DataStax Tech Blog for more developer stories. Check out our YouTube channel for tutorials and here for DataStax Developers on Twitter for the latest news about our developer community.

Resources

  1. Github Code
  2. Manage roles with the DevOps API
  3. Terraform by HashiCorp
  4. DataStax Astra DB
  5. Register for an Astra DB account
  6. Join our Discord: DataStax Developers
  7. DataStax Community Platform
  8. DataStax Academy
  9. DataStax Certifications
  10. DataStax Workshops

--

--

--

We’re huge believers in modern, cloud native technologies like Kubernetes; we are making Cassandra ready for millions of developers through simple APIs; and we are committed to delivering the industry’s first and only open, multi-cloud serverless database: DataStax Astra DB.

Recommended from Medium

My hypermedia history

Offloading compute from my laptop to Cloud

Push Notification & Rich Notification with Firebase Cloud Messaging (FCM) Explained iOS — Swift 5

Framework Friday: ViewAnimator

Scratching my own itch: how I built a job board for myself

What’s the Hype With Log4j

an open lock and a bunch of keyboard keys thrown on table

Loading Scenes in Unity

How I Built My Daily Notes Page Template in Roam Research through 1 year of daily use and…

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
DataStax

DataStax

DataStax is the company behind the massively scalable, highly available, cloud-native NoSQL data platform built on Apache Cassandra®.

More from Medium

Ansible and Astra DB APIs — A Match Made in Heaven

Rollback faster without deploy access!

Multi-Cloud Monitoring at Simplilearn — Part II

How to Design and Provision a Production-Ready EKS Cluster