๐Ÿง EC2์— ๋ฐฐํฌํ•˜๋ฉด์„œ ๋ชจ๋“  DevOps ์ดˆ๋ณด์ž๊ฐ€ ๋ฐฐ์šฐ๋Š” Linux ๋ช…๋ น์–ด

๋ฐœํ–‰: (2026๋…„ 1์›” 4์ผ ์˜คํ›„ 02:23 GMT+9)
5 min read
์›๋ฌธ: Dev.to

Source: Dev.to

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค๋งŒ, ํ˜„์žฌ ์ €๋Š” ์™ธ๋ถ€ ์›น์‚ฌ์ดํŠธ์˜ ๋‚ด์šฉ์„ ์ง์ ‘ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฒˆ์—ญ์ด ํ•„์š”ํ•œ ๋ณธ๋ฌธ ํ…์ŠคํŠธ๋ฅผ ์—ฌ๊ธฐ ์ฑ„ํŒ…์— ๋ถ™์—ฌ ์ฃผ์‹œ๋ฉด, ์š”์ฒญํ•˜์‹  ๋Œ€๋กœ ํ•œ๊ตญ์–ด๋กœ ๋ฒˆ์—ญํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ” SSH & Remote Access

ssh -i DevOps.pem ec2-user@ec2-x-x-x-x.compute-1.amazonaws.com

Purpose: EC2 ์ธ์Šคํ„ด์Šค์— ์•ˆ์ „ํ•˜๊ฒŒ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

  • ssh โ€“ Secure Shell
  • -i DevOps.pem โ€“ ์ธ์ฆ์— ์‚ฌ์šฉํ•  ๊ฐœ์ธ ํ‚ค
  • ec2-user@host โ€“ ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž + EC2 ํ˜ธ์ŠคํŠธ๋ช…

Running a command without interactive login

ssh user@host "command"

Purpose: ์›๊ฒฉ EC2 ์ธ์Šคํ„ด์Šค์—์„œ ๋ช…๋ น์„ ์ง์ ‘ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค (CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ์œ ์šฉ).

Example

ssh ec2-user@EC2_HOST "whoami && hostname"

Managing known hosts for nonโ€‘interactive CI/CD

ssh-keyscan -H EC2_HOST >> ~/.ssh/known_hosts
  • โ€œAre you sure you want to continue connecting?โ€ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ณด๋‹ค ์•ˆ์ „ํ•œ ๋ณ€ํ˜• (ํƒ€์ž„์•„์›ƒ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ํŒŒ์ดํ”„๋ผ์ธ์ด ์‹คํŒจํ•˜์ง€ ์•Š๋„๋ก ํ•จ):

ssh-keyscan -T 10 -H EC2_HOST >> ~/.ssh/known_hosts || true

๐Ÿ“ ํŒŒ์ผ ์‹œ์Šคํ…œ ํƒ์ƒ‰ ๋ฐ ๊ฒ€์‚ฌ

pwd                # Print current directory
ls                 # List files and directories
ls -l              # Long format (permissions, owner, size)
ls -a              # Include hidden files
cd                 # Change directory

์˜ˆ์‹œ

cd DevOpsWeb

๐Ÿ”‘ ํŒŒ์ผ ๋ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ถŒํ•œ (๋งค์šฐ ์ค‘์š”)

๊ถŒํ•œ ๋ณ€๊ฒฝ

chmod 755 directory
chmod 644 file
  • 7 = ์ฝ๊ธฐโ€ฏ+โ€ฏ์“ฐ๊ธฐโ€ฏ+โ€ฏ์‹คํ–‰ (์†Œ์œ ์ž)
  • 5 = ์ฝ๊ธฐโ€ฏ+โ€ฏ์‹คํ–‰ (๊ทธ๋ฃน/๊ธฐํƒ€)
  • 4 = ์ฝ๊ธฐ ์ „์šฉ

์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ

  • Nginx๊ฐ€ ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉ
  • 403โ€ฏForbidden ์˜ค๋ฅ˜ ๋ฐฉ์ง€

์†Œ์œ ๊ถŒ ๋ณ€๊ฒฝ

sudo chown -R ec2-user:nginx /home/ec2-user/DevOpsWeb
  • ์†Œ์œ ์ž โ†’ ec2-user
  • ๊ทธ๋ฃน โ†’ nginx
  • -R โ†’ ์žฌ๊ท€์ 

๋ฃจํŠธ ๊ถŒํ•œ์œผ๋กœ ๋ช…๋ น ์‹คํ–‰

sudo๋Š” ๊ด€๋ฆฌ ๊ถŒํ•œ์œผ๋กœ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉฐ ๋‹ค์Œ์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

  • ํŒจํ‚ค์ง€ ์„ค์น˜
  • ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ํŽธ์ง‘
  • ์„œ๋น„์Šค ์žฌ์‹œ์ž‘

๐ŸŒ Nginx (์›น ์„œ๋ฒ„)

sudo yum install nginx -y          # Install
sudo systemctl start nginx        # Start service
sudo systemctl enable nginx        # Enable on boot
sudo systemctl status nginx       # Check status
sudo nginx -t                     # Test configuration (run before reload)
sudo systemctl reload nginx       # Reload config without downtime

๐ŸŒ ๋„คํŠธ์›Œํ‚น ๋ฐ ๋””๋ฒ„๊น…

curl http://localhost               # Test local web server response
curl http://PUBLIC_IP               # Test public access from the instance
lsof -i :80                         # See what process is using port 80

