Post

데브코스 TIL - 스프린트4 AWS

스프린트4 AWS

✅AWS

  • Amazon Web Services의 약자
  • 다양한 IT 인프라와 관련 서비스를 제공하여 개발자와 기업이 자신의 응용 프로그램을 구축하고 실행할 수 있는 플랫폼을 제공 (웹/모바일, 빅데이터/인공지능 등)
  • 클라우드 컴퓨팅 서비스 모델 IaaS, PaaS, SaaS 중 IaaS에 가까운 모델임

IaaS (Infrastructure as a Service)

  • 인프라를 가상화하여 필요에 따라 서버, 스토리지, 네트워크 및 기타 컴퓨팅 리소스를 온디맨드로 제공하는 서비스 모델
  • 사용자는 가상 서버, 스토리지 등과 같은 IT 인프라를 구매하고 관리
  • Amazon EC2 (Elastic Compute Cloud), Amazon S3 (Simple Storage Service) 등

PaaS (Platform as a Service)

  • 응용 프로그램을 개발, 실행 및 관리하기 위한 플랫폼을 제공하는 서비스 모델
  • 개발자는 응용 프로그램의 코드를 작성하고 배포하는 데 집중, 인프라 관리는 PaaS 공급자가 처리
  • AWS Elastic Beanstalk, AWS Lambda

SaaS (Software as a Service)

  • 사용자에게 소프트웨어 애플리케이션을 인터넷을 통해 제공하는 서비스 모델
  • 사용자는 애플리케이션에 대한 액세스만 제공받음, 플랫폼에 대한 관리는 서비스 제공자가 처리
  • AWS Marketplace

✅클라우드 인프라 장/단점

클라우드 인프라 장점

  • 유연한 이용, 안정적 서비스, 다중화와 스케일링
  • pay-as-you-go(사용한만큼만 비용을 지불) → TCO (total cost of ownership) 절감
  • 다양한 도구 제공
  • 풍부한 문서 및 참고자료

클라우드 인프라 단점

  • 생각보다 비용이 비쌈 (제대로 사용하지 못해도 리소스가 이용되고 있으면 과금됨)
  • 활용법을 익혀야 함 (익숙해지지 않으면 다소 복잡하고 생소하게 느껴질 수 있음)

✅ EC2 (Elastic Compute Cloud)

AWS에 의하여 운용되고 있는 네트워크 상에 존재하는 가상의 서버

  • 여러 가지 운영체제로 이루어진 소프트웨어 실행 환경을 선택하여 설치, 운영 가능
  • 서버를 구매하고 소프트웨어를 설치해서 가상의 서버(IDC)에 두는 것과 비슷
  • https://aws.amazon.com/ko/ec2/

✅ AMI (Amazone Machine Images)

EC2에서 활용하는 컴퓨터(파일시스템) 이미지

✅ ECR (Elastice Container Registry)

어디서나 컨테이너 소프트웨어를 쉽게 저장, 공유 및 배포

✅ S3 (Simple Storage Service)

Bucket 단위로 운영되는 객체 저장 서비스

  • 비정형 데이터를 저장하고 접근, 공유
  • AWS Glacier와 연동 이용하여 데이터 유지의 비용을 절감하고 접근 유연성을 높임
  • https://aws.amazon.com/ko/s3/

✅스프린트4에서의 AWS 활용

  • 배포 환경을 AWS 위에 구축 (EC2)
    • minikube 이용한 작은 single-node cluster
    • 데이터베이스(mariaDB) 설치하고 운용
    • 웹 서버 (Nginix reverse proxy) 설치하고 운용
    • 이미 소프트웨어 설치 및 설정이 이루어진 상태의 AMI를 자료로 받아서 사용 (데이터베이스 스키마, 웹서버 설정, minikube의 기본 설정 등이 적용되어 있음)
  • 이미지 레지스트리 (ECR)
    • FE, BE 각각을 컨테이너로 빌드하여 ECR에 등록
    • 프로덕션 및 스테이징 배포를 위하여 이미지 인출
  • 테라폼(Terraform) 상태 데이터 저장 (S3)
    • 프로덕션 및 스테이징 배포에 있어 terraform state 저장에 이용

AWS 실습

1. “Web fullcycle (180993267331) 실습 세팅” 노션페이지를 참고하여 다음 작업을 수행

  1. ECR 레포지토리 만들기
  2. S3 만들기
  3. EC2 만들기
  4. EC2에 공인 IP 할당하기 (Elastic IP)
  5. 공인 IP에 도메인 연결하기
  6. 레코드가 정상적으로 등록되었는지 확인

2. 레코드가 정상적으로 등록되었는지 확인 단계

1
2
3
4
5
6
7
8
nslookup 아이디.prgms-fullcycle.com

서버:    kns.kornet.net
Address:  168.###.###.#

권한 없는 응답:
이름:    아이디.prgms-fullcycle.com
Address:  3.##.171.##

3. 발급받은 키로 로그인하기

