Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions scripts/event-driven-architectures/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Scripts for testing event-driven architecture (SNS+SQS)

## Purpose
- Generating and publishing messages to a specified SNS topic, see `publish_messages.sh`.
- Consuming messages that a subscribing SQS queue receives from an SNS topic, see `process_messages.sh`.

## How to use
Within the `./scripts/event-driven-architectures` directory, define an `.env` file with the required environment variables. You can find out what variables are required by looking at the `check_env_variables` function calls within the scripts. For example, `check_env_variables "SNS_TOPIC" "TOTAL_NUMBER_OF_MESSAGES"` would require an `.env` file with the following (dummy values):

```
SNS_TOPIC="<sns-topic-arn>"
TOTAL_NUMBER_OF_MESSAGES="<number-of-messages-to-publish>"
```

Login to AWS with:

```
aws sso login
```

Export the AWS profile of the account you want to run this script in (currently only `platform-sandbox` is supported):

```
export AWS_PROFILE=platform-sandbox
```

Run the selected script from within the `./scripts/event-driven-architectures` directory, e.g `publish_messages.sh`

```
bash publish_messages.sh
```

## Notes
Remember to delete messages from the SQS queue once finished. This can be done with `process_messages.sh`.
55 changes: 55 additions & 0 deletions scripts/event-driven-architectures/process_messages.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#!/usr/bin/env bash
export AWS_PAGER=""

if [[ ! -f .env ]]; then
echo ".env file not found, exiting script"
exit 1
fi

source .env

source utils/check_aws_profile.sh
check_aws_profile || exit 1

source utils/check_env_variables.sh
check_env_variables "SQS_QUEUE" || exit 1

consume_message() {
local sqs_queue=$1

aws sqs receive-message \
--queue-url "$sqs_queue" \
--max-number-of-messages 1
}

delete_message () {
local sqs_queue=$1
local receipt_handle=$2
aws sqs delete-message --queue-url "$sqs_queue" --receipt-handle "$receipt_handle"
}

while true; do
echo "Consuming message"
response=$(consume_message "$SQS_QUEUE")
if [[ -z "$response" ]]; then
echo "No message received; polling again"
sleep 1
continue
fi

receipt_handle=$(
jq -r '.Messages[0].ReceiptHandle' <<< "$response"
)

message=$(
jq -r '
.Messages[0].Body as $body
| try ($body | fromjson) catch $body
' <<< "$response"
)

echo "Processing message: $message"

echo "Deleting message with receipt handle: $receipt_handle"
delete_message "$SQS_QUEUE" "$receipt_handle"
done
32 changes: 32 additions & 0 deletions scripts/event-driven-architectures/publish_messages.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#!/usr/bin/env bash
export AWS_PAGER=""

if [[ ! -f .env ]]; then
echo ".env file not found, exiting script"
exit 1
fi

source .env

source utils/check_aws_profile.sh
check_aws_profile || exit 1

source utils/check_env_variables.sh
check_env_variables "SNS_TOPIC" "TOTAL_NUMBER_OF_MESSAGES" || exit 1

mapfile -t messages < <(
for ((i=1; i<=TOTAL_NUMBER_OF_MESSAGES; i++)); do
echo "Message number: $i"
done
)

publish_message () {
local sns_topic=$1
local message=$2
aws sns publish --topic-arn "$sns_topic" --message "$message"
}

echo "Publishing messages"
for message in "${messages[@]}"; do
publish_message "$SNS_TOPIC" "$message"
done
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/usr/bin/env bash

# TODO: update to handle multiple profiles
check_aws_profile () {
if [[ "$AWS_PROFILE" != "platform-sandbox" ]]; then
echo "The currently selected AWS_PROFILE ('$AWS_PROFILE') is not permitted; set AWS_PROFILE to 'platform-sandbox' to run this script"
return 1
fi
}
16 changes: 16 additions & 0 deletions scripts/event-driven-architectures/utils/check_env_variables.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#!/usr/bin/env bash

check_env_variables () {
local missing_variables=()
local env_var

for env_var in "$@"; do
[[ -n "${!env_var:-}" ]] || missing_variables+=("$env_var")
done

if [[ ${#missing_variables[@]} -gt 0 ]]; then
echo "The following variables must be set in .env:"
printf ' - %s\n' "${missing_variables[@]}"
return 1
fi
}
Loading