Post

EC2 환경 설정 (1)

EC2 환경 설정 (1)

SSAFY 프로젝트를 진행하기 위해 EC2 환경 설정 과정을 정리하였다

초기설정

  • pemKey로 ssh 연결
    • vscode ssh, mobaXterm 등등..
    • vscode ssh 연결을 하면 copilot을 사용할 수 있어서 편리하다

image.png

  • 기본 패키지 설치

    1
    2
    3
    
      sudo apt update
      sudo apt upgrade -y
      sudo apt install -y build-essential
    
  • 한국으로 시간 설정

    1
    2
    3
    4
    
      sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
        
      # 시간 확인
      date
    

서버 IP 확인

1
curl ifconfig.me

image.png

방화벽(UFW) 설정

Ubuntu의 방화벽인 UFW(Uncomplicated Firewall)를 설정하여 필요한 포트만 열어준다

  • UFW 상태 확인

    1
    
      sudo ufw status
    
  • 기본적으로 웹 서비스를 위해 다음 포트들을 허용
    • 22번: SSH 접속용
    • 80번: HTTP 웹 서비스용
    • 443번: HTTPS 보안 웹 서비스용
    • 8080번: Jenkins와 같은 개발 서비스용 -> 추후 서브 도메인으로 설정할 예정
    1
    2
    3
    4
    
      sudo ufw allow 22
      sudo ufw allow 80
      sudo ufw allow 443
      sudo ufw allow 8080
    
  • UFW 활성화

    1
    
      sudo ufw enable
    

UFW를 활성화(Enable)하기 전에 반드시 SSH 접속을 위한 22번 포트를 허용(allow)해야 한다
작업 중에는 안전을 위해 여러 개의 터미널을 열어두는 것이 좋다

  • UFW 상태 및 등록된 규칙 확인

    1
    
      sudo ufw status numbered
    

image.png

Docker 설치

  • 기본 패키지 설치
    • apt-transport-https: HTTPS 프로토콜을 통해 패키지 저장소에 접근할 수 있게 해주는 패키지
    • ca-certificates: 인증서 관련 패키지로, HTTPS 통신 시 필요한 신뢰할 수 있는 인증서 제공
    • curl: 명령줄에서 데이터를 다운로드하거나 서버와 통신할 수 있는 도구
    • software-properties-common: 저장소(Repository) 관리 명령어(add-apt-repository 등)를 사용할 수 있게 해주는 패키지
    1
    
      sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
    
  • 자동 설치 스크립트 활용
    • 리눅스 배포판 종류를 자동으로 인식하여 Docker 패키지를 설치해주는 스크립트를 제공
    1
    
      sudo wget -qO- https://get.docker.com/ | sh
    
  • Docker 서비스 실행하기 및 부팅 시 자동 실행 설정

    1
    2
    3
    
      sudo systemctl start docker
      sudo systemctl enable docker
      sudo systemctl restart docker
    
  • 현재 사용자한테 권한부여 및 서버 재시작

    1
    2
    
      sudo usermod -aG docker $(whoami)
      sudo reboot
    
  • 권한 확인

    1
    
      docker -v
    

Docker Hub 로그인

  • PAT 생성
    • 이후에는 토큰 값을 확인할 수 없으니 메모해두거나 잊어버리면 새로 만들어야한다

    image.png

    image.png

  • 로그인
    • 비밀번호는 투명이라 입력해도 보이지 않는다
    1
    
      docker login -u <아이디>
    

    image.png

Nginx 설치

  • 설치

    1
    
      sudo apt install -y nginx
    
  • 활성화 및 시작

    1
    2
    
      sudo systemctl enable nginx
      sudo systemctl start nginx
    
  • 상태 확인

    1
    
      sudo systemctl status nginx
    
  • 기본 페이지 확인

    • http://<서버IP> 주소로 접속하면 nginx 화면을 확인할 수 있다

    image.png

DuckDNS

  • domain 만들기

image.png

  • current ip에 확인했던 EC2 ip를 입력하고 update ip

    image.png

  • Let’s Encrypt 무료 SSL 인증서를 발급받아 Nginx 웹서버에 적용

    1
    
      sudo certbot --nginx -d gaemibot.duckdns.org
    

    image.png

    image.png

