Skip to content

Commit

Permalink
fix: create a new ec2 instance if the terminated instance exists
Browse files Browse the repository at this point in the history
  • Loading branch information
hiroTochigi committed Sep 14, 2024
1 parent 850f12f commit 7e171d2
Showing 1 changed file with 97 additions and 83 deletions.
180 changes: 97 additions & 83 deletions src/aws/up.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,20 @@
portConfigArray=
udpPortConfigArray=

publickey=`treehouses sshtunnel key name | cut -d ' ' -f 5`.pub
publickey=$(treehouses sshtunnel key name | cut -d ' ' -f 5).pub

keyname=
groupName=luftballons-sg
instanceName=luftballon
checkSSH=~/.ssh/$publickey

checkSshKey() {
aws ec2 describe-key-pairs --key-names $keyname &> /dev/null
aws ec2 describe-key-pairs --key-names $keyname &>/dev/null
return $?
}

checkSecurityGroup() {
aws ec2 describe-security-groups --group-names $groupName &> /dev/null
aws ec2 describe-security-groups --group-names $groupName &>/dev/null
return $?
}

Expand All @@ -29,18 +29,17 @@ checkInstanceState() {
aws ec2 describe-instances --instance-ids $ID --query "Reservations[*].Instances[*].State.Name" --output text
}

