AWS CLI
aws 리소스의 tag관리 및 launch template version 관리 등등
Launch Templete AMI image 일괄변경 스크립트
쉘스크립트로 다 하려고 하니 좀 복잡하긴 함
-
AutoScalingGroup의 app_name 태그값으로 대상 ASG 특정함
-
해당 ASG마다 LoadBalancer의 scheme으로 internal 인지 internet-facing 인지 검사
-
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