π‘οΈ λ§λ₯ (All-in-One) User Data μ€ν¬λ¦½νΈ
μ΄ μ€ν¬λ¦½νΈλ ν¨ν€μ§ μ€μΉλΆν° Secrets Manager μ°λ, CloudWatch μ€μ , κ·Έλ¦¬κ³ μλ¬λ₯Ό 무μνλ μ μ°ν systemd μλΉμ€ λ±λ‘κΉμ§ ν λ²μ μνν©λλ€. λ¬Έμ μμ λͺ
μλμ§ μμ κ²½μ° μμΈ λ¦¬μ (ap-northeast-2)μ μ¬μ©ν΄μΌ νλ€λ κ·μΉμ λ§μΆμ΄ μμ±λμμ΅λλ€. λν OSκ° Amazon Linux 2023μ΄λ―λ‘ dnf ν¨ν€μ§ κ΄λ¦¬μλ₯Ό μ¬μ©ν©λλ€.
#!/bin/bash
# λ‘κ·Έλ₯Ό λ¨κ²¨ νΈλ¬λΈμν
μ΄ μ©μ΄νλλ‘ μ€μ
exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1
echo "1. ν¨ν€μ§ μ
λ°μ΄νΈ λ° νμ μμ‘΄μ± μ€μΉ μμ"
dnf update -y
# Python, MySQL ν΄λΌμ΄μΈνΈ, CloudWatch μμ΄μ νΈ, JSON νμ±μ© jq μ€μΉ [cite: 14]
dnf install -y python3 python3-pip mariadb105 amazon-cloudwatch-agent jq
pip3 install boto3 pymysql
echo "2. μ± λλ ν 리 μμ± λ° λ°μ΄λ리 λ€μ΄λ‘λ"
APP_DIR="/home/ec2-user/worldpay"
mkdir -p $APP_DIR
# S3μμ μ§κΈλ λ°μ΄λ리 λ€μ΄λ‘λ (λ²ν·λͺ
κ³Ό νμΌλͺ
μ λ¬Έμ μ λ§κ² μμ νμ)
# κ³Όμ μ μ§κΈλ λ°μ΄λ리λ₯Ό λ³κ²½ν΄μλ μ λλ―λ‘ μλ³Έ κ·Έλλ‘ λ€μ΄λ‘λν©λλ€[cite: 32].
aws s3 cp s3://[λ²ν·_μ΄λ¦]/[λ°μ΄λ리_νμΌλͺ
] $APP_DIR/app_binary
chmod +x $APP_DIR/app_binary
echo "3. Secrets Managerμμ DB μ 보 κ°μ Έμ€κΈ° λ° .env μμ±"
# λ°νμμ Secrets Managerμμ κ°μ κ°μ Έμ΅λλ€[cite: 14].
SECRET_ID="[μν¬λ¦Ώ_μ΄λ¦]"
REGION="ap-northeast-2" # λͺ
μλμ§ μμ κ²½μ° μμΈ λ¦¬μ
# μν¬λ¦Ώ κ°μ κ°μ Έμμ μλ¬κ° λλλΌλ μ€ν¬λ¦½νΈκ° λ©μΆμ§ μλλ‘ μ²λ¦¬
SECRET_JSON=$(aws secretsmanager get-secret-value --secret-id $SECRET_ID --region $REGION --query SecretString --output text 2>/dev/null)
if [ ! -z "$SECRET_JSON" ]; then
# λ°μ΄λλ¦¬κ° .env νμΌμ μ½μ κ°λ₯μ±μ λλΉν΄ νμΌ μμ±
echo "DB_HOST=$(echo $SECRET_JSON | jq -r .host)" > $APP_DIR/.env
echo "DB_USER=$(echo $SECRET_JSON | jq -r .username)" >> $APP_DIR/.env
echo "DB_PASS=$(echo $SECRET_JSON | jq -r .password)" >> $APP_DIR/.env
echo "DB_NAME=$(echo $SECRET_JSON | jq -r .dbname)" >> $APP_DIR/.env
else
echo "Secrets Managerμμ κ°μ κ°μ Έμ€μ§ λͺ»νκ±°λ λΉ κ°μ
λλ€. .env μμ±μ 건λλλλ€."
fi
chown -R ec2-user:ec2-user $APP_DIR
echo "4. CloudWatch Agent μ€μ "
# Parameter Storeμ μ μ₯λ CloudWatch μ€μ κ°μ κ°μ Έμ μμ΄μ νΈ μ€ν [cite: 14, 20]
# μ€ν¨νλλΌλ trueλ₯Ό λ°ννκ² νμ¬ λ€μ λ¨κ³λ‘ λμ΄κ°κ² ν¨
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c ssm:[νλΌλ―Έν°_μ€ν μ΄_μ΄λ¦] || true
echo "5. systemd μλΉμ€ λ±λ‘ λ° μ€ν"
# EnvironmentFile=- κ²½λ‘ μμ λΆμ νμ΄ν(-)μ νμΌμ΄ μμ΄λ μλ¬λ₯Ό λ΄μ§ μκ³ λ¬΄μνλΌλ λ»μ
λλ€.
cat <<EOF > /etc/systemd/system/worldpay.service
[Unit]
Description=WorldPay User Management App [cite: 4]
After=network.target
[Service]
User=ec2-user
WorkingDirectory=$APP_DIR
EnvironmentFile=-$APP_DIR/.env
ExecStart=$APP_DIR/app_binary
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now worldpay.service
echo "λͺ¨λ User Data μ€ν¬λ¦½νΈ μ€ν μλ£"