@@ -44,6 +44,10 @@ variable "config" {
4444 cpu_cores = number
4545 memory = number
4646 disk = number
47+
48+ prom2parquet_image = optional (string )
49+ s3_bucket = optional (string )
50+ s3_metrics_prefix = optional (string )
4751 }))
4852
4953 grafana = optional (object ({
@@ -68,6 +72,7 @@ variable "config" {
6872
6973locals {
7074 create_ec2_instance_connect_endpoint = coalesce (var. config . create_ec2_instance_connect_endpoint , true )
75+ prometheus_s3_export = try (var. config . prometheus . prom2parquet_image , null ) != null
7176}
7277
7378data "aws_region" "current" {}
@@ -134,22 +139,25 @@ module "db" {
134139
135140 public_ip = false
136141
137- ports = [
138- { port = local.db_primary_rpc_server_port, protocol = " udp" , internal = true },
139- { port = local.db_secondary_rpc_server_port, protocol = " udp" , internal = true },
140- { port = local.db_metrics_server_port, protocol = " tcp" , internal = true },
141- ]
142-
143- environment = {
144- PRIMARY_RPC_SERVER_PORT = tostring (local. db_primary_rpc_server_port )
145- SECONDARY_RPC_SERVER_PORT = tostring (local. db_secondary_rpc_server_port )
146- METRICS_SERVER_PORT = tostring (local. db_metrics_server_port )
147- ROCKSDB_DIR = " /data"
148- }
142+ containers = [{
143+ image = var.config.db.image
144+ ports = [
145+ { port = local.db_primary_rpc_server_port, protocol = " udp" , internal = true },
146+ { port = local.db_secondary_rpc_server_port, protocol = " udp" , internal = true },
147+ { port = local.db_metrics_server_port, protocol = " tcp" , internal = true },
148+ ]
149+
150+ environment = {
151+ PRIMARY_RPC_SERVER_PORT = tostring (local. db_primary_rpc_server_port )
152+ SECONDARY_RPC_SERVER_PORT = tostring (local. db_secondary_rpc_server_port )
153+ METRICS_SERVER_PORT = tostring (local. db_metrics_server_port )
154+ ROCKSDB_DIR = " /data"
155+ }
149156
150- secrets = {
151- SECRET_KEY = module.secret[" ed25519_secret_key" ]
152- }
157+ secrets = {
158+ SECRET_KEY = module.secret[" ed25519_secret_key" ]
159+ }
160+ }]
153161 })
154162}
155163
@@ -170,37 +178,41 @@ module "node" {
170178
171179 public_ip = true
172180
173- ports = [
174- { port = local.node_primary_rpc_server_port, protocol = " udp" , internal = false },
175- { port = local.node_secondary_rpc_server_port, protocol = " udp" , internal = false },
176- { port = local.node_metrics_server_port, protocol = " tcp" , internal = true },
177- ]
178-
179- environment = {
180- PRIMARY_RPC_SERVER_PORT = tostring (local. node_primary_rpc_server_port )
181- SECONDARY_RPC_SERVER_PORT = tostring (local. node_secondary_rpc_server_port )
182- METRICS_SERVER_PORT = tostring (local. node_metrics_server_port )
183- DATABASE_RPC_SERVER_ADDRESS = module.db.private_ip
184- DATABASE_PEER_ID = local.peer_id
185- DATABASE_PRIMARY_RPC_SERVER_PORT = tostring (local. db_primary_rpc_server_port )
186- DATABASE_SECONDARY_RPC_SERVER_PORT = tostring (local. db_secondary_rpc_server_port )
187- SMART_CONTRACT_ADDRESS = local.smart_contract_address
188- }
181+ containers = [{
182+ image = var.config.nodes[count.index].image
183+ ports = [
184+ { port = local.node_primary_rpc_server_port, protocol = " udp" , internal = false },
185+ { port = local.node_secondary_rpc_server_port, protocol = " udp" , internal = false },
186+ { port = local.node_metrics_server_port, protocol = " tcp" , internal = true },
187+ ]
188+
189+ environment = {
190+ PRIMARY_RPC_SERVER_PORT = tostring (local. node_primary_rpc_server_port )
191+ SECONDARY_RPC_SERVER_PORT = tostring (local. node_secondary_rpc_server_port )
192+ METRICS_SERVER_PORT = tostring (local. node_metrics_server_port )
193+ DATABASE_RPC_SERVER_ADDRESS = module.db.private_ip
194+ DATABASE_PEER_ID = local.peer_id
195+ DATABASE_PRIMARY_RPC_SERVER_PORT = tostring (local. db_primary_rpc_server_port )
196+ DATABASE_SECONDARY_RPC_SERVER_PORT = tostring (local. db_secondary_rpc_server_port )
197+ SMART_CONTRACT_ADDRESS = local.smart_contract_address
198+ }
189199
190- secrets = merge ({
191- SECRET_KEY = module.secret[" ed25519_secret_key" ]
192- SMART_CONTRACT_ENCRYPTION_KEY = module.secret[" smart_contract_encryption_key" ]
193- RPC_PROVIDER_URL = module.secret[" rpc_provider_url" ]
194- },
195- # configure pk only for the primary node
196- count. index != 0 ? {} : {
197- SMART_CONTRACT_SIGNER_PRIVATE_KEY = module.secret[" ecdsa_private_key" ]
198- })
200+ secrets = merge ({
201+ SECRET_KEY = module.secret[" ed25519_secret_key" ]
202+ SMART_CONTRACT_ENCRYPTION_KEY = module.secret[" smart_contract_encryption_key" ]
203+ RPC_PROVIDER_URL = module.secret[" rpc_provider_url" ]
204+ },
205+ # configure pk only for the primary node
206+ count. index != 0 ? {} : {
207+ SMART_CONTRACT_SIGNER_PRIVATE_KEY = module.secret[" ecdsa_private_key" ]
208+ })
209+ }]
199210 })
200211}
201212
202213locals {
203214 prometheus_port = 3000
215+ prom2parquet_port = 4000
204216 prometheus_domain_name = try (" prometheus.${ local . region_prefix } .${ var . config . route53_zone . name } " , null )
205217}
206218
@@ -219,6 +231,10 @@ module "prometheus_config" {
219231 targets = [" ${ module . node [0 ]. private_ip } :${ local . node_metrics_server_port } " ]
220232 }]
221233 }]
234+ remote_write = local.prometheus_s3_export ? [{
235+ url = " http://localhost:${ local . prom2parquet_port } /receive"
236+ remote_timeout = " 30s"
237+ }] : []
222238 })
223239}
224240
@@ -250,27 +266,56 @@ module "prometheus" {
250266
251267 public_ip = false
252268
253- ports = [
254- { port = local.prometheus_port, protocol = " tcp" , internal = true },
255- ]
256-
257- environment = {}
258- secrets = {
259- CONFIG = module.prometheus_config[0 ]
260- WEB_CONFIG = module.prometheus_web_config[0 ]
261- }
262-
263- entry_point = [" /bin/sh" , " -c" ]
264- command = [<<- CMD
265- printenv CONFIG > /tmp/prometheus.yml && \
266- printenv WEB_CONFIG > /tmp/web.yml && \
267- exec /bin/prometheus \
268- --config.file=/tmp/prometheus.yml \
269- --web.config.file=/tmp/web.yml \
270- --web.listen-address=:${ local . prometheus_port } \
271- --storage.tsdb.path=/data
272- CMD
273- ]
269+ containers = concat (
270+ [{
271+ name = " prometheus"
272+ image = var.config.prometheus.image
273+ ports = [
274+ { port = local.prometheus_port, protocol = " tcp" , internal = true },
275+ ]
276+
277+ environment = {}
278+ secrets = {
279+ CONFIG = module.prometheus_config[0 ]
280+ WEB_CONFIG = module.prometheus_web_config[0 ]
281+ }
282+
283+ entry_point = [" /bin/sh" , " -c" ]
284+ command = [<<- CMD
285+ printenv CONFIG > /tmp/prometheus.yml && \
286+ printenv WEB_CONFIG > /tmp/web.yml && \
287+ exec /bin/prometheus \
288+ --config.file=/tmp/prometheus.yml \
289+ --web.config.file=/tmp/web.yml \
290+ --web.listen-address=:${ local . prometheus_port } \
291+ --storage.tsdb.path=/data
292+ CMD
293+ ]
294+ }],
295+ local. prometheus_s3_export ? [{
296+ name = " prom2parquet"
297+ image = var.config.prometheus.prom2parquet_image
298+ essential = false
299+ ports = [
300+ { port = local.prom2parquet_port, protocol = " tcp" , internal = true },
301+ ]
302+
303+ environment = {
304+ AWS_REGION = local.region
305+ }
306+ secrets = {}
307+
308+ entry_point = [" /prom2parquet" ]
309+ command = [
310+ " --backend" , " s3" ,
311+ " --backend-root" , " ${ var . config . prometheus . s3_bucket } " ,
312+ " --prefix" , " ${ var . config . prometheus . s3_metrics_prefix } /${ local . region } " ,
313+ " --server-port" , tostring (local. prom2parquet_port ),
314+ ]
315+ }] : []
316+ )
317+
318+ s3_buckets = var.config.prometheus.s3_bucket == null ? [] : [var.config.prometheus.s3_bucket]
274319 })
275320}
276321
@@ -318,27 +363,30 @@ module "grafana" {
318363
319364 public_ip = false
320365
321- ports = [
322- { port = local.grafana_port, protocol = " tcp" , internal = true },
323- ]
366+ containers = [{
367+ image = var.config.grafana.image
368+ ports = [
369+ { port = local.grafana_port, protocol = " tcp" , internal = true },
370+ ]
324371
325- environment = {
326- GF_SERVER_HTTP_PORT = tostring (local. grafana_port )
327- GF_PATHS_DATA = " /data"
328- GF_SECURITY_ADMIN_USER = " admin"
329- }
372+ environment = {
373+ GF_SERVER_HTTP_PORT = tostring (local. grafana_port )
374+ GF_PATHS_DATA = " /data"
375+ GF_SECURITY_ADMIN_USER = " admin"
376+ }
330377
331- secrets = {
332- GF_SECURITY_ADMIN_PASSWORD = module.secret[" grafana_admin_password" ]
333- PROMETHEUS_DATASOURCE_CONFIG = module.grafana_prometheus_datasource_config[0 ]
334- }
378+ secrets = {
379+ GF_SECURITY_ADMIN_PASSWORD = module.secret[" grafana_admin_password" ]
380+ PROMETHEUS_DATASOURCE_CONFIG = module.grafana_prometheus_datasource_config[0 ]
381+ }
335382
336- entry_point = [" /bin/sh" , " -c" ]
337- command = [<<- CMD
338- printenv PROMETHEUS_DATASOURCE_CONFIG > /etc/grafana/provisioning/datasources/prometheus.yaml && \
339- exec /run.sh
340- CMD
341- ]
383+ entry_point = [" /bin/sh" , " -c" ]
384+ command = [<<- CMD
385+ printenv PROMETHEUS_DATASOURCE_CONFIG > /etc/grafana/provisioning/datasources/prometheus.yaml && \
386+ exec /run.sh
387+ CMD
388+ ]
389+ }]
342390 })
343391}
344392
0 commit comments