Intro
I deployed my first two services to AWS Fargate earlier this month --a node/typescript websocket server and a fastapi python microservice. But this post isn't about either service, it's about shell scripting as indicated by the title.
Get information about all configured services in one script
As a sanity measure, I highly recommend using a script similar to the one included below to pull info for all services/instances you have configured with aws. Before doing so, ensure you have the aws cli installed and your credentials stored in ~/.aws/credentials
and/or ~/.aws/config
if using Mac or Linux, else store them in %USERPROFILE%\.aws\credentials
and %USERPROFILE%\.aws\config
if using Windows. Tip: If you're using WSL2 like me, you'll likely want to keep this in your WSL2 distro environment (using the linux/mac locations for your credentials and for installing the aws cli, too).
The local shell script I slapped together that I run each time I want to pull information on all of my aws provisioned infra -- handy to use as a starting point for additional shell-based tasks, especially if configuring CI/CD with github or gitlab. Feel free to overhaul it to meet your needs:
#!/usr/bin/env bash
set -euo pipefail
mkdir -p remote/describe/{cluster,service,taskdef,tg,lb,listeners,repository,image,sg,subnets}
REGION=us-east-1
REPO_ARNS=$(
aws ecr describe-repositories --region "$REGION" |
jq -r '.repositories[].repositoryArn'
)
for REPO_ARN in $REPO_ARNS; do
REPO=${REPO_ARN##*/}
echo "→ Describing ECR repo $REPO"
aws ecr describe-repositories \
--repository-names "$REPO" \
--region "$REGION" \
>remote/describe/repository/"$REPO".json
aws ecr describe-images \
--repository-name "$REPO" \
--region "$REGION" \
>remote/describe/image/"$REPO".json
done
CLUSTER_ARNS=$(aws ecs list-clusters \
--region "$REGION" |
jq -r '.clusterArns[]')
for CLUSTER_ARN in $CLUSTER_ARNS; do
CLUSTER_NAME=${CLUSTER_ARN##*/}
echo "→ Using cluster: $CLUSTER_ARN"
aws ecs describe-clusters \
--clusters "$CLUSTER_ARN" \
--region "$REGION" \
>remote/describe/cluster/"$CLUSTER_NAME".json
SERVICE_ARNS=$(aws ecs list-services \
--cluster "$CLUSTER_ARN" \
--region "$REGION" |
jq -r '.serviceArns[]')
for ARN in $SERVICE_ARNS; do
NAME=${ARN##*/}
echo "→ Describing service $NAME ($ARN)"
aws ecs describe-services \
--cluster "$CLUSTER_ARN" \
--services "$NAME" \
--region "$REGION" \
>remote/describe/service/"$NAME".json
TASK_DEF_ARN=$(jq -r '.services[0].taskDefinition' remote/describe/service/"$NAME".json)
aws ecs describe-task-definition \
--task-definition "$TASK_DEF_ARN" \
--region us-east-1 >remote/describe/taskdef/"$NAME".json
TG_ARN=$(jq -r '.services[0].loadBalancers[0].targetGroupArn' remote/describe/service/"$NAME".json)
aws elbv2 describe-target-groups \
--target-group-arns "$TG_ARN" \
--region us-east-1 >remote/describe/tg/"$NAME".json
LB_ARN=$(jq -r '.TargetGroups[0].LoadBalancerArns[0]' remote/describe/tg/"$NAME".json)
aws elbv2 describe-load-balancers \
--load-balancer-arns "$LB_ARN" \
--region us-east-1 >remote/describe/lb/"$NAME".json
aws elbv2 describe-listeners \
--load-balancer-arn "$LB_ARN" \
--region us-east-1 >remote/describe/listeners/"$NAME".json
SECURITY_GROUP=$(jq -r '.services[0].networkConfiguration.awsvpcConfiguration.securityGroups | join(" ")' remote/describe/service/"$NAME".json)
aws ec2 describe-security-groups \
--group-ids "$SECURITY_GROUP" \
--region "$REGION" >remote/describe/sg/"$NAME".json
SUBNET_IDS=$(jq -r '.services[0].networkConfiguration.awsvpcConfiguration.subnets[]' remote/describe/service/"$NAME".json)
for SUBNET_ID in $SUBNET_IDS; do
mkdir -p remote/describe/subnets/"$NAME"
aws ec2 describe-subnets \
--subnet-ids "$SUBNET_ID" \
>remote/describe/subnets/"$NAME"/"$SUBNET_ID".json
done
done
done
make sure to run chmod+x filename.sh
to make it executable
this will output directories containing files similar to the ones shown in this screenshot
I also strongly recommend adding remote/**/*.json
to your gitignore file since you definitely don't want these to be publicly viewable
Top comments (0)