curl http://localhost๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์ดํŠธ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๋‹ค์Œ์„ ํ™•์ธํ•˜์„ธ์š”:

  • ๋ณด์•ˆ ๊ทธ๋ฃน ๊ทœ์น™
  • ์ธ์Šคํ„ด์Šค ๋ฐฉํ™”๋ฒฝ ์„ค์ •

๐Ÿ“ฆ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ (Amazon Linux)

sudo yum install  -y       # ํŒจํ‚ค์ง€๋ฅผ ๋น„๋Œ€ํ™”์‹์œผ๋กœ ์„ค์น˜
sudo yum remove  -y        # ํŒจํ‚ค์ง€ ์ œ๊ฑฐ

์˜ˆ์‹œ

sudo yum install httpd -y
sudo yum install docker -y
sudo yum remove httpd -y            # ํฌํŠธ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Apache ์ œ๊ฑฐ

๐Ÿณ Docker ๊ธฐ๋ณธ (์ง€๊ธˆ๊นŒ์ง€)

docker run hello-world                     # Verify Docker installation
docker build -t devops-website .           # Build image from Dockerfile
docker ps -a                               # List all containers
docker exec -it <container> <command>      # Run a command inside a running container

์˜ˆ์‹œ

docker exec -it devopsweb ls /usr/share/nginx/html

ec2-user๊ฐ€ sudo ์—†์ด Docker๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค:

sudo usermod -aG docker ec2-user
# Log out and back in for the change to take effect

8๏ธโƒฃ Rsync (CI/CD Deployment)

rsync -avz --delete source/ user@EC2_HOST:/path/to/dest/
  • -a โ€“ ์•„์นด์ด๋ธŒ ๋ชจ๋“œ (๊ถŒํ•œ, ํƒ€์ž„์Šคํƒฌํ”„ ๋“ฑ์„ ๋ณด์กด)
  • -v โ€“ ์ž์„ธํ•œ ์ถœ๋ ฅ
  • -z โ€“ ์••์ถ•
  • --delete โ€“ ๋Œ€์ƒ์— ์กด์žฌํ•˜์ง€๋งŒ ์†Œ์Šค์— ๋” ์ด์ƒ ์—†๋Š” ํŒŒ์ผ์„ ์‚ญ์ œ

์›ํ•˜์ง€ ์•Š๋Š” ํŒŒ์ผ ์ œ์™ธ

--exclude='.git*'
--exclude='.github/'

๋Œ€์ƒ์— ๊ถŒํ•œ ๊ฐ•์ œ ์ ์šฉ

--chmod=Du=rwx,Dgo=rx,Fu=rw,Fgo=r

์ด ์˜ต์…˜๋“ค์€ ๋ฐฐํฌ ์ค‘ ๋ฐœ์ƒํ•œ exit codeโ€ฏ23 ๋ฐ ๊ถŒํ•œ ๊ด€๋ จ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿงช GitHub Actions / CI ๋ช…๋ น์–ด

set -e          # Exit immediately if a command fails
set -eux        # -e: exit on error, -u: treat unset variables as error, -x: print commands (debug)
mkdir -p ~/.ssh
echo "$SECRET" > ~/.ssh/id_rsa   # Write SSH private key from GitHub Secrets

์ด๋Ÿฌํ•œ ์„ค์ •์€ CI ํŒŒ์ดํ”„๋ผ์ธ์ด ํฌ๊ฒŒ ๊ทธ๋ฆฌ๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ์‹คํŒจํ•˜๋„๋ก ํ•˜์—ฌ, ๋ฌธ์ œ๋ฅผ ์กฐ๊ธฐ์— ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

AWS ELASTIC BEANSTALK ๋ฐฐํฌ ๋ฐฉ๋ฒ•

๊ฐœ์š”: AWS Elastic Beanstalk๋Š” ๊ด€๋ฆฌํ˜• ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค๋กœ, ๊ธฐ๋ณธ ์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ  ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

๋ณด์•ˆ AI ๋ฐฐํฌ ํƒ์ƒ‰: AI ์‹œ์Šคํ…œ ๋ณด์•ˆ ๋ฐ ์•ˆ์ „์„ฑ์„ ๊ฐ•ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์•„ํ‚คํ…์ฒ˜

์ด์ „ ๊ธฐ์‚ฌ๋“ค์—์„œ๋Š” AI๋ฅผ ๋น„์ฆˆ๋‹ˆ์Šค ํ•ต์‹ฌ ์‹œ์Šคํ…œ์— ํ†ตํ•ฉํ•จ์œผ๋กœ์จ ๊ธฐ์—…์ด AI ๋ณด์•ˆ ๋ฐ AI ์•ˆ์ „๊ณผ ๊ด€๋ จ๋œ ์ƒˆ๋กœ์šด ์œ„ํ—˜์— ๋…ธ์ถœ๋˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด MCP ์„œ๋ฒ„๋ฅผ ํ†ตํ•œ ๋” ์Šค๋งˆํŠธํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐ (Red Hat Enterprise Linux์šฉ, ํ˜„์žฌ ๊ฐœ๋ฐœ์ž ํ”„๋ฆฌ๋ทฐ)

RHEL Red Hat Enterprise Linux์šฉ Model Context Protocol MCP Server ์†Œ๊ฐœ. RHEL ์‹œ์Šคํ…œ ๊ด€๋ฆฌ์ž์™€ ๊ฐœ๋ฐœ์ž๋Š” ์˜ค๋žซ๋™์•ˆ ํŠน์ • ์„œ๋น„์Šค์— ์˜์กดํ•ด ์™”์Šต๋‹ˆ๋‹ค.