🍄AwsAws Cli

AWS CLI

aws 리소스의 tag관리 및 launch template version 관리 등등

Launch Templete AMI image 일괄변경 스크립트

쉘스크립트로 다 하려고 하니 좀 복잡하긴 함

  1. AutoScalingGroup의 app_name 태그값으로 대상 ASG 특정함

  2. 해당 ASG마다 LoadBalancer의 scheme으로 internal 인지 internet-facing 인지 검사

  3. ami 이미지가 다르다면 신규 ami로 변경 (새로운 LT version을 생성)

#!/bin/bash

function check_lb_scheme {
	LB_NAME=`aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names "$1-blue" "$1-green" | jq -r '[.AutoScalingGroups[] | select(.TargetGroupARNs != [])][0] | (.TargetGroupARNs[]) | capture(":targetgroup/(?<name>.*)/") | (.name)'`
	if [ "$LB_NAME" == "" ]
	then
		echo "ERROR"
		echo "failed to find load balance name for module: $1"
		exit 1
	fi

	echo `aws elbv2 describe-load-balancers --names "$LB_NAME" | jq -r '.LoadBalancers[0].Scheme'`
}

if [ $# != 3 ]
then
	echo "usage: $0 APP_TAG_NAME PUBLIC_PRIVATE IMAGE_ID"
	echo "ex) $0 api-beta internal ami-fs0a9fsj"
	echo "ex) $0 api-beta internet-facing ami-fs0a9fsj"
	exit 1
fi

mkdir -p temp

APP_NAME=$1
SCHEME=$2
IMAGE_ID=$3

TEMP_OUTPUT_FILE_NAME=temp/$0-$1-$2-output
TEMP_RESULT_FILE_NAME=temp/$0-$1-$2-result
TEMP_TOTAL_FILE_NAME=temp/$0-$1-$2-total

rm -rf $TEMP_OUTPUT_FILE_NAME
rm -rf $TEMP_RESULT_FILE_NAME
rm -rf $TEMP_TOTAL_FILE_NAME

echo "APP_NAME: $APP_NAME"
echo "SCHEME: $SCHEME"
echo "IMAGE_ID: $IMAGE_ID"
NEXT_TOKEN=""

while true
do
	if [ -z $NEXT_TOKEN ]
	then
		TOKEN_OPTION=""
	elif [ "$NEXT_TOKEN" == "null" ]
	then
		break
	else
		TOKEN_OPTION="--next-token $NEXT_TOKEN"
	fi

	aws ec2 describe-launch-templates $TOKEN_OPTION --filters Name=tag:app_name,Values=$APP_NAME > $TEMP_OUTPUT_FILE_NAME
	NEXT_TOKEN=`jq -r ".NextToken" < $TEMP_OUTPUT_FILE_NAME`
	jq -r ".LaunchTemplates[] | (.LaunchTemplateName|tostring) | select(startswith(\"${APP_NAME}\"))" $TEMP_OUTPUT_FILE_NAME > $TEMP_RESULT_FILE_NAME
	cat $TEMP_RESULT_FILE_NAME >> $TEMP_TOTAL_FILE_NAME
done

echo "launch templates ----------------------"
cat $TEMP_TOTAL_FILE_NAME
echo "---------------------------------------"

while read LT_NAME
do
	LAST_VERSION=`aws ec2 describe-launch-template-versions --launch-template-name ${LT_NAME} | jq '.LaunchTemplateVersions[].VersionNumber' | sort -n -r | head -1`
	CUR_IMAGE_ID=`aws ec2 describe-launch-template-versions --launch-template-name ${LT_NAME} --versions ${LAST_VERSION} | jq -r ".LaunchTemplateVersions[].LaunchTemplateData.ImageId"`
	if [ "$IMAGE_ID" == "$CUR_IMAGE_ID" ]
	then
		echo "name: $LT_NAME, Last version: $LAST_VERSION, current imageId: $CUR_IMAGE_ID (same image, sikp)"
		continue
	fi

	CUR_LB_SCHEME=`check_lb_scheme $LT_NAME`
	if [ "$SCHEME" != "$CUR_LB_SCHEME" ]
	then
		echo "name: $LT_NAME, Last version: $LAST_VERSION, scheme: $CUR_LB_SCHEME (diff scheme, skip)"
		continue
	fi

	echo "name: $LT_NAME, Last version: $LAST_VERSION, scheme: $CUR_LB_SCHEME, currnet image: $CUR_IMAGE_ID (diff image, changing)"

	IMAGE_CHANGE_JSON="{\"ImageId\": \"${IMAGE_ID}\"}"

	aws ec2 create-launch-template-version --launch-template-name ${LT_NAME} --version-description "ami update to $IMAGE_ID" --source-version $LAST_VERSION --launch-template-data "${IMAGE_CHANGE_JSON}" | jq '.LaunchTemplateVersion.LaunchTemplateData.ImageId'

done < $TEMP_TOTAL_FILE_NAME