function importSshKey()
{
function importSshKey() {
if [[ -f ~/.ssh/$publickey ]]; then
aws ec2 import-key-pair --key-name "$keyname" --public-key-material fileb://~/.ssh/$publickey
aws ec2 import-key-pair --key-name "$keyname" --public-key-material fileb://~/.ssh/$publickey
else
echo 'ssh key pair (~/.ssh/$publickey) do not exist ~/.ssh/$publickey'
echo 'Please generate the ssh key by the commad "ssh-keygen -t rsa"'
exit 1
fi
}

function addPort(){
function addPort() {
aws ec2 authorize-security-group-ingress \
--group-name $groupName \
--protocol tcp \
Expand All @@ -56,7 +55,7 @@ function addUDPPort() {
--cidr 0.0.0.0/0
}

function createSecurityGroups(){
function createSecurityGroups() {
aws ec2 create-security-group \
--group-name $groupName \
--description "luftballons security group"
Expand All @@ -78,28 +77,28 @@ function createSecurityGroups(){
done
}

function createEc2(){
function createEc2() {
image="ami-0750fb43a63427eff"
#image="ami-01e5ff16fd6e8c542"
aws ec2 run-instances \
--count 1 \
--image-id $image \
--instance-type t2.micro \
--key-name $keyname \
--security-groups $groupName
--security-groups $groupName
}

function findData(){
function findData() {
keyWord=$1
grep $keyWord | awk -F':' '{ print $2 }' | sed 's/ //g; s/"//g; s/,//g'
grep $keyWord | awk -F':' '{ print $2 }' | sed 's/ //g; s/"//g; s/,//g'
}

function deleteKeyword(){
function deleteKeyword() {
keyWord=$1
sed "s/$keyWord//g; s/ //g"
}

function getValueByKeyword(){
function getValueByKeyword() {
keyWord=$1
findData $keyWord | deleteKeyword $keyWord
}
Expand All @@ -116,83 +115,98 @@ function usage {
function up {
while getopts 'n:pN:a:' OPTION; do
case "$OPTION" in
n)
keyname=$OPTARG
;;
p)
portConfigArray=$(getArrayValueAsStringByKey $instanceName tcpPortArray)
udpPortConfigArray=$(getArrayValueAsStringByKey $instanceName udpPortArray)
if [ -z "$portConfigArray" ]; then
echo "There is no stored port numbers. The default port numbers are used"
fi
if [ -z "$udpPortConfigArray" ]; then
echo "There is no stored udp port numbers. The default port numbers are used"
fi
;;
a)
groupName=$OPTARG-sg
instanceName=$OPTARG
keyname=$OPTARG
;;
?)
usage
;;
esac
done
shift "$(($OPTIND -1))"

aws --version || ( echo "Run './installAwsCli.sh' first. AWS CLI is not installed." && exit 1 )

if test ! -f "$checkSSH"; then
echo "Run 'ssh-keygen' first, with an empty passphrase for no passphrase. Missing ssh key." && exit 1
fi
n)
keyname=$OPTARG
;;
p)
portConfigArray=$(getArrayValueAsStringByKey $instanceName tcpPortArray)
udpPortConfigArray=$(getArrayValueAsStringByKey $instanceName udpPortArray)
if [ -z "$portConfigArray" ]; then
echo "There is no stored port numbers. The default port numbers are used"
fi
if [ -z "$udpPortConfigArray" ]; then
echo "There is no stored udp port numbers. The default port numbers are used"
fi
;;
a)
groupName=$OPTARG-sg
instanceName=$OPTARG
keyname=$OPTARG
;;
?)
usage
;;
esac
done
shift "$(($OPTIND - 1))"

if [ -z $keyname ]; then
keyname=luftballon
fi
aws --version || (echo "Run './installAwsCli.sh' first. AWS CLI is not installed." && exit 1)

if ! checkSshKey ; then
importedKeyName=$(importSshKey | getValueByKeyword KeyName )
if [ -z $importedKeyName ]; then
exit 1
fi
echo "Success to add ssh key: $importedKeyName"
else
echo "The key pair $keyname already exists. Please use another key name."
fi
if test ! -f "$checkSSH"; then
echo "Run 'ssh-keygen' first, with an empty passphrase for no passphrase. Missing ssh key." && exit 1
fi

if [ -z $keyname ]; then
keyname=luftballon
fi

if ! checkSecurityGroup; then
createSecurityGroups
echo "Add security group"
# Add rules to Security Group as needed
else
echo "Security Group already exists."
if ! checkSshKey; then
importedKeyName=$(importSshKey | getValueByKeyword KeyName)
if [ -z $importedKeyName ]; then
exit 1
fi
echo "Success to add ssh key: $importedKeyName"
else
echo "The key pair $keyname already exists. Please use another key name."
fi

instanceId=$(checkInstance)
if [ -z "$instanceId" ]; then
instanceState=""
instanceId=$(createEc2 | getValueByKeyword InstanceId)
echo "Creating and running EC2 instance..."
echo "Instance id is $instanceId"
aws ec2 create-tags --resources $instanceId --tags Key=Name,Value=$instanceName
aws ec2 create-tags --resources $instanceId --tags Key=Class,Value=treehouses
publicIp=$(waitForOutput "getLatestIpAddress $instanceId")
echo "Public IP Address is $publicIp"
echo "Will open ssh tunnel soon"
isOpen=$(waitForOutput "ssh-keyscan -H $publicIp | grep ecdsa-sha2-nistp256")
echo "Opened ssh tunnel"
openSSHTunnel $instanceName $publicIp $portConfigArray
storeConfigIntoTreehousesConfigAsStringfiedJson $instanceName $importedKeyName $instanceId $publicIp $groupNameaws ec2 create-tags --resources $instanceId --tags Key=Class,Value=treehouses
else
instanceState=$(checkInstanceState $instanceId)
if [ "$instanceState" = "running" ]; then
if ! checkSecurityGroup; then
createSecurityGroups
echo "Add security group"
# Add rules to Security Group as needed
else
echo "Security Group already exists."
fi

createAndTagInstance() {
instanceId=$(createEc2 | getValueByKeyword InstanceId)
echo "Creating and running EC2 instance..."
echo "Instance id is $instanceId"

aws ec2 create-tags --resources $instanceId --tags Key=Name,Value=$instanceName
aws ec2 create-tags --resources $instanceId --tags Key=Class,Value=treehouses

publicIp=$(waitForOutput "getLatestIpAddress $instanceId")
echo "Public IP Address is $publicIp"
echo "Will open ssh tunnel soon"

isOpen=$(waitForOutput "ssh-keyscan -H $publicIp | grep ecdsa-sha2-nistp256")
echo "Opened ssh tunnel"

openSSHTunnel $instanceName $publicIp $portConfigArray
storeConfigIntoTreehousesConfigAsStringfiedJson $instanceName $importedKeyName $instanceId $publicIp $groupName
}

instanceId=$(checkInstance)
if [ -z "$instanceId" ]; then
createAndTagInstance
else
instanceState=$(checkInstanceState $instanceId)

case "$instanceState" in
"running")
echo "EC2 instance is already running."
elif [ "$instanceState" = "stopped" ]; then
;;
"stopped")
echo "Starting stopped EC2 instance..."
start $instanceName
else
;;
"terminated")
createAndTagInstance
;;
*)
echo "EC2 instance is in state: $instanceState."
fi
;;
esac
fi
}

0 comments on commit 7e171d2

Please sign in to comment.