User Data로 인스턴스 초기화하기

AWSBeginner
지금 연습하기

소개

팀은 새 보고서 서버가 올바른 애플리케이션 인사 메시지로 시작하기를 원합니다. Bash User Data 스크립트를 작성하고 EC2 인스턴스를 시작할 때 전달한 뒤, 실행된 애플리케이션과 시작 로그를 확인합니다.

EC2 인스턴스를 시작하고 SSH로 연결하는 방법을 이미 알고 있어야 합니다. 이 새 환경은 자체 이미지, 네트워크, 키 페어를 제공합니다. 서버와 시작 설정은 직접 만듭니다.

자격증 시험과의 연관성

이 실습은 AWS Certified Cloud Practitioner CLF-C02 영역 3 시험 목표의 과제 3.1과 관련된 프로그래밍 방식의 리소스 설정 및 시작 자동화를 연습합니다.

시작 시 애플리케이션 설정하기

이 단계에서는 시작 스크립트를 작성하고 해당 스크립트로 인스턴스를 시작한 뒤 애플리케이션 응답을 확인합니다.

User Data는 인스턴스를 시작할 때 전달하는 정보입니다. Linux 시작 스크립트는 이를 사용해 소프트웨어를 자동으로 설정할 수 있습니다. 기본적으로 첫 부팅 시 root로 실행되므로 스크립트 내부 명령에는 sudo가 필요하지 않습니다. EC2 User Data 공식 가이드는 이 시작 동작과 로그 위치를 설명합니다.

작업 디렉터리에서 시작합니다.

cd /home/labex/project

준비된 이미지에는 보고서 애플리케이션이 들어 있습니다. 이미지와 네트워크 ID를 현재 셸에 불러옵니다.

source launch.env

here-document로 user-data.sh를 만듭니다. 바깥쪽 SCRIPT 구분자는 전체 스크립트를, 안쪽 JSON 구분자는 애플리케이션 설정을 구분합니다. 따옴표로 감싼 구분자는 텍스트를 그대로 유지합니다. 첫 줄의 #!/bin/bash는 Bash를 선택하며, set -euo pipefail은 명령 실패나 정의되지 않은 변수 사용 시 스크립트를 중지합니다. 마지막 echo는 확인에 유용한 시작 로그를 출력합니다.

cat > user-data.sh <<'SCRIPT'
#!/bin/bash
set -euo pipefail
cat > /etc/report-app/config.json <<'JSON'
{
  "message": "Started with User Data"
}
JSON
echo 'Report application configuration applied.'
SCRIPT

이 명령은 로컬 파일을 만들며 아직 인스턴스를 변경하지 않습니다. --user-data file://user-data.sh를 사용해 파일을 run-instances에 전달합니다. AWS CLI가 파일을 읽고 API용으로 인코딩하므로 직접 인코딩할 필요는 없습니다. 서버 이름을 bootstrap-server로 지정합니다.

aws ec2 \
  run-instances \
  --image-id "$AMI_ID" \
  --instance-type t3.micro \
  --subnet-id "$SUBNET_ID" \
  --security-group-ids "$SECURITY_GROUP_ID" \
  --key-name report-key \
  --count 1 \
  --user-data file://user-data.sh \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=bootstrap-server}]'

새 인스턴스 ID를 저장합니다. 필터는 이름 태그를 선택하고 $(...)는 일반 텍스트 결과를 가져옵니다.

INSTANCE_ID=$(aws ec2 \
  describe-instances \
  --filters Name=tag:Name,Values=bootstrap-server \
  --query 'Reservations[0].Instances[0].InstanceId' \
  --output text)

상태와 퍼블릭 주소를 확인합니다.

aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[].Instances[].{Instance:InstanceId,State:State.Name,PublicIPv4:PublicIpAddress}'

running을 확인합니다. 아직 pending이면 잠시 기다렸다가 조회를 반복합니다. 실행 중이라는 상태만으로 시작 설정 성공을 증명할 수는 없습니다. 다음으로 애플리케이션을 확인합니다.

AWS View를 열고 Refresh resources를 클릭한 다음 Application requests에서 bootstrap-server를 선택합니다. Check application을 클릭하고 HTTP 200과 Started with User Data 메시지를 확인합니다. 시작 후 편집하지 않고 시작 스크립트로 서버를 설정했습니다.

AWS View에서 시작 시 설정된 애플리케이션이 HTTP 200을 반환하는 모습

이 예시는 예상 응답을 보여 줍니다. 인스턴스와 네트워크 ID는 다릅니다.

SSH 연결을 위한 퍼블릭 주소를 가져옵니다.

PUBLIC_IP=$(aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[0].Instances[0].PublicIpAddress' \
  --output text)

제공된 SSH 설정이 프라이빗 키와 실습 접근 경로를 선택합니다.

ssh -F ssh_config ubuntu@"$PUBLIC_IP"

현재 애플리케이션 인스턴스 내부에 있습니다. 관리자 권한으로 시작 출력 로그를 읽습니다.

sudo cat /var/log/cloud-init-output.log

Report application configuration applied.를 찾습니다. 이 메시지는 전달한 스크립트의 출력입니다. 시작 실패를 진단할 때는 먼저 이 로그에서 명령 오류를 확인하고 애플리케이션 자체를 테스트하세요. 인스턴스 상태만으로 판단하지 마세요.

LabEx 터미널로 돌아갑니다.

exit

인스턴스에 저장된 User Data도 가져올 수 있습니다. 이 조회는 Base64 값을 선택하고 파이프가 이를 base64 --decode로 전달하여 원본 스크립트를 표시합니다.

aws ec2 \
  describe-instance-attribute \
  --instance-id "$INSTANCE_ID" \
  --attribute userData \
  --query 'UserData.Value' \
  --output text | base64 --decode

Bash 스크립트와 인사 메시지가 파일과 일치하는지 확인합니다. User Data는 보통 첫 부팅에서만 실행됩니다. 인스턴스를 중지한 뒤 시작해도 이 설정이 자동으로 반복되지는 않습니다. 재현 가능한 초기 설정에 시작 자동화를 활용하고 스크립트에 자격 증명을 넣지 마세요.

초기화한 서버 종료하기

이 단계에서는 직접 만든 인스턴스를 제거하고 최종 상태를 확인합니다.

저장한 변수로 식별되는 인스턴스만 종료합니다.

aws ec2 \
  terminate-instances \
  --instance-ids "$INSTANCE_ID"

인스턴스가 terminated 상태가 될 때까지 기다립니다. waiter는 상태를 주기적으로 조회하고 성공하면 출력 없이 종료합니다.

aws ec2 \
  wait instance-terminated \
  --instance-ids "$INSTANCE_ID"

최종 상태를 확인합니다.

aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[].Instances[].{Instance:InstanceId,State:State.Name}'

결과에 terminated가 표시되어야 합니다. AWS View를 새로 고치고 bootstrap-server가 더 이상 실행 중인 애플리케이션 대상이 아닌지 확인합니다. 준비된 네트워크와 키 페어는 그대로 둡니다.

요약

Bash User Data 스크립트를 작성하여 EC2 시작 시 전달했습니다. AWS View에서 애플리케이션의 자동 설정을 확인하고 시작 출력 로그를 살펴본 뒤 저장된 스크립트를 가져왔습니다. 마지막으로 서버를 종료하고 최종 상태를 확인했습니다.