3.5 KiB
Configuration Management
In many cases managing the configuration in your application code is the best model, many teams though wish to pre-create Streams and Consumers.
We support a number of tools to assist with this:
nats
CLI with configuration files- Terraform
- GitHub Actions
- Kubernetes JetStream Controller
nats Admin CLI
The nats
CLI can be used to manage Streams and Consumers easily using it's --config
flag, for example:
Add a new Stream
This creates a new Stream based on orders.json
. The orders.json
file can be extracted from an existing stream using nats stream info ORDERS -j | jq .config
$ nats str add ORDERS --config orders.json
Edit an existing Stream
This edits an existing stream ensuring it complies with the configuration in orders.json
$ nats str edit ORDERS --config orders.json
Add a New Consumer
This creates a new Consumer based on orders_new.json
. The orders_new.json
file can be extracted from an existing stream using nats con info ORDERS NEW -j | jq .config
$ nats con add ORDERS NEW --config orders_new.json
Terraform
Terraform is a Cloud configuration tool from Hashicorp found at terraform.io, we maintain a Provider for Terraform called terraform-provider-jetstream that can maintain JetStream using Terraform.
Setup
Our provider is not hosted by Hashicorp so installation is a bit more complex than typical. Browse to the Release Page and download the release for your platform and extract it into your Terraform plugins directory.
$ unzip -l terraform-provider-jetstream_0.0.2_darwin_amd64.zip
Archive: terraform-provider-jetstream_0.0.2_darwin_amd64.zip
Length Date Time Name
--------- ---------- ----- ----
11357 03-09-2020 10:48 LICENSE
1830 03-09-2020 12:53 README.md
24574336 03-09-2020 12:54 terraform-provider-jetstream_v0.0.2
Place the terraform-provider-jetstream_v0.0.2
file in ~/.terraform.d/plugins/terraform-provider-jetstream_v0.0.2
In your project you can configure the Provider like this:
provider "jetstream" {
servers = "connect.ngs.global"
credentials = "ngs_jetstream_admin.creds"
}
And start using it, here's an example that create the ORDERS
example. Review the Project README for full details.
resource "jetstream_stream" "ORDERS" {
name = "ORDERS"
subjects = ["ORDERS.*"]
storage = "file"
max_age = 60 * 60 * 24 * 365
}
resource "jetstream_consumer" "ORDERS_NEW" {
stream_id = jetstream_stream.ORDERS.id
durable_name = "NEW"
deliver_all = true
filter_subject = "ORDERS.received"
sample_freq = 100
}
resource "jetstream_consumer" "ORDERS_DISPATCH" {
stream_id = jetstream_stream.ORDERS.id
durable_name = "DISPATCH"
deliver_all = true
filter_subject = "ORDERS.processed"
sample_freq = 100
}
resource "jetstream_consumer" "ORDERS_MONITOR" {
stream_id = jetstream_stream.ORDERS.id
durable_name = "MONITOR"
deliver_last = true
ack_policy = "none"
delivery_subject = "monitor.ORDERS"
}
output "ORDERS_SUBJECTS" {
value = jetstream_stream.ORDERS.subjects
}