일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- self-signed ssl
- .net
- crashlog
- PDA
- M8200
- 블루투스 헤드셋
- GDI
- C/C++
- MFC
- net
- C#
- 기념일관리
- 자바스크립트
- php
- 와이브로
- 데이터 전달
- ClickOnce
- plcrashreporter
- VS2008
- Font
- Antialiasing
- 크래시로그
- 설치제거
- API
- JavaScript
- 한 번만 실행
- EUC-KR
- protobuf-c
- phpmailer
- docker
- Today
- Total
~☆~ 우하하!!~ 개발블로그
AWS EC2 Setup 자동화를 위한 스크립트 본문
전체 순서는 다음과 같다.
##################################################
# TOC
# 타임존 설정
# OpenJDK 설치 (17.0.10+7)
# apache2 설치
# PostgreSQL 16 설치
# AWS CLI v2 설치
# webapp 계정 생성
##################################################
각 단계별 스크립트 내용을 살펴보자.
각 단계별 스크립트마다 맨 앞 라인에 #!/bin/bash 를 추가해서 파일로 작성하면 실행이 가능하다.
파일로 저장된 스크립트 파일은 실행 모드를 추가해야 한다.
sudo chmod +x <filename>
타임존 설정
AWS EC2 인스턴스를 생성한 후 별도의 설정을 하지 않으면 UTC 기준의 타임존으로 설정되어 있는 상태이다. 대한민국 대상의 서비스를 한다면, 아래와 같이 Asia/Seoul 로 타임존을 설정하는 것이 필요하다.
# --------------------------------------------------------
# 타임존 설정
echo "현재 타임존: $(timedatectl | grep 'Time zone')"
echo "타임존을 Asia/Seoul로 설정합니다..."
sudo timedatectl set-timezone Asia/Seoul
echo "변경된 타임존: $(timedatectl | grep 'Time zone')"
echo "타임존 설정 완료!"
# --------------------------------------------------------
OpenJDK 설치 (17.0.10+7)
ubuntu 를 서버로 사용할 경우 많은 경우 JDK 설치가 필수적이다.
OpenJDK 17.0.10+7 버전의 설치를 자동화하는 스크립트는 다음과 같다.
# --------------------------------------------------------
# OpenJDK 설치 (17.0.10+7)
JDK_URL="https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.10%2B7/OpenJDK17U-jdk_x64_linux_hotspot_17.0.10_7.tar.gz"
JDK_TAR_FILE="/tmp/OpenJDK17U-jdk_x64_linux_hotspot_17.0.10_7.tar.gz"
JDK_INSTALL_DIR="/opt/jdk-17.0.10+7"
# JDK 파일 다운로드 확인
if [ -f "$JDK_TAR_FILE" ]; then
echo "JDK 파일이 이미 존재합니다: $JDK_TAR_FILE, 다운로드를 건너뜁니다."
else
echo "OpenJDK 17을 다운로드하는 중..."
wget -O $JDK_TAR_FILE $JDK_URL
fi
echo "OpenJDK 17을 $JDK_INSTALL_DIR에 설치합니다..."
sudo mkdir -p $JDK_INSTALL_DIR
sudo tar -xzf $JDK_TAR_FILE -C $JDK_INSTALL_DIR --strip-components=1
# 심볼릭 링크 생성 - 차후 /usr/bin/java 로 실행하기 위함
JDK_LINK_DIR="/usr/bin"
JDK_INSTALL_DIR="/opt/jdk-17.0.10+7"
# 기존 심볼릭 링크가 존재하는지 확인하고 삭제
if [ -L "$JDK_LINK_DIR/java" ]; then
echo "Existing symbolic link found. Removing it..."
sudo rm "$JDK_LINK_DIR/java"
elif [ -e "$JDK_LINK_DIR/java" ]; then
echo "A file or directory named 'java' exists in $JDK_LINK_DIR but it's not a symbolic link. Please check and remove manually."
exit 1
fi
# 새로운 심볼릭 링크 생성
echo "Creating new symbolic link for Java..."
sudo ln -s "$JDK_INSTALL_DIR/bin/java" "$JDK_LINK_DIR/java"
echo "Symbolic link created successfully: $JDK_LINK_DIR/java -> $JDK_INSTALL_DIR/bin/java"
# 환경 변수 설정
echo "JAVA_HOME 및 PATH 환경 변수를 /etc/profile에 추가합니다..."
sudo sed -i '/JAVA_HOME/d' /etc/profile
sudo sed -i '/PATH=\$JAVA_HOME\/bin/d' /etc/profile
echo "export JAVA_HOME=$JDK_INSTALL_DIR" | sudo tee -a /etc/profile
echo "export PATH=\$JAVA_HOME/bin:\$PATH" | sudo tee -a /etc/profile
source /etc/profile
# 설치 확인
echo "JAVA 버전 확인:"
java -version
# --------------------------------------------------------
JDK 설치 디렉토리는 /opt/jdk-17.0.10+7 로써 java 를 실행시키려면 /opt/jdk-17.0.10+7/bin/java 경로를 사용해야 하지만, /usr/bin/java 로 심볼릭 링크를 걸어서 /usr/bin/java 를 사용할 수 있도록 설정하는 내용까지 포함되었다.
JAVA_HOME 의 경로를 PATH 에 추가하는 환경변수를 /etc/profile 에 설정함으로써 모든 계정에 적용되도록 하고 있다.
apache2 설치
apache2 는 web server 로 사용하거나 tomcat 을 위해 reverse proxy 로 사용하기에 좋다.
# --------------------------------------------------------
# apache2 설치
# 업데이트 및 Apache 설치
echo "Updating package list and installing Apache..."
sudo apt update -y
sudo apt install apache2 -y
# Apache 서비스 시작 및 부팅 시 자동 시작 설정
echo "Starting Apache service..."
sudo systemctl start apache2
sudo systemctl enable apache2
# Apache 상태 확인
echo "Checking Apache status..."
sudo systemctl status apache2
echo "Apache installation and setup completed successfully!"
# --------------------------------------------------------
apache2 를 설치만 하는 작업은 그리 복잡하지 않다. 나중에 웹서버로 설정을 하거나 reverse proxy 를 설정하는 커스터마이징 단계가 필요하다.
PostgreSQL 16 설치
# --------------------------------------------------------
# PostgreSQL 16 설치
# PostgreSQL 16이 설치되어 있는지 확인
if psql --version | grep -q "psql (PostgreSQL) 16"; then
echo "PostgreSQL 16이 이미 설치되어 있습니다. 설치 과정을 건너뜁니다."
else
# 패키지 업데이트
echo "패키지 업데이트 중..."
sudo apt update -y
# PostgreSQL 16 설치를 위한 리포지토리 추가
echo "PostgreSQL 리포지토리를 추가합니다..."
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
# PostgreSQL 패키지 GPG 키 가져오기
echo "PostgreSQL GPG 키를 가져옵니다..."
wget -qO - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
# PostgreSQL 설치
echo "PostgreSQL 16을 설치합니다..."
sudo apt update -y
sudo apt install -y postgresql-16
echo "PostgreSQL 설치가 완료되었습니다."
fi
# PostgreSQL 16을 사용하도록 PATH 설정 (이미 설정되어 있는지 확인)
PROFILE_FILE="/etc/profile"
PG_PATH="/usr/lib/postgresql/16/bin"
if [[ ":$PATH:" != *":$PG_PATH:"* ]]; then
echo "Configuring PATH for PostgreSQL 16..."
echo "export PATH=\"$PG_PATH:\$PATH\"" | sudo tee -a "$PROFILE_FILE" > /dev/null
source "$PROFILE_FILE"
else
echo "PATH is already configured for PostgreSQL 16."
fi
# 컴파일러 및 패키지 설정을 위한 환경 변수 설정
LDFLAGS_SET="export LDFLAGS=\"-L/usr/lib/postgresql/16/lib\""
CPPFLAGS_SET="export CPPFLAGS=\"-I/usr/include/postgresql\""
PKG_CONFIG_SET="export PKG_CONFIG_PATH=\"/usr/lib/postgresql/16/lib/pkgconfig\""
# /etc/profile에 LDFLAGS 설정 확인 및 추가
if ! grep -Fxq "$LDFLAGS_SET" "$PROFILE_FILE"; then
echo "Setting LDFLAGS for PostgreSQL 16 in $PROFILE_FILE..."
echo "$LDFLAGS_SET" | sudo tee -a "$PROFILE_FILE" > /dev/null
fi
# /etc/profile에 CPPFLAGS 설정 확인 및 추가
if ! grep -Fxq "$CPPFLAGS_SET" "$PROFILE_FILE"; then
echo "Setting CPPFLAGS for PostgreSQL 16 in $PROFILE_FILE..."
echo "$CPPFLAGS_SET" | sudo tee -a "$PROFILE_FILE" > /dev/null
fi
# /etc/profile에 PKG_CONFIG_PATH 설정 확인 및 추가
if ! grep -Fxq "$PKG_CONFIG_SET" "$PROFILE_FILE"; then
echo "Setting PKG_CONFIG_PATH for PostgreSQL 16 in $PROFILE_FILE..."
echo "$PKG_CONFIG_SET" | sudo tee -a "$PROFILE_FILE" > /dev/null
fi
echo "Environment variables for PostgreSQL 16 have been set globally in $PROFILE_FILE."
# 환경 변수 적용
source "$PROFILE_FILE"
# PostgreSQL 16 서비스 활성화 및 시작
echo "PostgreSQL 서비스를 활성화하고 시작합니다..."
sudo systemctl enable postgresql
sudo systemctl start postgresql
# PostgreSQL 서비스 상태 확인
echo "PostgreSQL 서비스 상태를 확인합니다..."
sudo systemctl status postgresql | grep "Active: active (running)"
# PostgreSQL 버전 확인
echo "PostgreSQL 버전 확인:"
psql --version
# --------------------------------------------------------
AWS CLI 설치
서버를 운영하는 중에 S3 와의 파일 공유할 일이 생기는 것에 대비하여, AWS CLI 를 설치하는 과정을 스크립트화 하였다.
# --------------------------------------------------------
# AWS CLI v2 설치
echo "AWS CLI v2 설치 중..."
# 1. AWS CLI v2 다운로드
AWSCLIV2_FILENAME="awscliv2.zip"
cd /tmp
if [ -f "/tmp/$AWSCLIV2_FILENAME" ]; then
echo "File /tmp/$AWSCLIV2_FILENAME already exists. Skipping download."
else
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "$AWSCLIV2_FILENAME"
fi
echo "unzip 패키지를 설치합니다."
sudo apt-get update
sudo apt-get install -y unzip
# 2. 압축 해제 및 설치
unzip "$AWSCLIV2_FILENAME"
sudo ./aws/install
# 3. 설치 확인
aws --version
echo "AWS CLI 설치를 완료하였습니다."
# 설치에 사용된 압축 파일 및 압축해제된 파일을 삭제한다. 다시 다운로드할 필요없도록 다운로드한 파일은 삭제하지 않는다.
#sudo rm -rf "/tmp/$AWSCLIV2_FILENAME"
sudo rm -rf ./aws/
# --------------------------------------------------------
계정 생성
AWS EC2 에는 기본으로 ubuntu 계정이 생성되는데, 웹서비스를 위한 별도의 계정(예를 들어 webapp)을 생성하고 ubuntu 계정에서 사용하는 페어키를 공유하는 방법을 다음과 같이 스크립트화 하였다.
# --------------------------------------------------------
# webapp 계정 생성
# 새 사용자 이름 설정
NEW_USER="webapp"
SSH_DIR="/home/$NEW_USER/.ssh"
AUTHORIZED_KEYS_FILE="$SSH_DIR/authorized_keys"
# 1. 새 사용자 계정 생성
echo "Creating new user: $NEW_USER"
sudo adduser --disabled-password --gecos "" $NEW_USER
# 2. SSH 디렉토리 및 권한 설정
echo "Setting up SSH directory and permissions for $NEW_USER"
sudo mkdir -p $SSH_DIR
sudo chmod 700 $SSH_DIR
# 3. 기존 ubuntu 계정의 SSH 키 복사
echo "Copying SSH key from ubuntu user to $NEW_USER"
sudo cp /home/ubuntu/.ssh/authorized_keys $AUTHORIZED_KEYS_FILE
sudo chmod 600 $AUTHORIZED_KEYS_FILE
sudo chown -R $NEW_USER:$NEW_USER $SSH_DIR
# 4. SSH 접속 테스트 메시지 출력
echo "SSH setup for $NEW_USER complete. You can now connect using the same key file."
echo "Example: ssh -i your-key.pem $NEW_USER@<EC2_PUBLIC_IP>"
# visudo를 사용하지 않고 직접 설정 추가
SUDOERS_FILE="/etc/sudoers"
TEMP_SUDOERS="/tmp/sudoers.tmp"
# 기존 sudoers 파일을 백업
echo "Backing up current sudoers file..."
sudo cp $SUDOERS_FILE ${SUDOERS_FILE}.bak
# sudoers 파일에 webapp 설정 추가
echo "Adding sudo NOPASSWD configuration for $NEW_USER..."
if ! sudo grep -q "^$NEW_USER ALL=(ALL) NOPASSWD:ALL$" $SUDOERS_FILE; then
sudo cp $SUDOERS_FILE $TEMP_SUDOERS
echo "$NEW_USER ALL=(ALL) NOPASSWD:ALL" | sudo tee -a $TEMP_SUDOERS > /dev/null
sudo visudo -cf $TEMP_SUDOERS && sudo cp $TEMP_SUDOERS $SUDOERS_FILE
echo "Configuration added successfully."
else
echo "Configuration already exists for $NEW_USER in $SUDOERS_FILE."
fi
# 임시 파일 삭제
sudo rm -f $TEMP_SUDOERS
echo "Finished configuring sudo privileges for $NEW_USER. No password will be required for sudo commands."
# --------------------------------------------------------
'AWS' 카테고리의 다른 글
s3 의 모든 버킷을 로컬로 copy 하는 스크립트 (0) | 2024.12.02 |
---|