Skip to content

Commit fe1bec0

Browse files
authored
feat: start instance if necessary (#21)
1 parent 013ab47 commit fe1bec0

3 files changed

+111
-1
lines changed

aws-ssm-ec2-iam-policy-start.json

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"Version": "2012-10-17",
3+
"Statement": [
4+
{
5+
"Sid": "AllowStartInstance",
6+
"Effect": "Allow",
7+
"Action": [
8+
"ec2:StartInstances"
9+
],
10+
"Resource": [
11+
"arn:aws:ec2:*:*:instance/*"
12+
]
13+
},
14+
{
15+
"Sid": "AllowCheckIfInstanceIsRunning",
16+
"Effect": "Allow",
17+
"Action": [
18+
"ssm:DescribeInstanceInformation"
19+
],
20+
"Resource": "*"
21+
}
22+
]
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
#!/usr/bin/env sh
2+
######## Source ################################################################
3+
#
4+
# https://github.com/qoomon/aws-ssm-ec2-proxy-command
5+
#
6+
######## Usage #################################################################
7+
# https://github.com/qoomon/aws-ssm-ec2-proxy-command/blob/master/README.md
8+
#
9+
# Install Proxy Command
10+
# - Check Install Steps for aws-ssm-ec2-proxy-command.sh
11+
# - Move this script to ~/.ssh/aws-ssm-ec2-proxy-command-start-instance.sh
12+
# - Ensure it is executable (chmod +x ~/.ssh/aws-ssm-ec2-proxy-command.sh)
13+
# Add following SSH Config Entry to ~/.ssh/config
14+
# host i-* mi-*
15+
# IdentityFile ~/.ssh/id_rsa
16+
# ProxyCommand ~/.ssh/aws-ssm-ec2-proxy-command-start-instance-start.sh %h %r %p ~/.ssh/id_rsa.pub
17+
# StrictHostKeyChecking no
18+
#
19+
# Ensure SSM Permissions for Target Instance Profile
20+
# https://docs.aws.amazon.com/systems-manager/latest/userguide/setup-instance-profile.html
21+
#
22+
# Open SSH Connection
23+
# ssh <INSTANCE_USER>@<INSTANCE_ID>
24+
#
25+
# Ensure AWS CLI environment variables are set properly
26+
# e.g. AWS_PROFILE='default' ssh ec2-user@i-xxxxxxxxxxxxxxxx
27+
#
28+
# If default region does not match instance region you need to provide it like this
29+
# ssh <INSTANCE_USER>@<INSTANCE_ID>--<INSTANCE_REGION>
30+
#
31+
################################################################################
32+
set -eu
33+
34+
REGION_SEPARATOR='--'
35+
MAX_ITERATION=5
36+
SLEEP_DURATION=5
37+
38+
ec2_instance_id="$1"
39+
ssh_user="$2"
40+
ssh_port="$3"
41+
ssh_public_key_path="$4"
42+
ssh_public_key="$(cat "${ssh_public_key_path}")"
43+
44+
45+
if [[ "${ec2_instance_id}" == *"${REGION_SEPARATOR}"* ]]
46+
then
47+
export AWS_DEFAULT_REGION="${ec2_instance_id##*${REGION_SEPARATOR}}"
48+
ec2_instance_id="${ec2_instance_id%%${REGION_SEPARATOR}*}"
49+
fi
50+
51+
function start_instance(){
52+
# Instance is offline - start the instance
53+
>/dev/stderr echo "\n🚀 Starting ec2 Instance ${ec2_instance_id}"
54+
aws ec2 start-instances --instance-ids $ec2_instance_id --profile ${AWS_PROFILE} --region ${AWS_REGION}
55+
sleep ${SLEEP_DURATION}
56+
COUNT=0
57+
>/dev/stderr echo " ⏳ Wait until ${ec2_instance_id} is running"
58+
while [ ${COUNT} -le ${MAX_ITERATION} ]; do
59+
STATUS=`aws ssm describe-instance-information --filters Key=InstanceIds,Values=${ec2_instance_id} --output text --query 'InstanceInformationList[0].PingStatus' --profile ${AWS_PROFILE} --region ${AWS_REGION}`
60+
if [ ${STATUS} == 'Online' ]; then
61+
break
62+
fi
63+
# Max attempts reached, exit
64+
if [ ${COUNT} -eq ${MAX_ITERATION} ]; then
65+
exit 1
66+
else
67+
>/dev/stderr echo " ⁃ [${COUNT}|${MAX_ITERATION}] - retry in ${SLEEP_DURATION} seconds"
68+
let COUNT=COUNT+1
69+
sleep ${SLEEP_DURATION}
70+
fi
71+
done
72+
}
73+
74+
75+
>/dev/stderr echo "⚙️ Ec2 Proxy Command \n"
76+
>/dev/stderr echo "🧪 Check if instance ${ec2_instance_id} is running"
77+
STATUS=`aws ssm describe-instance-information --filters Key=InstanceIds,Values=${ec2_instance_id} --output text --query 'InstanceInformationList[0].PingStatus' --profile ${AWS_PROFILE} --region ${AWS_REGION}`
78+
79+
# If the instance is online, start the session
80+
if [ $STATUS == 'Online' ]; then
81+
>/dev/stderr echo " − State: 🟢 ${STATUS}"
82+
~/.ssh/aws-ssm-ec2-proxy-command.sh $ec2_instance_id $ssh_user $ssh_port $ssh_public_key_path
83+
else
84+
>/dev/stderr echo " − State: 🔴 Offline"
85+
start_instance
86+
~/.ssh/aws-ssm-ec2-proxy-command.sh $ec2_instance_id $ssh_user $ssh_port $ssh_public_key_path
87+
fi

aws-ssm-ec2-proxy-command.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,4 @@ aws ssm send-command \
6767
aws ssm start-session \
6868
--target "${ec2_instance_id}" \
6969
--document-name 'AWS-StartSSHSession' \
70-
--parameters "portNumber=${ssh_port}"
70+
--parameters "portNumber=${ssh_port}"

0 commit comments

Comments
 (0)