Skip to content

Commit 7a67c80

Browse files
authored
scripts: rolling-update SQS adapter passthrough (#741)
## Summary Teach `scripts/rolling-update.sh` and the env example about the SQS-compatible adapter, mirroring how S3 is wired. Why this matters: admin `/admin/api/v1/sqs/*` endpoints are gated on `r.sqsServer != nil` in `main.go`, and `r.sqsServer` is constructed only when `--sqsAddress` is non-empty. The previous rolling-update script had no path to forward `--sqsAddress` (or any other SQS knob), so even on builds that include the SQS admin handler the endpoints 404'd at runtime. This patch threads the new env vars all the way to the container's command line so `ENABLE_SQS=true` is sufficient to light up both the public SigV4 endpoint and the admin endpoints. ## Changes - `scripts/rolling-update.sh` - New defaults: `ENABLE_SQS=false`, `SQS_PORT=9324`, `SQS_REGION=us-east-1`, `SQS_CREDENTIALS_FILE=` (empty → open endpoint), `SQS_FIFO_PARTITION_MAP=` (empty → bypass capability gate's coverage check), `RAFT_TO_SQS_MAP=` (auto-derived). - `derive_raft_to_sqs_map()` mirrors `derive_raft_to_s3_map()` and is invoked when `ENABLE_SQS=true && RAFT_TO_SQS_MAP=""`. - SSH `bash -s` passthrough block carries the new vars. - `run_container` builds `sqs_creds_volume` (bind-mount the cred file ro at the same host path) and `sqs_flags` (`--sqsAddress`, `--sqsRegion`, `--raftSqsMap`, optional `--sqsCredentialsFile`, optional `--sqsFifoPartitionMap`); both arrays splice into the existing `docker run` line next to the S3 ones. - `_Q` shell-quoting added for the new path-like vars (`SQS_CREDENTIALS_FILE_Q`, `SQS_FIFO_PARTITION_MAP_Q`, `RAFT_TO_SQS_MAP_Q`). - Usage docs updated to describe the new variables and the admin-endpoint gate. - `scripts/rolling-update.env.example` - Adds the new variables under the existing S3 block, with comments explaining the open-endpoint default and the partition-map opt-in. ## Backward compatibility `ENABLE_SQS` defaults to `false`. Existing deploy.env files that carry no SQS knobs produce a `docker run` byte-identical to the prior behaviour: empty `sqs_creds_volume`, empty `sqs_flags`, no `--sqsAddress`, no `--raftSqsMap`. No existing rollout changes shape. ## Self-review (5 lenses, abbreviated) 1. **Data loss** — N/A; deploy script only. 2. **Concurrency** — N/A. 3. **Performance** — N/A. 4. **Data consistency** — N/A. 5. **Test coverage** — `bash -n scripts/rolling-update.sh` returns 0. The script doesn't have a Go test surface; structural mirroring of the S3 path is the regression baseline. ## Test plan - [x] `bash -n scripts/rolling-update.sh` - [ ] Live rollout against the operator's cluster with `ENABLE_SQS=true` set in `deploy.env`, then `curl -b cookie.jar https://elastickv.bootjp.dev/admin/api/v1/sqs/queues` should return `200`. Operator-driven; out of scope for the merge gate. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Optional SQS-compatible adapter integration with configurable region, port, and credential settings. * Environment configuration extended to support SQS endpoint mapping and FIFO partition setup. * Deployment automation enhanced to derive and inject SQS endpoint mappings and propagate SQS settings during rolling updates when enabled. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
2 parents 81b0202 + 85480bf commit 7a67c80

2 files changed

Lines changed: 180 additions & 3 deletions

File tree

scripts/rolling-update.env.example

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,21 @@ S3_PATH_STYLE_ONLY="true"
3232
# The file is bind-mounted read-only into the container.
3333
# S3_CREDENTIALS_FILE="/etc/elastickv/s3-credentials.json"
3434

35+
# SQS-compatible adapter (opt-in). Required to mount the admin
36+
# /admin/api/v1/sqs/* endpoints — those handlers are gated on a
37+
# non-nil sqsServer, which the binary only constructs when
38+
# --sqsAddress is non-empty.
39+
ENABLE_SQS="false"
40+
SQS_PORT="9324"
41+
SQS_REGION="us-east-1"
42+
# Optional: open endpoint when SQS_CREDENTIALS_FILE is empty.
43+
# Same JSON shape as S3_CREDENTIALS_FILE.
44+
# SQS_CREDENTIALS_FILE="/etc/elastickv/sqs-credentials.json"
45+
# Optional: HT-FIFO partition routing map. Empty disables coverage check.
46+
# SQS_FIFO_PARTITION_MAP="orders.fifo:4=1,1,2,2"
47+
# Optional: override if SQS routing addresses differ from raft hosts.
48+
# RAFT_TO_SQS_MAP="raft-1.internal.example:50051=sqs-1.internal.example:9324,..."
49+
3550
# Optional: override if Redis routing addresses differ from the advertised raft hosts.
3651
# RAFT_TO_REDIS_MAP="raft-1.internal.example:50051=redis-1.internal.example:6379,raft-2.internal.example:50051=redis-2.internal.example:6379,raft-3.internal.example:50051=redis-3.internal.example:6379"
3752

scripts/rolling-update.sh

Lines changed: 165 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,31 @@ Optional environment:
4444
exist and be readable on every remote node; it will be bind-mounted into
4545
the container at the same path.
4646
S3_PATH_STYLE_ONLY
47+
48+
SQS adapter (opt-in; ENABLE_SQS=true turns the listener on)
49+
ENABLE_SQS
50+
Master switch (default false). When true, the script forwards
51+
--sqsAddress, --sqsRegion, and --raftSqsMap (plus optional
52+
--sqsCredentialsFile / --sqsFifoPartitionMap) to docker run.
53+
Required for the admin /admin/api/v1/sqs/* endpoints to mount —
54+
main.go gates registration on r.sqsServer != nil, which only
55+
happens when --sqsAddress is non-empty.
56+
SQS_PORT
57+
SQS HTTP listener port on each node (default 9324, the conventional
58+
SQS-compatible-server port). Mirrors S3_PORT.
59+
SQS_REGION
60+
SigV4 region the adapter signs against (default us-east-1).
61+
SQS_CREDENTIALS_FILE
62+
Optional path to a JSON credentials file on each target host
63+
(same shape as S3_CREDENTIALS_FILE). Empty value runs the adapter
64+
as an open endpoint — clients may sign with any credentials.
65+
RAFT_TO_SQS_MAP
66+
Optional override; auto-derived from NODES + RAFT_PORT + SQS_PORT
67+
when ENABLE_SQS=true and the variable is empty.
68+
SQS_FIFO_PARTITION_MAP
69+
Optional HT-FIFO partition routing map (queue.fifo:N=group_0,...).
70+
Empty value disables the capability gate's coverage check;
71+
partitioned queues route to the default Raft group.
4772
HEALTH_TIMEOUT_SECONDS
4873
LEADERSHIP_TRANSFER_TIMEOUT_SECONDS
4974
LEADER_DISCOVERY_TIMEOUT_SECONDS
@@ -117,6 +142,8 @@ Notes:
117142
RAFT_PORT, and REDIS_PORT.
118143
- If RAFT_TO_S3_MAP is unset, it is derived automatically from NODES,
119144
RAFT_PORT, and S3_PORT.
145+
- If RAFT_TO_SQS_MAP is unset and ENABLE_SQS=true, it is derived
146+
automatically from NODES, RAFT_PORT, and SQS_PORT.
120147
- If RAFTADMIN_BIN is set, it must already be executable on the local control host.
121148
EOF
122149
}
@@ -149,6 +176,21 @@ ENABLE_S3="${ENABLE_S3:-true}"
149176
S3_REGION="${S3_REGION:-us-east-1}"
150177
S3_CREDENTIALS_FILE="${S3_CREDENTIALS_FILE:-}"
151178
S3_PATH_STYLE_ONLY="${S3_PATH_STYLE_ONLY:-true}"
179+
# SQS adapter knobs (mirror the S3 shape). ENABLE_SQS is the master
180+
# switch; when false, no SQS-related flags are passed to the
181+
# container and admin SQS endpoints stay 404 because sqsServer is
182+
# nil. Set ENABLE_SQS=true and the script forwards
183+
# --sqsAddress / --sqsRegion / --raftSqsMap (and optionally
184+
# --sqsCredentialsFile and --sqsFifoPartitionMap) to docker run.
185+
ENABLE_SQS="${ENABLE_SQS:-false}"
186+
SQS_PORT="${SQS_PORT:-9324}"
187+
SQS_REGION="${SQS_REGION:-us-east-1}"
188+
SQS_CREDENTIALS_FILE="${SQS_CREDENTIALS_FILE:-}"
189+
# HT-FIFO partition routing map. Empty means "single-shard / no
190+
# partitioned-FIFO routing"; the capability gate's coverage check
191+
# is bypassed (resolver==nil) and partitioned queues land on the
192+
# default group. Format documented at main.go::buildSQSFifoPartitionMap.
193+
SQS_FIFO_PARTITION_MAP="${SQS_FIFO_PARTITION_MAP:-}"
152194
HEALTH_TIMEOUT_SECONDS="${HEALTH_TIMEOUT_SECONDS:-60}"
153195
LEADERSHIP_TRANSFER_TIMEOUT_SECONDS="${LEADERSHIP_TRANSFER_TIMEOUT_SECONDS:-30}"
154196
LEADER_DISCOVERY_TIMEOUT_SECONDS="${LEADER_DISCOVERY_TIMEOUT_SECONDS:-30}"
@@ -163,6 +205,7 @@ SSH_TARGETS="${SSH_TARGETS:-}"
163205
ROLLING_ORDER="${ROLLING_ORDER:-}"
164206
RAFT_TO_REDIS_MAP="${RAFT_TO_REDIS_MAP:-}"
165207
RAFT_TO_S3_MAP="${RAFT_TO_S3_MAP:-}"
208+
RAFT_TO_SQS_MAP="${RAFT_TO_SQS_MAP:-}"
166209

167210
# Admin dashboard knobs. ADMIN_ENABLED is the master switch; the
168211
# remaining variables only take effect when ADMIN_ENABLED=true.
@@ -194,7 +237,7 @@ KEYVIZ_FANOUT_NODES="${KEYVIZ_FANOUT_NODES:-}"
194237
# who typed "True", "1", or a stray quote sees a script-level error
195238
# pointing at the variable name instead of an inscrutable failure
196239
# inside the SSH heredoc.
197-
for _bool_var in ADMIN_ENABLED ADMIN_ALLOW_PLAINTEXT_NON_LOOPBACK ADMIN_ALLOW_INSECURE_DEV_COOKIE KEYVIZ_ENABLED; do
240+
for _bool_var in ADMIN_ENABLED ADMIN_ALLOW_PLAINTEXT_NON_LOOPBACK ADMIN_ALLOW_INSECURE_DEV_COOKIE KEYVIZ_ENABLED ENABLE_S3 ENABLE_SQS; do
198241
case "${!_bool_var}" in
199242
true|false) ;;
200243
*)
@@ -389,6 +432,20 @@ derive_raft_to_s3_map() {
389432
)
390433
}
391434

435+
derive_raft_to_sqs_map() {
436+
local parts=()
437+
local i
438+
439+
for i in "${!NODE_IDS[@]}"; do
440+
parts+=("${NODE_HOSTS[$i]}:${RAFT_PORT}=${NODE_HOSTS[$i]}:${SQS_PORT}")
441+
done
442+
443+
(
444+
IFS=,
445+
printf '%s\n' "${parts[*]}"
446+
)
447+
}
448+
392449
ensure_local_raftadmin() {
393450
if [[ -n "$RAFTADMIN_LOCAL_BIN" ]]; then
394451
if [[ ! -x "$RAFTADMIN_LOCAL_BIN" ]]; then
@@ -510,6 +567,11 @@ update_one_node() {
510567
S3_REGION="$S3_REGION" \
511568
S3_CREDENTIALS_FILE="$S3_CREDENTIALS_FILE_Q" \
512569
S3_PATH_STYLE_ONLY="$S3_PATH_STYLE_ONLY" \
570+
ENABLE_SQS="$ENABLE_SQS" \
571+
SQS_PORT="$SQS_PORT_Q" \
572+
SQS_REGION="$SQS_REGION_Q" \
573+
SQS_CREDENTIALS_FILE="$SQS_CREDENTIALS_FILE_Q" \
574+
SQS_FIFO_PARTITION_MAP="$SQS_FIFO_PARTITION_MAP_Q" \
513575
HEALTH_TIMEOUT_SECONDS="$HEALTH_TIMEOUT_SECONDS" \
514576
LEADERSHIP_TRANSFER_TIMEOUT_SECONDS="$LEADERSHIP_TRANSFER_TIMEOUT_SECONDS" \
515577
LEADER_DISCOVERY_TIMEOUT_SECONDS="$LEADER_DISCOVERY_TIMEOUT_SECONDS" \
@@ -521,6 +583,7 @@ update_one_node() {
521583
ALL_NODE_HOSTS_CSV="$all_node_hosts_csv" \
522584
RAFT_TO_REDIS_MAP="$RAFT_TO_REDIS_MAP_Q" \
523585
RAFT_TO_S3_MAP="$RAFT_TO_S3_MAP_Q" \
586+
RAFT_TO_SQS_MAP="$RAFT_TO_SQS_MAP_Q" \
524587
EXTRA_ENV="$EXTRA_ENV_Q" \
525588
CONTAINER_MEMORY_LIMIT="$CONTAINER_MEMORY_LIMIT_Q" \
526589
ADMIN_ENABLED="$ADMIN_ENABLED" \
@@ -781,6 +844,33 @@ run_container() {
781844
)
782845
fi
783846
847+
# SQS adapter wiring mirrors S3: optional credentials file gets
848+
# bind-mounted ro at the same host path; the rest of the SQS knobs
849+
# are passed verbatim. ENABLE_SQS=false leaves all arrays empty so
850+
# the docker run is byte-identical to a non-SQS deploy.
851+
local sqs_creds_volume=()
852+
local sqs_creds_flag=()
853+
local sqs_flags=()
854+
if [[ "${ENABLE_SQS}" == "true" && -n "${SQS_CREDENTIALS_FILE:-}" ]]; then
855+
if [[ ! -f "$SQS_CREDENTIALS_FILE" || ! -r "$SQS_CREDENTIALS_FILE" ]]; then
856+
echo "SQS_CREDENTIALS_FILE is set to '$SQS_CREDENTIALS_FILE' but the file is missing or not readable; aborting docker run" >&2
857+
exit 1
858+
fi
859+
sqs_creds_volume=(-v "${SQS_CREDENTIALS_FILE}:${SQS_CREDENTIALS_FILE}:ro")
860+
sqs_creds_flag=(--sqsCredentialsFile "$SQS_CREDENTIALS_FILE")
861+
fi
862+
if [[ "${ENABLE_SQS}" == "true" ]]; then
863+
sqs_flags=(
864+
--sqsAddress "${NODE_HOST}:${SQS_PORT}"
865+
--sqsRegion "$SQS_REGION"
866+
--raftSqsMap "$RAFT_TO_SQS_MAP"
867+
"${sqs_creds_flag[@]}"
868+
)
869+
if [[ -n "${SQS_FIFO_PARTITION_MAP:-}" ]]; then
870+
sqs_flags+=(--sqsFifoPartitionMap "$SQS_FIFO_PARTITION_MAP")
871+
fi
872+
fi
873+
784874
# Pass through additional container environment variables from EXTRA_ENV.
785875
# Accepts a whitespace-separated list of KEY=VALUE pairs, e.g.:
786876
# EXTRA_ENV="ELASTICKV_RAFT_DISPATCHER_LANES=1 ELASTICKV_PEBBLE_CACHE_MB=512"
@@ -842,13 +932,25 @@ run_container() {
842932
local keyviz_flags=()
843933
build_keyviz_flags keyviz_flags
844934
935+
# config-fingerprint label drives the skip check on the next deploy
936+
# (see DEPLOY_CONFIG_FP_LABEL block above). Empty value here means
937+
# the deploy script was run on an old layout that didn't compute one
938+
# — the next pass will recompute and inject one regardless, so the
939+
# missing label only "costs" one extra recreate during the upgrade.
940+
local config_fp_label_flags=()
941+
if [[ -n "${DEPLOY_CONFIG_FP:-}" && -n "${DEPLOY_CONFIG_FP_LABEL:-}" ]]; then
942+
config_fp_label_flags=(--label "${DEPLOY_CONFIG_FP_LABEL}=${DEPLOY_CONFIG_FP}")
943+
fi
944+
845945
docker run -d \
846946
--name "$CONTAINER_NAME" \
847947
--restart unless-stopped \
848948
--network host \
849949
"${memory_flags[@]}" \
950+
"${config_fp_label_flags[@]}" \
850951
-v "$DATA_DIR:$DATA_DIR" \
851952
"${s3_creds_volume[@]}" \
953+
"${sqs_creds_volume[@]}" \
852954
"${admin_volumes[@]}" \
853955
"${extra_env_flags[@]}" \
854956
"$IMAGE" "$SERVER_ENTRYPOINT" \
@@ -860,6 +962,7 @@ run_container() {
860962
--raftDataDir "$DATA_DIR" \
861963
--raftRedisMap "$RAFT_TO_REDIS_MAP" \
862964
"${s3_flags[@]}" \
965+
"${sqs_flags[@]}" \
863966
"${admin_flags[@]}" \
864967
"${keyviz_flags[@]}" >/dev/null
865968
}
@@ -1059,13 +1162,56 @@ new_image_id="$(docker image inspect "$IMAGE" --format "{{.Id}}")"
10591162
running_image_id="$(docker inspect --format "{{.Image}}" "$CONTAINER_NAME" 2>/dev/null || true)"
10601163
running_status="$(docker inspect --format "{{.State.Status}}" "$CONTAINER_NAME" 2>/dev/null || echo missing)"
10611164
1062-
if [[ "$new_image_id" == "$running_image_id" && "$running_status" == "running" ]]; then
1165+
# Config fingerprint: hash every variable that influences either the
1166+
# docker run argv or the in-container elastickv flags. Pair it with a
1167+
# matching --label on docker run; on the next deploy compare the label
1168+
# against a freshly recomputed hash and recreate when they differ.
1169+
# Without this, deploy.env changes that flip flags (e.g. ENABLE_SQS,
1170+
# ADMIN_*, EXTRA_ENV) without bumping the image hash were silently
1171+
# skipped because the previous skip check only looked at image+status.
1172+
#
1173+
# NUL separator + sha256sum keeps the hash injective (no value can
1174+
# spoof the boundary). All inputs are always-present env vars so an
1175+
# unset deploy knob hashes as the empty string consistently.
1176+
config_fp() {
1177+
printf '%s\0' \
1178+
"$IMAGE" \
1179+
"$SERVER_ENTRYPOINT" \
1180+
"$DATA_DIR" \
1181+
"$NODE_HOST" "$NODE_ID" \
1182+
"$RAFT_ENGINE" \
1183+
"$RAFT_PORT" "$REDIS_PORT" "$DYNAMO_PORT" \
1184+
"$RAFT_TO_REDIS_MAP" \
1185+
"$ENABLE_S3" "$S3_PORT" "$S3_REGION" "$S3_PATH_STYLE_ONLY" \
1186+
"$S3_CREDENTIALS_FILE" "$RAFT_TO_S3_MAP" \
1187+
"$ENABLE_SQS" "$SQS_PORT" "$SQS_REGION" \
1188+
"$SQS_CREDENTIALS_FILE" "$RAFT_TO_SQS_MAP" "$SQS_FIFO_PARTITION_MAP" \
1189+
"$EXTRA_ENV" "$CONTAINER_MEMORY_LIMIT" \
1190+
"$ADMIN_ENABLED" "$ADMIN_ADDRESS" \
1191+
"$ADMIN_FULL_ACCESS_KEYS" "$ADMIN_READ_ONLY_ACCESS_KEYS" \
1192+
"$ADMIN_SESSION_SIGNING_KEY_FILE" "$ADMIN_SESSION_SIGNING_KEY_PREVIOUS_FILE" \
1193+
"$ADMIN_TLS_CERT_FILE" "$ADMIN_TLS_KEY_FILE" \
1194+
"$ADMIN_ALLOW_PLAINTEXT_NON_LOOPBACK" "$ADMIN_ALLOW_INSECURE_DEV_COOKIE" \
1195+
"$KEYVIZ_ENABLED" "$KEYVIZ_FANOUT_NODES" \
1196+
| sha256sum | cut -d' ' -f1
1197+
}
1198+
DEPLOY_CONFIG_FP_LABEL="elastickv.deploy.config-fp"
1199+
new_config_fp="$(config_fp)"
1200+
running_config_fp="$(docker inspect --format "{{ index .Config.Labels \"${DEPLOY_CONFIG_FP_LABEL}\" }}" "$CONTAINER_NAME" 2>/dev/null || true)"
1201+
export DEPLOY_CONFIG_FP="$new_config_fp"
1202+
export DEPLOY_CONFIG_FP_LABEL
1203+
1204+
if [[ "$new_image_id" == "$running_image_id" && "$running_status" == "running" \
1205+
&& "$new_config_fp" == "$running_config_fp" ]]; then
10631206
if grpc_healthy; then
1064-
echo "image unchanged and gRPC healthy; skip"
1207+
echo "image and config unchanged and gRPC healthy; skip"
10651208
exit 0
10661209
fi
10671210
echo "container is running but gRPC is not reachable; recreating"
10681211
fi
1212+
if [[ -n "$running_config_fp" && "$new_config_fp" != "$running_config_fp" ]]; then
1213+
echo "deploy config fingerprint changed (was=${running_config_fp:0:12}, now=${new_config_fp:0:12}); recreating"
1214+
fi
10691215
10701216
require_passwordless_sudo
10711217
sudo -n mkdir -p "$DATA_DIR"
@@ -1115,6 +1261,10 @@ if [[ "${ENABLE_S3}" == "true" && -z "$RAFT_TO_S3_MAP" ]]; then
11151261
RAFT_TO_S3_MAP="$(derive_raft_to_s3_map)"
11161262
fi
11171263

1264+
if [[ "${ENABLE_SQS}" == "true" && -z "$RAFT_TO_SQS_MAP" ]]; then
1265+
RAFT_TO_SQS_MAP="$(derive_raft_to_sqs_map)"
1266+
fi
1267+
11181268
ensure_local_raftadmin
11191269
ensure_remote_raftadmin_binaries
11201270

@@ -1216,13 +1366,25 @@ EXTRA_ENV_NORMALISED="$(merge_extra_env "$EXTRA_ENV_DEFAULT_NORMALISED" "$EXTRA_
12161366
EXTRA_ENV_Q="$(printf '%q' "$EXTRA_ENV_NORMALISED")"
12171367
CONTAINER_MEMORY_LIMIT_Q="$(printf '%q' "${CONTAINER_MEMORY_LIMIT:-}")"
12181368
S3_CREDENTIALS_FILE_Q="$(printf '%q' "${S3_CREDENTIALS_FILE:-}")"
1369+
SQS_CREDENTIALS_FILE_Q="$(printf '%q' "${SQS_CREDENTIALS_FILE:-}")"
1370+
SQS_FIFO_PARTITION_MAP_Q="$(printf '%q' "${SQS_FIFO_PARTITION_MAP:-}")"
1371+
# Scalar SQS knobs are not bool-validated (port can be any uint16,
1372+
# region can be any AWS-style region string), so they go through
1373+
# printf '%q' before crossing the SSH boundary. ENABLE_SQS itself
1374+
# is bool-validated at the top of the script, so it stays unquoted
1375+
# alongside ADMIN_ENABLED / KEYVIZ_ENABLED for readability — same
1376+
# rule the validation comment documents. Closes Gemini security-
1377+
# high finding on PR #741.
1378+
SQS_PORT_Q="$(printf '%q' "$SQS_PORT")"
1379+
SQS_REGION_Q="$(printf '%q' "$SQS_REGION")"
12191380
IMAGE_Q="$(printf '%q' "$IMAGE")"
12201381
DATA_DIR_Q="$(printf '%q' "$DATA_DIR")"
12211382
SERVER_ENTRYPOINT_Q="$(printf '%q' "$SERVER_ENTRYPOINT")"
12221383
RAFTADMIN_REMOTE_BIN_Q="$(printf '%q' "$RAFTADMIN_REMOTE_BIN")"
12231384
CONTAINER_NAME_Q="$(printf '%q' "$CONTAINER_NAME")"
12241385
RAFT_TO_REDIS_MAP_Q="$(printf '%q' "$RAFT_TO_REDIS_MAP")"
12251386
RAFT_TO_S3_MAP_Q="$(printf '%q' "$RAFT_TO_S3_MAP")"
1387+
RAFT_TO_SQS_MAP_Q="$(printf '%q' "$RAFT_TO_SQS_MAP")"
12261388

12271389
# ADMIN_* values may contain commas (allow-lists), spaces (paths with
12281390
# spaces, though discouraged), or other shell metacharacters. The

0 commit comments

Comments
 (0)