EC2 따라잡기

실습용 윈도우 EC2 인스턴스 자동화

이 가이드는 AWS CLI를 사용하여 윈도우 서버 EC2 인스턴스를 여러 개 자동으로 설정하는 과정을 상세히 설명합니다. 실제 환경에서는 사용자의 요구사항에 맞게 설정을 조정해야 하며, 실제 테스트가 반드시 필요합니다.

사전 요구사항

전체 워크플로우

  1. 초기 EC2 인스턴스 실행
  2. 윈도우 인스턴스에 접속하여 필요한 프로그램 설치
  3. 커스텀 AMI 생성
  4. 커스텀 AMI를 이용해 필요한 만큼의 인스턴스 실행
  5. 결과 CSV 파일 확인

상세 과정

1. 초기 EC2 인스턴스 실행

먼저, 커스텀 AMI를 만들기 위한 초기 인스턴스를 실행합니다. 다음 AWS CLI 명령어를 사용하세요:

aws ec2 run-instances \
  --image-id ami-04df9ee4d3dfde202 \
  --instance-type m5.large \
  --key-name your-key-pair-name \
  --security-group-ids sg-your-security-group-id \
  --subnet-id subnet-your-subnet-id \
  --count 1 \
  --associate-public-ip-address

주의: --image-id, --instance-type, --key-name, --security-group-ids, --subnet-id를 사용자의 환경에 맞게 수정하세요.

2. 윈도우 인스턴스에 접속 및 프로그램 설치

RDP를 사용하여 윈도우 인스턴스에 접속한 후, 필요한 프로그램을 설치합니다.

3. 커스텀 AMI 생성

다음 Bash 스크립트를 사용하여 커스텀 AMI를 생성할 수 있습니다:

#!/bin/bash

# AMI 생성 함수
create_ami() {
    local instance_id=$1
    local ami_name=$2
    local ami_description=$3

    aws ec2 create-image \
        --instance-id "$instance_id" \
        --name "$ami_name" \
        --description "$ami_description" \
        --no-reboot \
        --query 'ImageId' \
        --output text
}

# AMI 상태 확인 함수
check_ami_status() {
    local ami_id=$1
    aws ec2 describe-images \
        --image-ids "$ami_id" \
        --query 'Images[0].State' \
        --output text
}

# 메인 스크립트
echo "인스턴스 ID를 입력하세요:"
read instance_id

echo "새 AMI의 이름을 입력하세요:"
read ami_name

echo "새 AMI의 설명을 입력하세요:"
read ami_description

echo "AMI 생성 중..."
ami_id=$(create_ami "$instance_id" "$ami_name" "$ami_description")

echo "AMI 생성이 시작되었습니다. AMI ID: $ami_id"
echo "AMI가 사용 가능할 때까지 대기 중..."

while true; do
    status=$(check_ami_status "$ami_id")
    if [ "$status" = "available" ]; then
        echo "AMI가 사용 가능합니다."
        break
    elif [ "$status" = "failed" ]; then
        echo "AMI 생성에 실패했습니다."
        exit 1
    else
        echo "현재 상태: $status. 30초 후 다시 확인합니다..."
        sleep 30
    fi
done

echo "최종 AMI ID: $ami_id"

4. 커스텀 AMI를 이용한 다수의 인스턴스 실행

다음 Bash 스크립트를 사용하여 커스텀 AMI로부터 여러 인스턴스를 실행하고 설정할 수 있습니다:

#!/bin/bash

# 랜덤 비밀번호 생성 함수
generate_password() {
    openssl rand -base64 12
}

# 인스턴스 실행 함수
launch_instance() {
    local instance_number=$1
    local initial_password=$2
    aws ec2 run-instances \
        --image-id ami-your-custom-ami-id \
        --count 1 \
        --instance-type m5.large \
        --key-name your-key-pair-name \
        --security-group-ids sg-your-security-group-id \
        --subnet-id subnet-your-subnet-id \
        --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=WindowsInstance-'$instance_number'}]' \
        --user-data "net user Administrator '${initial_password}'" \
        --query 'Instances[0].InstanceId' \
        --output text
}

# 공개 IP 가져오기 함수
get_public_ip() {
    local instance_id=$1
    aws ec2 describe-instances \
        --instance-ids $instance_id \
        --query 'Reservations[0].Instances[0].PublicIpAddress' \
        --output text
}

