개요
조직에 새로운 사람이 들어오면 그 사람의 PC에 새롭게 개발 환경을 설정 해줘야 할 것이다.
1. 정리가 잘된 개발 환경 문서 파일을 넘겨주거나
2. 구두로 개발 환경 설정 방법을 설명해주거나
그러나 위 두 방법을 매번 입사자가 올 때마다 하기에는 매우 번거롭고 귀찮다.
이럴 때 개발 환경을 한 방에 설정해주는 셸 스크립트를 작성하면 위 고민이 사라진다.
목표
해당 포스트에서는 두 가지의 셸 스크립트를 작성할 것이다.
첫 번째 스크립트의 과정은 대강 아래와 같다
- PATH에 Working Directory(작업 경로) 추가.
- AWS CLI, AWS EB(ElasticBeanstalk) CLI 설치.
- AWS Credential 추가
두 번째 스크립트의 과정은 대강 아래와 같다.
- 로컬 환경에서 Docker에 웹서버(Python FastAPI)올리기
위 두 셸 스크립트로 얻는 이점은
첫 번째 셸 스크립트 실행 한 번으로 AWS 기반의 개발 환경이 자동으로 맞춰지고
두 번째 셸 스크립트 실행 한 번으로 로컬 환경에서 바로 개발 가능한 환경이 만들어진다는 것이다.
💡 Tips
참고로 해당 포스트에서는 셸 스크립트 문법에 대해 다루지 않는다.
셸 스크립트에 대해서 더 자세히 알고싶다면 아래 글을 참고하자.
<셸 스크립트 문법 - WTT Devlog>
사전 준비
첫 번째 셸 스크립트의 AWS Credential 인증 과정에서 AWS IAM 유저의 Access Key가 필요하니 미리 발급 받아보자.
1. AWS 로그인 후 IAM 서비스로 이동
2. 직접 정책 연결 - AdminstratorAccess 연결 (테스트용이므로 해당 권한 연결)
3. 유저 생성 후 Access Key 발급 (.csv 파일로 원하는 경로에 저장)
1. 셸 스크립트 (1)
1-1. 사전 준비
먼저 프로젝트 폴더를 생성하고, 내부에 디렉토리 구조를 만들어보자.
$ mkdir -p ~/setup/01_aws_setup
$ cd ~/setup/01_aws_setup
$ mkdir ./utilities
$ cd ./utilities
$ mkdir ./{bin,tmp}
$ cd ../
$ mkdir webserver
만들어진 폴더 구조는 아래와 같다.
$ tree -L 2 .
.
├── utilities
│ ├── bin
│ └── tmp
└── webserver
4 directories, 0 files
1-2. 스크립트 작성
aws-setup.sh
# 실행된 쉘 스크립트의 절대 경로를 가져옵니다.
SOURCE="$0"
while [ -h "$SOURCE" ]; do
TARGET="$(readlink "$SOURCE")"
if [[ $SOURCE == /* ]]; then
SOURCE="$TARGET"
else
DIR="$( dirname "$SOURCE" )"
SOURCE="$DIR/$TARGET"
fi
done
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
BASEDIR=$DIR
IFS="/"
BASEDIR_SPLIT=($BASEDIR)
IFS=""
# Root 디렉토리 구하기
PJ_HOME=""
for i in "${!BASEDIR_SPLIT[@]}"; do
key="${BASEDIR_SPLIT[$i]}"
if [[ $i -gt 0 && $i -lt $(( ${#BASEDIR_SPLIT[@]} - 1 )) ]]; then
PJ_HOME="$PJ_HOME/$key"
fi
done
# bash_profile에 PATH를 추가.
echo "export PJ_HOME=$PJ_HOME" >> ~/.bash_profile
echo "export PATH=$PATH:$PJ_HOME" >> ~/.bash_profile
echo "Root directory is $PJ_HOME"
# AWS CLI를 설치하기 위해 pip를 설치.
echo "Installing pip ..."
sudo curl https://bootstrap.pypa.io/get-pip.py -o $PJ_HOME/utilities/tmp/get-pip.py
echo "Running get-pip.py ..."
sudo python $PJ_HOME/utilities/tmp/get-pip.py
# AWS CLI를 설치.
echo "Instailling awscli ..."
sudo pip install --ignore-installed awscli
# AWS ElasticBeanstalk CLI를 설치.
echo "Instailling awsebcli ..."
sudo pip install --ignore-installed awsebcli
# AWS Credential 생성
echo "Input AWS Access Key : "
read AWS_ACCESS_KEY
echo "Input AWS Secret Access Key : "
read AWS_SECRET_ACCESS_KEY
sudo mkdir ~/.aws
sudo chmod -R 777 ~/.aws
sudo touch ~/.aws/credentials
sudo cat > ~/.aws/credentials << EOF
[default]
aws_access_key=$AWS_ACCESS_KEY
aws_secret_access_key=$AWS_SECRET_ACCESS_KEY
EOF
sudo touch ~/.aws/config
sudo cat > ~/.aws/config << EOF
[profile eb-cli]
aws_access_key_id=$AWS_ACCESS_KEY
aws_secret_access_key=$AWS_SECRET_ACCESS_KEY
EOF
# PATH를 터미널에 적용하기 위해 source 실행
source ~/.bash_profile
# 끝!
echo "Done!"
1-3. 파일 권한 수정
해당 셸 스크립트를 실행 가능한 상태로 만들어주자.
$ chmod 700 /home/jaehyo/setup/01_aws_setup/utilities/bin/setup.sh
1-4. 스크립트 실행
$ bash /home/jaehyo/setup/01_aws_setup/utilities/bin/setup.sh
쭉 실행 되다가 마지막에 AWS IAM Access 패스워드를 입력하면 ..
끝이난다! (Done !)
그리고 마지막으로 ~/.aws/credentials
파일을 확인해보면 ..
$ cat ~/.aws/credentials
[default]
aws_access_key=AKIXXXXX
aws_secret_access_key=nXyXXXXX
위와 같이 파일이 잘 생성되었다!
2. 셸 스크립트 (2)
두 번째 셸 스크립트 작성 전 준비해야 할 것이 있다.
도커가 필요하기 때문에 도커를 설치해주도록 하자.
2-1. 사전 준비
아래 포스트를 참고하여 도커를 설치하도록 하자.
[CentOS 7] 도커 설치하기 - WTT Devlog
2-2. 스크립트 작성
도커 허브에 이미 배포된 이미지를 사용할 것이므로 Dockerfile을 따로 작성할 필요는 없다.
$ vi /home/jaehyo/setup/01_aws_setup/utilities/bin/run_docker_local.sh
#!/usr/bin/bash
# 현재 경로에 있는 setup.sh source 불러오기
source ./setup.sh
# 이미지명 지정
IMAGE_NAME='nginx:latest'
# 현재 로컬 개발 컨테이너가 동작 중인지 확인
container_stat=$(docker ps -f name=nginx -q)
if [[ ${container_stat} ]]; then
echo "이미 컨테이너가 동작 중입니다."
echo "해당 컨테이너를 종료합니다"
docker stop ${container_stat}
docker rm ${container_stat}
fi
# 도커 이미지 pull
docker pull "${IMAGE_NAME}"
# 컨테이너 실행
docker run -d -it --name nginx -p 80:80 -v "${LJH_HOME}/webserver:/var/www/webserver "${IMAGE_NAME}"
setup.sh 스크립트를 source
함으로써 "${LJH_HOME}" 변수를 run_docker_local.sh 스크립트에서 불러올 수 있었음.
2-3. 스크립트 권한 수정
chmod 700 ./run_docker_local.sh
2-4. 스크립트 실행
$ bash ./run_docker_local.sh
실행 결과 생략 ..