Profile picture

[Shell Script] 셸 스크립트로 개발 환경 한 번에 설정 - (AWS CLI,Credentials / Docker 로컬 개발환경)

JaehyoJJAng2023년 04월 27일

개요

조직에 새로운 사람이 들어오면 그 사람의 PC에 새롭게 개발 환경을 설정 해줘야 할 것이다.

1. 정리가 잘된 개발 환경 문서 파일을 넘겨주거나
2. 구두로 개발 환경 설정 방법을 설명해주거나

그러나 위 두 방법을 매번 입사자가 올 때마다 하기에는 매우 번거롭고 귀찮다.

이럴 때 개발 환경을 한 방에 설정해주는 셸 스크립트를 작성하면 위 고민이 사라진다.


목표

해당 포스트에서는 두 가지의 셸 스크립트를 작성할 것이다.

첫 번째 스크립트의 과정은 대강 아래와 같다

  1. PATH에 Working Directory(작업 경로) 추가.
  2. AWS CLI, AWS EB(ElasticBeanstalk) CLI 설치.
  3. AWS Credential 추가

두 번째 스크립트의 과정은 대강 아래와 같다.

  1. 로컬 환경에서 Docker에 웹서버(Python FastAPI)올리기

위 두 셸 스크립트로 얻는 이점은

첫 번째 셸 스크립트 실행 한 번으로 AWS 기반의 개발 환경이 자동으로 맞춰지고
두 번째 셸 스크립트 실행 한 번으로 로컬 환경에서 바로 개발 가능한 환경이 만들어진다는 것이다.

💡 Tips
참고로 해당 포스트에서는 셸 스크립트 문법에 대해 다루지 않는다.
셸 스크립트에 대해서 더 자세히 알고싶다면 아래 글을 참고하자.
<셸 스크립트 문법 - WTT Devlog>


사전 준비

첫 번째 셸 스크립트의 AWS Credential 인증 과정에서 AWS IAM 유저의 Access Key가 필요하니 미리 발급 받아보자.


1. AWS 로그인 후 IAM 서비스로 이동
image


2. 직접 정책 연결 - AdminstratorAccess 연결 (테스트용이므로 해당 권한 연결)
image


3. 유저 생성 후 Access Key 발급 (.csv 파일로 원하는 경로에 저장)
image
image
image


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 패스워드를 입력하면 ..
image
끝이난다! (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

실행 결과 생략 ..


Loading script...