본문 바로가기
컴퓨터 활용/노년에 즐기는 코딩

aws ec2 modify-instance-attribute ... --block-device-mappings ... 구문 완전 해설

by easyfly 2025. 9. 16.
반응형

aws ec2 modify-instance-attribute ... --block-device-mappings ... 구문 완전 해설

한 줄 요약

해당 명령은 특정 EC2 인스턴스(i-...)의 블록 디바이스 매핑을 수정하여, 루트 볼륨(/dev/xvda)이 인스턴스 종료 시 자동 삭제되지 않도록(DeleteOnTermination:false) 설정합니다.


전체 구문 구조

aws ec2 modify-instance-attribute \
  --instance-id i-XXXXXXXXXXXX \
  --block-device-mappings "[{\"DeviceName\":\"/dev/xvda\",\"Ebs\":{\"DeleteOnTermination\":false}}]"
  • aws ec2: AWS CLI로 EC2 서비스에 명령합니다.
  • modify-instance-attribute: 인스턴스 수준의 속성을 변경하는 API입니다.
  • --instance-id: 대상 인스턴스의 ID(형식: i-...). (주의: vol-...는 볼륨 ID이므로 여기에 넣으면 오류가 납니다.)
  • --block-device-mappings: JSON 배열로 디바이스 매핑 변경 내역을 전달합니다.

--block-device-mappings JSON 세부

배열 요소(객체) 하나가 한 개 디바이스를 의미합니다.

[
  {
    "DeviceName": "/dev/xvda",
    "Ebs": {
      "DeleteOnTermination": false
    }
  }
]
  • DeviceName: 인스턴스가 매핑 인식하는 이름입니다. 보통 루트는 /dev/xvda 또는 /dev/sda1 입니다.
    • OS 내부에서 NVMe로 보일 수 있음(예: /dev/nvme0n1) → 매핑 이름과 다릅니다. 항상 매핑 이름을 써야 합니다.
  • Ebs: EBS 볼륨 관련 옵션 묶음입니다.
    • DeleteOnTermination: true면 인스턴스 종료 시 볼륨 삭제, false면 보존합니다.
      • 본문 명령은 false로 설정하여 종료 후에도 루트 볼륨을 남기기 위함입니다(포렌식/롤백/스냅샷 목적).

여러 디바이스를 한 번에 바꾸려면 배열에 객체를 여러 개 넣습니다.


따옴표·이스케이프(리눅스 Bash 기준)

CLI에 JSON을 직접 인라인으로 넣을 때 이스케이프가 필요합니다.

  • 위 예시는 바깥을 "로 감싸서 내부의 "를 \"로 이스케이프했습니다.
  • 더 단순하게 쓰려면 홑따옴표를 바깥에 쓰면 됩니다(권장):
aws ec2 modify-instance-attribute \
  --instance-id i-XXXXXXXXXXXX \
  --block-device-mappings '[{"DeviceName":"/dev/xvda","Ebs":{"DeleteOnTermination":false}}]'
  • 가장 안전한 방법은 파일로 분리:
cat > mapping.json <<'JSON'
[
  { "DeviceName": "/dev/xvda", "Ebs": { "DeleteOnTermination": false } }
]
JSON

aws ec2 modify-instance-attribute \
  --instance-id i-XXXXXXXXXXXX \
  --block-device-mappings file://mapping.json

Windows PowerShell은 따옴표 해석이 달라 오류가 잦습니다. PowerShell에서는 작은따옴표 전체 감싸기를 권장하거나, 파일 방식을 쓰십시오.


올바른 DeviceName 확인 요령

  1. 볼륨 → 인스턴스/디바이스 이름 조회
VOL_ID=vol-YYYYYYYYYYYYYYYYY
aws ec2 describe-volumes --volume-ids $VOL_ID \
  --query 'Volumes[0].Attachments[0].[InstanceId,Device]' --output text
# 출력: i-...   /dev/xvda  (예시)
  1. 인스턴스 → 현재 매핑 확인
aws ec2 describe-instance-attribute \
  --instance-id i-XXXXXXXXXXXX \
  --attribute blockDeviceMapping

여기서 해당 DeviceName 항목을 확인 후 그대로 사용하십시오.


변경 후 검증

aws ec2 describe-instance-attribute \
  --instance-id i-XXXXXXXXXXXX \
  --attribute blockDeviceMapping \
  --query "BlockDeviceMappings[?DeviceName=='/dev/xvda']"

"DeleteOnTermination": false 로 보이면 성공입니다.
되돌리려면 false → true 로 바꿔 다시 실행합니다.


자주 겪는 오류와 해법

  • Expected: 'i-...'
    --instance-id에 **볼륨 ID(vol-...)**를 넣었을 때 발생. → **인스턴스 ID(i-...)**로 교체.
  • DeviceName not found
    매핑 이름 불일치. 위의 조회 명령으로 정확한 DeviceName을 확인.
  • ASG/런치 템플릿 사용 중
    개별 인스턴스만 바꾸면 재생성 시 원복될 수 있습니다. 런치 템플릿의 블록 디바이스 매핑도 함께 수정하십시오.
  • 중지 필요 여부
    보통 인스턴스 실행 중에도 변경 가능합니다. 특정 조합에서 오류가 나면 정지 후 재시도하십시오.
  • 권한 부족
    IAM에 ec2:ModifyInstanceAttribute, ec2:Describe* 권한이 필요합니다.

실전 팁(운영/비용/보안)

  • 루트 볼륨을 보존(false) 으로 두면 종료 후 비용이 계속 발생합니다. 운영 정책에 따라 스냅샷 후 정리를 자동화하십시오.
  • 백업 규정이 있다면 AWS Backup이나 스냅샷 스케줄을 붙여두십시오.
  • 중요 서버는 종료 실수로 데이터를 잃지 않도록 루트/데이터 볼륨의 DeleteOnTermination을 명시적으로 관리하십시오(태그/정책 포함).

요약

  • 이 명령은 특정 인스턴스의 블록 디바이스 매핑에서 루트 볼륨 삭제 정책을 변경합니다.
  • 핵심 포인트는 올바른 인스턴스 ID(i-...), 정확한 DeviceName(/dev/xvda 등), 그리고 JSON 인라인/파일 전달 방식입니다.
  • 변경 뒤에는 describe-instance-attribute로 즉시 검증하시고, ASG/런치 템플릿을 사용하는 환경이라면 템플릿도 함께 반영하십시오.
반응형

댓글