Skip to content

Commit 13a6a58

Browse files
committed
Add ecs-local script
1 parent a665c39 commit 13a6a58

File tree

2 files changed

+84
-0
lines changed

2 files changed

+84
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
test*
2+
*.list

ecs-local.sh

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
#!/bin/bash
2+
3+
set -e
4+
5+
usage() {
6+
echo "Usage: $0 -c <cluster_name> -s <service_name> [-o <override_command>]"
7+
echo " <cluster_name> must be provided."
8+
echo " <service_name> must be provided."
9+
echo " <override_command> is optional and can be used to overwrite the default command."
10+
exit 1
11+
}
12+
13+
get_task_definition() {
14+
aws ecs describe-services --cluster "$1" --service "$2" --query "services[0].taskDefinition" --output text
15+
}
16+
17+
get_ecr_image() {
18+
aws ecs describe-task-definition --task-definition "$1" | jq -r '.taskDefinition.containerDefinitions[0].image'
19+
}
20+
21+
get_docker_command() {
22+
aws ecs describe-task-definition --task-definition "$1" | jq -r '.taskDefinition.containerDefinitions[0].command | join(" ")'
23+
}
24+
25+
fetch_env_vars() {
26+
local task_definition="$1"
27+
rm -rf ./env.list
28+
touch ./env.list
29+
30+
# Fetch secret environment variables
31+
aws ecs describe-task-definition --task-definition "$task_definition" | jq -r '.taskDefinition.containerDefinitions[0].secrets[] | "\(.name),\(.valueFrom)"' | while IFS=',' read -r name valueFrom; do
32+
local env_value
33+
env_value=$(aws ssm get-parameter --name "$valueFrom" --with-decryption | jq -r '.Parameter.Value')
34+
35+
# Convert multi-line keys into single-line format
36+
if [[ $env_value =~ "PRIVATE KEY" || $env_value =~ "PUBLIC KEY" ]]; then
37+
env_value=$(echo "$env_value" | tr -d '\n')
38+
fi
39+
40+
echo "$name=$env_value" >> ./env.list
41+
done
42+
43+
# Fetch application environment variables
44+
aws ecs describe-task-definition --task-definition "$task_definition" | jq -r '.taskDefinition.containerDefinitions[0].environment[] | "\(.name),\(.value)"' | while IFS=',' read -r name value; do
45+
echo "$name=$value" >> ./env.list
46+
done
47+
}
48+
49+
run_docker_container() {
50+
local ecr_repo="$1"
51+
local ecr_image="$2"
52+
local docker_command="$3"
53+
54+
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin "$ecr_repo"
55+
docker run -d --env-file ./env.list "$ecr_image" sh -c "$docker_command"
56+
}
57+
58+
# Parse arguments
59+
while getopts c:s:o: flag; do
60+
case "${flag}" in
61+
c) cluster_name=${OPTARG} ;;
62+
s) service_name=${OPTARG} ;;
63+
o) override_command=${OPTARG} ;;
64+
*) usage ;;
65+
esac
66+
done
67+
68+
if [ -z "$cluster_name" ] || [ -z "$service_name" ]; then
69+
usage
70+
fi
71+
72+
# Main script logic
73+
TASK_LATEST=$(get_task_definition "$cluster_name" "$service_name")
74+
ECR_IMAGE=$(get_ecr_image "$TASK_LATEST")
75+
ECR_REPO=$(echo "$ECR_IMAGE" | awk -F\/ '{print $1}')
76+
docker_command=$(get_docker_command "$TASK_LATEST")
77+
78+
if [ -n "$override_command" ]; then
79+
docker_command="$override_command"
80+
fi
81+
82+
fetch_env_vars "$TASK_LATEST"
83+
run_docker_container "$ECR_REPO" "$ECR_IMAGE" "$docker_command"

0 commit comments

Comments
 (0)