본문 바로가기

퍼블릭 클라우드

[draft] AWS CLI를 사용하여 EC2 인스턴스의 AMI를 생성하는 스크립트

AWS CLI를 사용하여 EC2 인스턴스의 AMI(Amazon Machine Image)를 생성하는 스크립트

사전 요구사항

  • AWS CLI 설치 및 구성 (aws configure)
  • AMI 생성 권한이 있는 IAM 사용자 또는 역할
  • 대상 EC2 인스턴스 ID 확인

EC2 인스턴스 ID 확인

instance-search.sh 스크립트

#!/bin/bash

INSTANCE_STATE="${1:-running}"

echo "Querying EC2 instances in state: $INSTANCE_STATE..."

RESULT=$(aws ec2 describe-instances \
  --filters "Name=instance-state-name,Values=$INSTANCE_STATE" \
  --query 'Reservations[*].Instances[*].{
    Name:Tags[?Key==`Name`]|[0].Value,
    InstanceId:InstanceId,
    Type:InstanceType,
    PrivateIP:PrivateIpAddress,
    PublicIP:PublicIpAddress,
    Status:State.Name,
    LaunchTime:LaunchTime
  }' \
  --output table)

if [[ -z "$RESULT" || "$RESULT" == "None" ]]; then
  echo "No EC2 instances found in state: $INSTANCE_STATE"
else
  echo "$RESULT"
fi

>> output <<

output

AMI 생성

create_ami.sh 스크립트

더보기

---

기본 AMI 생성 스크립트

vim create_ami.sh
#!/bin/bash

# 변수 설정
INSTANCE_ID="i-0123456789abcdef0"  # 대상 인스턴스 ID
AMI_NAME="MyAMI-$(date +'%Y%m%d%H%M')"  # 날짜 포함 AMI 이름
DESCRIPTION="AMI created from EC2 instance using AWS CLI on $(date)"

# AMI 생성 명령 실행
aws ec2 create-image \
  --instance-id $INSTANCE_ID \
  --name "$AMI_NAME" \
  --description "$DESCRIPTION" \
  --no-reboot
chmod +x create_ami.sh
./create_ami.sh

태그 지정

AMI_ID=$(aws ec2 create-image --instance-id $INSTANCE_ID --name "$AMI_NAME" --description "$DESCRIPTION" --no-reboot --output text)
aws ec2 create-tags --resources $AMI_ID --tags Key=Purpose,Value=Backup

---

#!/bin/bash  
set -euo pipefail

# 함수: 사용법 출력  
usage() {  
  echo "Usage: $0 <instance-id> <image-version> [--no-reboot]"  
  echo "例: $0 i-0123456789abcdef v1.2.3 --no-reboot"  
  exit 1  
}

# 인자 처리  
if [[ $# -lt 2 ]]; then  
  usage  
fi

INSTANCE_ID="$1"  
IMAGE_VERSION="$2"  
NO_REBOOT="false"  
if [[ "${3:-}" == "--no-reboot" ]]; then  
  NO_REBOOT="true"  
fi

# 버전 형식 확인 (예: v1.2.3)  
if ! [[ "$IMAGE_VERSION" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then  
  echo "Error: version format invalid: $IMAGE_VERSION" >&2  
  usage  
fi

# 이름 / 설명  
CURRENT_DATE=$(date +'%Y%m%d')  
IMAGE_NAME="prod-web-ami-${CURRENT_DATE}-${IMAGE_VERSION}"  
IMAGE_DESC="AMI from instance ${INSTANCE_ID}, version ${IMAGE_VERSION}, date ${CURRENT_DATE}"  

# AMI 생성  
echo "Creating AMI from instance $INSTANCE_ID …"  
AMI_ID=$(aws ec2 create-image \
  --instance-id "$INSTANCE_ID" \
  --name "$IMAGE_NAME" \
  --description "$IMAGE_DESC" \
  --no-reboot $NO_REBOOT \
  --tag-specifications "ResourceType=image,Tags=[{Key=Name,Value=${IMAGE_NAME}},{Key=Version,Value=${IMAGE_VERSION}}]" "ResourceType=snapshot,Tags=[{Key=Name,Value=${IMAGE_NAME}}]" \
  --query 'ImageId' --output text)

echo "AMI creation started. AMI ID: $AMI_ID"

# AMI 상태 대기  
echo "Waiting for AMI to become available…"  
while true; do  
  STATE=$(aws ec2 describe-images --image-ids "$AMI_ID" --query 'Images[0].State' --output text)  
  echo "Current AMI state: $STATE"  
  if [[ "$STATE" == "available" ]]; then  
    echo "AMI is available: $AMI_ID"  
    break  
  elif [[ "$STATE" == "failed" ]]; then  
    echo "AMI creation failed" >&2  
    exit 1  
  fi  
  sleep 10  
done

# 결과 출력  
echo "AMI 생성 완료: ID=$AMI_ID, 이름=$IMAGE_NAME"

# 여기서 오래된 AMI 정리 로직 또는 알림을 추가할 수 있음

AWS 웹 콘솔(Management Console)

- 이미지 > AMI

- Elastic Block Store > 스냅샷