Jenkins 설치

  • Docker 네트워크 만들기

    1
    
      docker network create jenkins
    
  • Docker-in-Docker(dind) 컨테이너 띄우기

    • dind를 사용하여 Jenkins에서 Docker를 사용할 수 있도록 설정한다
    1
    2
    3
    4
    5
    6
    7
    
      docker run --name jenkins-docker --rm --detach \
        --privileged --network jenkins --network-alias docker \
        --env DOCKER_TLS_CERTDIR=/certs \
        --volume jenkins-docker-certs:/certs/client \
        --volume jenkins-data:/var/jenkins_home \
        --publish 2376:2376 \
        docker:dind
    
  • Jenkins Dockerfile 만들기

    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
    
      # 1. Jenkins 공식 이미지 기반
      FROM jenkins/jenkins:lts
        
      # 2. root 권한으로 전환
      USER root
        
      # 3. Docker CLI 설치
      RUN apt-get update && apt-get install -y \
          lsb-release \
          curl \
          gnupg2 \
          software-properties-common
        
      # Docker GPG 키 추가
      RUN curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
        
      # Docker 레포지토리 등록
      RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \
          https://download.docker.com/linux/debian $(lsb_release -cs) stable" \
          > /etc/apt/sources.list.d/docker.list
        
      # Docker CLI만 설치
      RUN apt-get update && apt-get install -y docker-ce-cli
        
      # 4. 다시 jenkins 유저로 변경
      USER jenkins
        
    
  • Jenkins 컨테이너 띄우기

    1
    
      docker build -t myjenkins:lts .
    
    1
    2
    3
    4
    5
    6
    7
    8
    
      docker run --name jenkins --restart=on-failure --detach \
        --network jenkins \
        --env DOCKER_HOST=tcp://docker:2376 \
        --env DOCKER_CERT_PATH=/certs/client --env DOCKER_TLS_VERIFY=1 \
        -v jenkins-data:/var/jenkins_home \
        -v jenkins-docker-certs:/certs/client:ro \
        -p 8080:8080 -p 50000:50000 \
        myjenkins:lts
    

Nginx Jenkins 설정

서브 도메인 방식으로 Jenkins에 접근하기 위해 Nginx 설정을 추가한다

  • Jenkins용 Nginx 설정 만들기
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    
      sudo tee /etc/nginx/sites-available/jenkins <<EOF
      server {
          listen 80;
          server_name jenkins.gaemibot.duckdns.org;
          return 301 https://\$host\$request_uri;
      }
    
      server {
          listen 443 ssl http2; # HTTP/2
          server_name jenkins.gaemibot.duckdns.org;
            
          ssl_certificate /etc/letsencrypt/live/gaemibot.duckdns.org/fullchain.pem;
          ssl_certificate_key /etc/letsencrypt/live/gaemibot.duckdns.org/privkey.pem;
          include /etc/letsencrypt/options-ssl-nginx.conf;
          ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
            
          # 압축 설정
          gzip on;
          gzip_min_length 1000;
          gzip_proxied expired no-cache no-store private auth;
          gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
            
          # 연결 매개변수 최적화
          client_max_body_size 100M;
          client_body_buffer_size 128k;
          proxy_connect_timeout 90;
          proxy_send_timeout 90;
          proxy_read_timeout 90;
            
          location / {
              proxy_pass http://localhost:8080;
              proxy_set_header Host \$host;
              proxy_set_header X-Real-IP \$remote_addr;
              proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
              proxy_set_header X-Forwarded-Proto \$scheme;
                
              # 추가 성능 최적화
              proxy_buffering on;
              proxy_buffer_size 8k;
              proxy_buffers 8 32k;
              proxy_busy_buffers_size 64k;
                
              # Jenkins 특화 설정 - 웹소켓 성능 튜닝
              proxy_set_header Connection "upgrade";
              proxy_set_header Upgrade \$http_upgrade;
          }
            
          # 정적 콘텐츠 캐싱
          location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)\$ {
              proxy_pass http://localhost:8080;
              expires 1d;
              add_header Cache-Control "public";
              proxy_set_header Host \$host;
              proxy_set_header X-Real-IP \$remote_addr;
              proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
              proxy_set_header X-Forwarded-Proto \$scheme;
          }
      }
      EOF
    

    image.png

  • sites-enabled 심볼릭 링크 생성

    1
    
      sudo ln -s /etc/nginx/sites-available/jenkins /etc/nginx/sites-enabled/
    
  • Nginx 설정 테스트 및 재시작

    1
    
      sudo nginx -t && sudo systemctl reload nginx
    
  • Certbot으로 SSL 인증서 발급

    1
    
      sudo certbot --nginx -d gaemibot.duckdns.org -d jenkins.gaemibot.duckdns.org
    
  • nginx 재시작

    1
    
      sudo systemctl reload nginx
    
  • 서브 도메인 접근 확인

    https://jenkins.gaemibot.duckdns.org/ 경로로 접속이 가능하다

    image.png

    image.png

  • Jenkins에서도 Location URL을 설정한다

    image.png

Reference

  1. 배포 : EC2, Docker, Jenkins로 CI/CD 파이프라인 구축하기
This post is licensed under CC BY 4.0 by the author.