# SSM을 사용한 비밀번호 변경 함수
change_password() {
    local instance_id=$1
    local new_password=$2
    aws ssm send-command \
        --instance-ids "$instance_id" \
        --document-name "AWS-RunPowerShellScript" \
        --parameters "commands=[\"net user Administrator '${new_password}'\"]" \
        --output text
}

# 초기 비밀번호 입력 받기
read -s -p "모든 인스턴스의 초기 비밀번호를 입력하세요: " INITIAL_PASSWORD
echo

# 생성할 인스턴스 수 입력 받기
read -p "생성할 인스턴스 수를 입력하세요: " INSTANCE_COUNT

# CSV 파일 준비
echo "Instance ID,Public IP,Username,Password" > rdp_info.csv

# 인스턴스 실행
echo "$INSTANCE_COUNT 개의 인스턴스를 실행 중..."
instance_ids=()
for i in $(seq 1 $INSTANCE_COUNT); do
    instance_id=$(launch_instance $i "$INITIAL_PASSWORD")
    instance_ids+=($instance_id)
    echo "인스턴스 $i 실행됨: $instance_id"
done

# 인스턴스 실행 대기 및 추가 5분 대기
echo "인스턴스가 실행되고 안정화될 때까지 대기 중..."
aws ec2 wait instance-running --instance-ids "${instance_ids[@]}"
echo "인스턴스가 실행 중입니다. 완전한 초기화를 위해 추가로 5분 대기합니다..."
sleep 300

# 각 인스턴스 처리
for instance_id in "${instance_ids[@]}"; do
    echo "인스턴스 처리 중: $instance_id"
    
    # 공개 IP 가져오기
    public_ip=$(get_public_ip $instance_id)
    
    # 새 비밀번호 생성
    new_password=$(generate_password)
    
    # 비밀번호 변경
    echo "인스턴스 $instance_id의 비밀번호 변경 중..."
    change_password "$instance_id" "$new_password"
    
    # CSV에 추가
    echo "$instance_id,$public_ip,Administrator,$new_password" >> rdp_info.csv
    
    echo "인스턴스 $instance_id 처리 완료"
done

echo "모든 인스턴스가 실행되고 처리되었습니다. RDP 정보가 rdp_info.csv 파일에 저장되었습니다."
echo "주의: 비밀번호가 무작위로 생성된 새 비밀번호로 변경되었습니다."

주의사항:

5. 결과 CSV 파일 확인

스크립트 실행이 완료되면 rdp_info.csv 파일에 각 인스턴스의 접속 정보가 저장됩니다. 이 파일을 안전하게 보관하세요.

참고: 30개의 인스턴스를 실행하는데 약 74초 정도 소요되었습니다.

Screenshot 2024-07-06 at 12.24.23 AM.png

결론

이 가이드를 통해 AWS CLI를 사용하여 윈도우 EC2 인스턴스를 자동으로 설정하는 방법을 배웠습니다. 이 과정을 통해 다수의 윈도우 인스턴스를 효율적으로 관리할 수 있습니다. 하지만 실제 환경에 적용하기 전에 반드시 테스트를 진행하고, 보안 설정을 신중히 검토해야 합니다.

추가 질문이나 도움이 필요하다면 언제든 문의해주세요!

Rstudio 실습환경 자동화 구성

Amazon EC2의 Ubuntu 24버전 기준으로 아래 문서를 작성했습니다. 아래 내용은 시간이 지남에 따라 적절히 작동하지 않을 수 있으므로 필요한대로 수정하고 확인하는 것을 추천드립니다!

 

Amazon EC2의 User data 기능을 사용하기 위해 User Data내용을 파일로 만들어둡니다.

여기 예에서는 install_rstudio.txt라고 파일을 만들었습니다.

#!/bin/bash

# update indices
apt update -qq
# install two helper packages we need
apt install -y --no-install-recommends software-properties-common dirmngr
# add the signing key (by Michael Rutter) for these repos
# To verify key, run gpg --show-keys /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc
# Fingerprint: E298A3A825C0D65DFD57CBB651716619E084DAB9
wget -qO- https://cloud.r-project.org/bin/linux/ubuntu/marutter_pubkey.asc | tee -a /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc
# add the repo from CRAN -- lsb_release adjusts to 'noble' or 'jammy' or ... as needed
add-apt-repository -y "deb https://cloud.r-project.org/bin/linux/ubuntu $(lsb_release -cs)-cran40/"