1
2
3
4
5
6
7
8
9
10
11
ssh -i ./비밀번호파일명.pem ubuntu@아이디.prgms-fullcycle.com

(...)
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

Last login: Fri Jan 19 19:24:27 2024 from 61.74.101.15

리눅스환경에서 거부가 된다면 다음 명령어를 사용해서 권한을 확인하고, 그룹과 다른 사람들에게도 읽기 권한이 주어져있으면 삭제해야한다.

윈도우에서는 권한 설정 없이 잘 실행되었다.

1
ls -l 비밀번호파일명.pem
1
chmod go-r 비밀번호파일명.pem

4. 미니큐브 활성화

윈도우 환경여도, 로그인을 하면 터미널이 ssh로 변경되기 때문에 다음 명령어를 그대로 입력해도 명령어 실행이 됨

1
sudo systemctl enable minikube 
1
2
3
4
sudo reboot

Connection to 아이디.prgms-fullcycle.com closed by remote host.
Connection to 아이디.prgms-fullcycle.com closed.
1
ssh -i ./비밀번호파일명.pem ubuntu@아이디.prgms-fullcycle.com

sudo reboot 명령어를 사용해 연결이 끊어졌다면 다시 로그인하면 된다.
만약 다시 로그인해도 안된다면 아직 minikube 설정이 완료되지 않았을 수도 있다. 시간이 지나고 다시 로그인하면 된다.

1
2
3
4
5
6
systemctl status minikube

(...)
Loaded: loaded (/etc/systemd/system/minikube.service; enabled; vendor preset: enabled)
  Active: active (exited) since Tue 2024-04-02 16:55:29 KST; 4min 42s ago
(...)

명령어를 사용해서 상태가 Active: active(exited)될 때까지 기다려야한다.

5. 클러스터 상태확인

상태가 active(exited)되었다면 다음 명령어로 클러스터 상태를 확인

1
2
3
4
5
6
7
8
9
kubectl get all -A
NAMESPACE     NAME                                   READY   STATUS    RESTARTS        AGE
kube-system   pod/coredns-5dd5756b68-ftz7r           1/1     Running   1 (7m27s ago)   3h53m
kube-system   pod/etcd-minikube                      1/1     Running   1 (7m31s ago)   3h54m
kube-system   pod/kube-apiserver-minikube            1/1     Running   1 (7m31s ago)   3h54m
kube-system   pod/kube-controller-manager-minikube   1/1     Running   1 (7m32s ago)   3h54m
kube-system   pod/kube-proxy-9pxz7                   1/1     Running   1 (7m32s ago)   3h53m
kube-system   pod/kube-scheduler-minikube            1/1     Running   1 (7m31s ago)   3h54m
kube-system   pod/storage-provisioner                1/1     Running   2 (6m2s ago)    3h54m

6. 로컬 컴퓨터에서 인스턴스의 클러스트를 제어할 수 있도록 해야함

이 설정을 할 파일들을 얻어내기

  • ~/.minikube/ca.crt
  • ~/.minikube/profiles/minikube/client.crt
  • ~/.minikube/profiles/minikube/client.key
1
cd .minikube
1
2
3
4
ls -l

13:07 ca.crt
13:07 ca.key

cat명령어를 사용해서 파일 내용을 확인하고, 내 컴퓨터에 새로운 파일을 만들고 복사 붙여넣기하기

7. 로컬 컴퓨터의 kubeconfig 설정

✅ 클러스터 추가

  • certificate-authority
  • server
  • name
1
2
3
4
- cluster:
    certificate-authority: "ca.crt 파일경로"
    server: "EC2 퍼블릭 IPv4 DNS":8443
  name: hyemin

✅ Context 추가

  • cluster
  • user
  • name
1
2
3
4
- context:
    cluster: hyemin
    user: hyemin
  name: hyemin

✅ User 추가

  • client-certificate
  • client-key
1
2
3
4
- name: hyemin
  user: 
    client-certificate: "client.crt 파일 경로"
    client-key: "client.key 파일 경로"

8. docker desktop이 참조하고 있는 kube config 파일 수정하기

윈도우 환경에서는 대부분 C:Users/사용자이름/.kube/config경로로 확인할 수 있음

9. 원격 저장소에 접근가능한지 확인하기

명령어를 입력하기 전에 docker와 쿠버네티스가 실행 중인지 확인할 것

1
kubectl get all -A

명령어를 입력했을 때 현재 내 컴퓨터에서 실행되는 kubectl들이 나온다면,

1
kubectl config current-context

를 사용하여 어떤 context가 실행되는지 확인할 것
docker-desktop으로 표시되면 다음 명령어를 사용하여 context 변경

1
2
3
kubectl config use-context "context 이름"

Switched to context

모든게 정상적으로 변경되었다면 다음 명령어로 다시 kubectl 확인해보기

