홍재무쌤 1과제 유저 데이터 입니다.

#!/bin/bash
# 1. User Data 실행 로그 기록 (트러블슈팅용)
exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1

echo "==> 시스템 패키지 및 의존성 업데이트 시작 <=="
dnf update -y
# Python, CloudWatch Agent 등 필수 패키지 설치
dnf install -y python3 python3-pip amazon-cloudwatch-agent

echo "==> Python 라이브러리 설치 <=="
# FastAPI 구동 및 DB/AWS 서비스 연동에 필요한 패키지 설치
pip3 install fastapi uvicorn boto3 pymysql cryptography

echo "==> 애플리케이션 설정 및 다운로드 <=="
APP_DIR="/home/ec2-user/worldpay"
mkdir -p $APP_DIR

# S3에 업로드해둔 main.py 파일을 다운로드 (버킷 이름은 상황에 맞게 수정 필수)
# 제공된 main.py 파일은 절대 수정해선 안 됩니다.
aws s3 cp s3://[본인의_S3_버킷_이름]/main.py $APP_DIR/main.py
chown -R ec2-user:ec2-user $APP_DIR

echo "==> CloudWatch Agent 로그 수집 설정 <=="
# 애플리케이션 로그(/var/log/worldpay.log)를 CloudWatch로 보내도록 설정
cat <<EOF > /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
{
  "logs": {
    "logs_collected": {
      "files": {
        "collect_list": [
          {
            "file_path": "/var/log/worldpay.log",
            "log_group_name": "/worldpay/app-logs",
            "log_stream_name": "{instance_id}",
            "timezone": "UTC"
          }
        ]
      }
    }
  }
}
EOF

# CloudWatch Agent 서비스 시작
systemctl enable amazon-cloudwatch-agent
systemctl restart amazon-cloudwatch-agent

echo "==> 애플리케이션 백그라운드 서비스(systemd) 등록 <=="
# 애플리케이션이 남기는 표준 출력/에러를 worldpay.log 파일에 누적(append)합니다.
cat <<EOF > /etc/systemd/system/worldpay.service
[Unit]
Description=WorldPay FastAPI Application
After=network.target

[Service]
User=ec2-user
WorkingDirectory=$APP_DIR
# uvicorn을 사용하여 FastAPI 앱 실행 (ALB가 연결될 포트로 지정, 예: 80 또는 8000)
# main.py 안에 uvicorn.run() 코드가 이미 있다면 'ExecStart=/usr/bin/python3 main.py' 로 변경하세요.
ExecStart=/usr/local/bin/uvicorn main:app --host 0.0.0.0 --port 80
Restart=always
RestartSec=3
StandardOutput=append:/var/log/worldpay.log
StandardError=append:/var/log/worldpay.log

[Install]
WantedBy=multi-user.target
EOF

# 로그 파일 사전 생성 및 권한 부여
touch /var/log/worldpay.log
chown ec2-user:ec2-user /var/log/worldpay.log

# 시스템 데몬 리로드 및 앱 서비스 시작
systemctl daemon-reload
systemctl enable --now worldpay.service

echo "==> User Data 스크립트 실행 완료 <=="

유동적 코드

#!/bin/bash
exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1

# [변화 포인트 1: 패키지] 
# 기본적으로 아래 목록이면 충분하지만, 만약 추가 라이브러리가 필요하다면 여기에 추가합니다.
dnf update -y
dnf install -y python3 python3-pip amazon-cloudwatch-agent jq
pip3 install fastapi uvicorn boto3 pymysql 

echo "==> 애플리케이션 설정 <=="
# [변화 포인트 2: 작업 디렉토리] 문제에서 지정한 경로가 있다면 수정합니다.
APP_DIR="/home/ec2-user/worldpay"
mkdir -p $APP_DIR

# [변화 포인트 3: S3 버킷 및 파일명] ★ 필수 수정 ★
# 본인이 생성한 S3 버킷 이름과 업로드한 파일명(예: main.py)을 정확히 입력해야 합니다.
# 문제지 에 따르면 파일명은 'main.py'입니다.
S3_BUCKET="[본인의_S3_버킷_명]"
FILE_NAME="main.py" 

aws s3 cp s3://$S3_BUCKET/$FILE_NAME $APP_DIR/$FILE_NAME
chown -R ec2-user:ec2-user $APP_DIR

echo "==> CloudWatch Agent 설정 <=="
# [변화 포인트 4: 로그 그룹 이름]
# 문제지 [cite: 234]에서 Log Group 생성을 요구하므로, 본인이 만든 로그 그룹 이름과 일치시켜야 합니다.
LOG_GROUP_NAME="/worldpay/app-logs"

cat <<EOF > /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
{
  "logs": {
    "logs_collected": {
      "files": {
        "collect_list": [
          {
            "file_path": "/var/log/worldpay.log",
            "log_group_name": "$LOG_GROUP_NAME",
            "log_stream_name": "{instance_id}",
            "timezone": "UTC"
          }
        ]
      }
    }
  }
}
EOF

systemctl enable amazon-cloudwatch-agent
systemctl restart amazon-cloudwatch-agent

echo "==> 서비스 등록 <=="
# [변화 포인트 5: 실행 포트 및 모듈명]
# ALB 대상 그룹(Target Group) 설정 시 지정한 포트(예: 80 또는 8080)와 일치해야 합니다.
# 'main:app'에서 main은 파일명(main.py)을 의미합니다. [cite: 41]
APP_PORT="80" 

cat <<EOF > /etc/systemd/system/worldpay.service
[Unit]
Description=WorldPay App
After=network.target

[Service]
User=ec2-user
WorkingDirectory=$APP_DIR
# 만약 main.py 내부에 uvicorn.run 코드가 있다면 ExecStart=/usr/bin/python3 main.py로 변경
ExecStart=/usr/local/bin/uvicorn main:app --host 0.0.0.0 --port $APP_PORT
Restart=always
StandardOutput=append:/var/log/worldpay.log
StandardError=append:/var/log/worldpay.log

[Install]
WantedBy=multi-user.target
EOF

touch /var/log/worldpay.log
chown ec2-user:ec2-user /var/log/worldpay.log

systemctl daemon-reload
systemctl enable --now worldpay.service