# Install R
apt install -y --no-install-recommends r-base

# Install RStudio dependencies
apt install -y gdebi-core

# Install R pkacage dependencies
apt install -y build-essential

wget https://download2.rstudio.org/server/jammy/amd64/rstudio-server-2024.12.1-563-amd64.deb

gdebi -n rstudio-server-2024.12.1-563-amd64.deb

# Add rstudio user and set password
useradd -m -s /bin/bash rstudio
echo "rstudio:rstudio" | chpasswd

R -e "options(HTTPUserAgent = sprintf('R/%s R (%s)', getRversion(), paste(getRversion(), R.version['platform'], R.version['arch'], R.version['os']))); install.packages('TwoSampleMR', repos = c('https://mrcieu.r-universe.dev/bin/linux/noble/4.4/', 'https://p3m.dev/cran/__linux__/noble/latest', 'https://cloud.r-project.org'))"

이제 다음과 같은 명령어로 EC2를 실행할 수 있습니다. 이 부분이 어렵다면 Amazon EC2 콘솔에서 먼저 진행 후 Command line을 완성하는 것을 추천드립니다.

export AMI_ID={Ubuntu 나 필요한 OS가 설치된 Base AMI}
export INSTANCE_TYPE=t3.large
export KEY_NAME={본인의 KeyName}

# 이외에도 security group (sg-로 시작하는 것들)과 SnapshotId는 본인의 맞게 설정합니다.

aws ec2 run-instances --image-id "${AMI_ID}" --instance-type "${INSTANCE_TYPE}" --key-name "${KEY_NAME}" \
    --user-data file://install_rstudio.txt \
    --block-device-mappings '{"DeviceName":"/dev/sda1","Ebs":{"Encrypted":false,"DeleteOnTermination":true,"Iops":3000,"SnapshotId":"snap-0dbe62bb8f1f21357","VolumeSize":100,"VolumeType":"gp3","Throughput":125}}' \
    --network-interfaces '{"AssociatePublicIpAddress":true,"DeviceIndex":0,"Groups":["sg-0d2f7724e68ddff15","sg-0e2c103f2a28a9be7"]}' \
    --credit-specification '{"CpuCredits":"unlimited"}' --tag-specifications '{"ResourceType":"instance","Tags":[{"Key":"Name","Value":"rstudio server"}]}' \
    --metadata-options '{"HttpEndpoint":"enabled","HttpPutResponseHopLimit":2,"HttpTokens":"required"}' \
    --private-dns-name-options '{"HostnameType":"ip-name","EnableResourceNameDnsARecord":true,"EnableResourceNameDnsAAAARecord":false}' \
    --count "1" --region ap-northeast-2

EC2로 접속해봅니다. 인스턴스 구성이 예상한대로 잘되었다면 아래와 같이 AMI로 만들수 있습니다.

aws ec2 create-image \
    --instance-id {본인의 대상 인스턴스 아이디} \
    --name "My Rstudio server" \
    --description "An AMI for my Rstudio server with TwoSampleMR R package" \
    --region ap-northeast-2

이제 만들어진 AMI로 원하는 수와 설정내용으로 새로운 인스턴스를 실행해보세요!

대규모 인스턴스 수의 실습환경을 제공시 사전에 실습 환경 구성을 해둘 것을 권장합니다. 아래 설명한 인스턴스 생성에대한 Quota 제한도 존재할 수 있고 예기치못한 상황이 있을 수 있으므로 반드시 실습 환경을 실제로 운영하기 시작 전에 충분한 시간을 가지고 인스턴스를 미리 만들어 두는 것을 추천합니다.

AWS에서는 기본 서비스 Quota가 존재합니다. 예를들어 계정 내의 API 초당 요청수, Ec2 인스턴스 요청 수 등이 그 예입니다.
https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html
다음을 참고하여 필요한 만큼 Quota를 사전에 늘리시는 것을 권장드립니다.
https://docs.aws.amazon.com/servicequotas/latest/userguide/request-quota-increase.html