1
kubectl get all -A
1
2
3
4
5
6
7
8
NAMESPACE     NAME                                   READY   STATUS    RESTARTS      AGE
kube-system   pod/coredns-5dd5756b68-ftz7r           1/1     Running   1 (52m ago)   4h39m
kube-system   pod/etcd-minikube                      1/1     Running   1 (52m ago)   4h39m
kube-system   pod/kube-apiserver-minikube            1/1     Running   1 (52m ago)   4h39m
kube-system   pod/kube-controller-manager-minikube   1/1     Running   1 (52m ago)   4h39m
kube-system   pod/kube-proxy-9pxz7                   1/1     Running   1 (52m ago)   4h39m
kube-system   pod/kube-scheduler-minikube            1/1     Running   1 (52m ago)   4h39m
kube-system   pod/storage-provisioner                1/1     Running   2 (51m ago)   4h39m

목록이 잘 출력된다면 배포 환경의 클러스터까지 제대로 설정된 것임

10. 웹 서버 접속 확인

http로 접근하면 다음과 같은 화면 렌더

웹서버확인-http

https로 접근하면 다음과 같은 화면 렌더 웹서버확인

11. 제대로 동작하는지 확인하기

1
ssh -i ./비밀번호파일.pem ubuntu@아이디.prgms-fullcycle.com

명령어를 통해서 다시 로그인한 다음에, service nginx status 명령어 입력해서 잘 동작하고 있는지 확인하기

1
2
3
4
5
service nginx status

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running)

오류…

해당 폴더가 존재하지 않음…

1
cd /ect/nginx/conf.d
1
cat notes.conf

12. 데이터베이스 잘 연결되었는지 확인

1
mysql -h 도메인 -u prgms -p
1
2
3
4
5
mysql -h hyemin.prgms-fullcycle.com -u prgms -p
Enter password: *****
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.5.5-10.6.12-MariaDB-0ubuntu0.22.04.1 Ubuntu 22.04

✅데이터베이스 확인

1
2
3
4
5
6
7
8
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| prgms_notes        |
+--------------------+
2 rows in set (0.09 sec)

✅데이터베이스 선택 후 테이블 목록 확인

1
2
mysql> use prgms_notes;
Database changed
1
2
3
4
5
6
7
8
mysql> show tables;
+-----------------------+
| Tables_in_prgms_notes |
+-----------------------+
| notes                 |
| users                 |
+-----------------------+
2 rows in set (0.01 sec)

✅노트 테이블 확인

1
mysql> describe notes;

노트 테이블 확인

✅유저 테이블 확인

1
mysql> describe users; 

유저 테이블 확인

✅유저/노트 테이블 내용 확인

1
2
mysql> select * from notes;
Empty set (0.01 sec)
1
2
mysql> select * from users;  
Empty set (0.01 sec)

13. AWS CLI 설치하고 로그인하기

https://aws.amazon.com/ko/cli/에서 운영체제에 맞는 방법으로 AWS CLI를 설치

window 환경에서는 다음 명령어로 설치여부 확인

1
2
3
aws --version

aws-cli/2.15.34 Python/3.11.8 Windows/10 exe/AMD64 prompt/off
1
2
3
4
5
6
aws configure

AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]: 
Default output format [None]: json

awd configure명령어를 입력하고 발급받은 access key로 로그인을 하면, 크리덴셜 파일이 어딘가에 저장됨

14. 접근이 잘 되는지 확인하기

1
2
3
4
5
6
7
8
aws ecr describe-registry

{
    "registryId": "숨김",
    "replicationConfiguration": {
        "rules": []
    }
}

15. 이미지 태그 붙이고 푸시하기

로그인

1
2
aws ecr get-login-password --region [지역] | docker login --userna
me [유저아이디] --password-stdin [비밀번호]
1
docker tag hello-world:latest 아이디/hyemin:latest
1
docker push !$

만약 !$ 명령어가 작동되지 않으면 다음 명령어 실행해서 푸시

1
docker push 아이디/hyemin:latest

16. 이미지 가져오기 위해 로컬에 있는 이미지 삭제

1
2
docker rmi hello-world:latest
docker rmi 아이디/hyemin:latest

17. 이미지 가져오기

1
2
3
4
docker run 아이디/hyemin:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

18. bucket에 이미지 업로드하고, 다운받기

aws s3 홈페이지에서 bucket에 이미지를 업로드하기

1
2
3
4
aws s3 ls

(...)
2024-04-02 13:00:40 hyemin-bucket

다음 명령어를 입력하면 내 bucket에 업로드해둔 망곰이 배경화면 이미지가 표시됨

1
2
3
aws s3 ls hyemin-bucket

2024-04-02 21:31:29     813211 manggom.png

다음 명령어를 입력하면 내 bucket에 업로드해 놓은 망곰이 배경화면을 다운받을 수 있음

1
aws s3 cp s3://[bucket 이름]/[파일 이름.확장자] [저장할 위치]
1
2
3
aws s3 cp s3://hyemin-bucket/manggom.png .

download: s3://hyemin-bucket/manggom.png to .\manggom.png

내 프로젝트 root 경로에 잘 저장됨

망곰파일

This post is licensed under CC BY 4.0 by the author.