처음으로
다른학교에가서 내 학교의 이름으로 경기를 했다는게
신선한 경험이라 좋았다

예상문제는 완벽하게 알고있었는데
막상 문제를 받아보니 생각보다 너무 많이 어려워서
어떻게 해야할지 감도 안잡혔고
예전부터 생각해왔던 내가 전공공부를 하는 방식에대해서
되돌아보게 되었다

당장 문제를 외우는게 아니라
내가 기능하나하나를 공부를 했다면 뭔가 달랐을지

대회가 시작되고서 긴장감속에서 느낀건
힘들게 공부해서 아쉬운게 아니라
내가 한건 공부가 아닌 문제푸는 방식을
단순히 다 외운거구나
외우는게 아니라 문제에 유연성에 따라
융통성있게 문제를 해결했다면 더 잘 해결했을거라고
몸소 느꼈다

다음에 참가하게 된다면
aws의 기능과 전체적인 원리자체를 이해해서
이해한것으로 유연히 문제를 해결하고
문제가 요구하는 바가 무엇인지 얻어내고 싶다

네트워킹 설정 생략 

 

프라이빗 서브넷 태그 설정

로드밸런서 타입을 internal로 지정할 경우 프라이빗 서브넷에 자동으로 로드밸런서가 생성되게 된다.
이 때 사용할 서브넷을 지정하기 위해 프라이빗 서브넷에 달아야 하는 태그는 아래와 같다.

kubernetes.io/cluster/[클러스터 이름] = shared
kubernetes.io/role/internal-elb = 1


퍼블릭 서브넷 태그 설정

로드밸런서 타입을 internet-facing으로 지정할 경우 퍼블릭 서브넷에 자동으로 로드밸런서가 생성되게 된다.
이 때 사용할 서브넷을 지정하기 위해 퍼블릭 서브넷에 달아야 하는 태그는 아래와 같다.

kubernetes.io/cluster/[클러스터 이름] = shared
kubernetes.io/role/internal-elb = 1

 

 

Basiton 서버에 필수도구 설치

1. kubectl for Kubernetes 1.29 설치

curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.29.0/2024-01-04/bin/linux/amd64/kubectl
chmod +x kubectl 
sudo mv kubectl /usr/bin/

 

2. eksctl 설치

curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
chmod +x /tmp/eksctl
sudo mv /tmp/eksctl /usr/local/bin

 eksctl version 해서 0.175.0 나오면 성성공 

 

3.helm 설치

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

Document DB

- 서브넷 그룹생성

서브넷 그룹 생성을 먼저해준다 protected 두 개 추가 

 

- 보안그룹 생성

 

- 클러스터 파라미터 그룹 생성

그냥하세요

 

- 진짜 DB 클러스터 생성

고급 옵션 눌러서 저거두개만 건들고 생성

 

- Secrets Manager

documt 자격증명 

이것도 그냥 하세요

 

ElastiCache - mancached ㄱ

기본사용자 설정 

개인 설정에서 기본설정 사용자 지정 protected 두개 설정 ㄱㄱ

보안사용자 설정 

보안그룹은 모든 트래픽 허용 

하지만 최소 권한으로 설정하라고 하면 

인바운드: 

사용자 tcp : 11211 

사용자 TCP : 11212  두개 설정

 

아웃바운드는 다 열기 

 

ECR

먼저 두개 프로젝트 두개 만들어준다

 

다1. key.pem이 있는 경로에서 ec2로 ssh 접속하기 
ssh -i "[키 이름]" ec2-user@[서버주소]

 
2. sudo su 권한 주기 ( 앞으로 명령어를 칠때 앞에 sudo를 안써도 되게 해준다 단, 접속할때마다 해줘야함 그냥 필요로 하면 될듯 )

 
3. 도커 설치 하기 
sudo yum install -y docker 


4.  도커실행 
sudo systemctl start docker
sudo systemctl enable docker

 

5. 권한주기

sudo usermod -aG docker $USER

ssh 접속 끊었다가 다시 접속

 


6. 공개과제 파일 인스턴스로 가져오기 
[중요] 이거 하기 전에 SSH 연결 끊어야 함 exit (윈도우에서 해야함)
scp -i "[키 이름]" "37.클라우드컴퓨팅(2023 지방).zip" ec2-user@[서버주소]:/home/ec2-user/cloud.zip
( 뒤에 있는 cloud.zip은 긴 파일 이름을 변경해준거임)


7.  zip 파일 풀기 [ 다시 ssh 접속해서 ec2 안에서 해줘야함 ] 

unzip cloud.zip

하고 app폴더 들어갔을때 docker..등등 뜨면 됨

 

 

8. 다시 aws ecr에서 푸쉬명령 따라서 쳐주기 

가서 이미지 생긴거 확인하면 ECR fin.

 

EKS(ㅅㅂ)

클러스터 만들기

보안그룹 = 모든 트래픽

클러스터 서비스 역할: IAM 에서 EKS cluster선택 (자동으로 들어감) 

엔드포인트 엑세스 : 프라이빗이라고 하면 프라이빗 아니면 그냥 퍼블릭으로 ㄱㄱ

 

노드그룹 만들기 

 

IAM 가서 EC2선택하고 

eksworkernodepolicy

eks_cni_policy

container Registry read only (퍼블릭으로 하면 좆됨)

권한 부여하고 만들기 

 

 

클러스터 - 컴퓨팅 - 노드그룹 추가

 

 

fargate 프로파일3개 구성 (이것도 컴퓨팅에있음)  (노드그룹 만들고 딜레이 생길때 하자)

이름도 마음대로 

포드실행역할에 있는 EKS 사용설명서 창 띄우고 IAM ㄱㄱ

 

IAM 에서 ec2 

pod 

container Registry read only

만들고

신뢰정책 편집에서 그 위에 창에서 

이거복사

리전 - 계정ID - 별 로 달고 생성 후 다시 fargate 들어가서 새로고침 누르면 등록이 됨

 

네임스페이스 : kube-system

레이블 일치 :

key - app.kubernetes.io/name

값 - aws-load-balancer-controller

 

생성! - (하나 만들면 다 될때까지 다른 프로파일 못만드니까 밑에 업데이트 부터 로드밸런서 사전준비하자)

 

fargate 2

이름 입력하고 위에서 했으니까 그냥 다음

네임스페이스 : kube-system

레이블 일치: 

key - k8s-app

값- kube-dns

 

fargate 3 (서비스)

네임스페이스 : default 

레이블일치는 안하고 다음 누르기 

 

--------------------------------------------------

IAM 가서 엑세스키 만들기 

계정 들어가서 기타 누르고 만들면 액세스키 생성티비 그 화면 띄워놓고 cmd ㄱㄱ 

로드밸런서 사전준비 부터 하자 

 

 

만약 api version 관련 오류가 발생하면 aws cli가 최신 버전인지 확인해보자

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/getting-started-install.html

 

 

로드밸런서 사전준비 --- 액세스키 만들고 

1. 아이디 - 비밀키 - 리전 - json 으로 넣기 

 

aws configure

 

2. 업데이트 - 지역과 , 네임은 클러스터 이름으로 

aws eks update-kubeconfig --region ap-northeast-2 --name wsi-cluster

 

로그인 제대로 됐는지 확인 

aws sts get-caller-identity

 

--------------

3. kubectl 네임스페이스에 있는 pod를 확인해서 권한이 있는지 확인

kubectl get pods -n kube-system

이러면 된다

4.제공업체 생성 : 만약에 오류뜨면 config 들어가서 리전 잘 못 쳤는지 확인 

cluster_name=[클러스터이름]
oidc_id=$(aws eks describe-cluster --name $cluster_name --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)
eksctl utils associate-iam-oidc-provider --cluster $cluster_name --approve

 

5.정책만들

curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.5.4/docs/install/iam_policy.json
aws iam create-policy  \
    --policy-name [원하는정책이름]  \
    --policy-document file://iam_policy.json

 

쳐서 나온 arn을 복사후 알아서 잘 가지고 있기

 

7. name에는 대문자 들어가면 안되고 대시와 소문자만

쿠버네티스 안에 역할을 만들고 aws iam 역할을 연결해서 aws 리소스에 접근할수있도록 하는것

eksctl create iamserviceaccount \
  --cluster=$cluster_name \
  --namespace=kube-system \
  --name=[만들기 원하는 쿠버네티스 서비스 계정 이름] \
  --role-name [만들기 원하는 IAM 역할 이름] \
  --attach-policy-arn=[위 명령어에서 생성된 정책의 ARN] \
  --approve

sample

eksctl create iamserviceaccount \
  --cluster=$cluster_name \
  --namespace=kube-system \
  --name=aws-load-balancer-controller \
  --role-name EKSloadBalancerRole
  --attach-policy-arn=arn:aws:iam::345983683754:policy/eks-load \ 위에 arn
  --approve

네임과 롤네임 중복해도 된다 (그렇게하자)

 

 

8.

helm repo add eks https://aws.github.io/eks-charts
helm repo update eks

 

9.

helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
  -n kube-system \
  --set clusterName=$cluster_name \
  --set serviceAccount.create=false \
  --set serviceAccount.name=[이전에 만든 쿠버네티스 서비스 계정 이름] \
  --set vpcId=[생성될 로드밸런서를 설치할 AWS VPC ID]

이전에 만든 쿠버네티스 서비스 계정이름은 위에서만든 name

vpc아이디는 콘솔가서 ID 복사

 

클러스터에서 리소스 들어가서 배포 들어가면 

있는거 확인하고 포드 생길때까지 대기 

 

 

이것도 가능함 

kubectl get deployments -n kube-system

 

else 만약 포드가 잘 안올라간닫면..

helm uninstall aws-load-balancer-controller -n kube-system

7번부터 다시 ㄱㄱ (대신 역할이름 전부다 바꾸자 오타좀 안나게 해라 시발) 

 

뼈대 완성 이제 서비스를 올려보자 🦴

 

 

1.아까 위에서 했던건데 이름이랑 rolname 다르게 해야함 

arn은 재탕하면 안되고 콘솔가서 IAM - 정책

document 선택하고 모든 ) 나열과 읽기 체크 리소스는 모두 누르고 권한 더 추가 

해서 elasticahe 누르고 나열 읽기 리소스 모두 권한더 추가 

secreat 누르고 나열 읽기 리소스 모두 권한 더 추가 

rds도 

만약에 대회에서 json으로 주면 복붙하자 위에 저거 누르고

 

만든 정책 눌러서 arn 복사해서 밑에 코드에다가 넣자 

name에 대문자 안쓰게 조심

eksctl create iamserviceaccount \
  --cluster=$cluster_name \
  --namespace=default \
  --name=[만들기 원하는 쿠버네티스 서비스 계정 이름] \
  --role-name [만들기 원하는 IAM 역할 이름] \
  --attach-policy-arn=[위 명령어에서 생성된 정책의 ARN] \
  --approve

 

만약잘못하면 이 명령 수정하고 

kubectl rollout restart 서비스이름

이때 서비스 이름은 deply.yaml 들어가면 name에 있다

 

블로그에 서비스.인그레스.디플로이먼트 다 저장 

2.

 

nano deployment.yaml 들어가서 

위에서 친 name을 

yaml 파일안에있는 serviceAcconutName에 넣기 

image는 ECR의 이미지 URL을 복사해서 넣기 

c+o

엔터

c+X

 

kubectl apply -f deployment.yaml 뒤에는 아까 수정한 파일이름 kubectl delete -f deployment.yaml 

파일 수정한걸 적용하는것 

 

콘솔가서 클러스터에 

확인

 

3. 

kubectl apply -f service.yaml

kubectl apply -f ingress.yaml

 

 

이러면 자동으로 생긴것을 볼수 있음 

기다리면 프로비저닝중이 활으로 될거임

 

DNS 복사해서 웹브라우저에 넣고 /whoareyou 해서 server identifrier 나오면 성성공!

씨발~~~~ 성공티비 당장 대회를 박차고 나가자 기모띠 

 

제 2과제는 

빌드 -> 도커 -> ecr -> 이미지 -> codeplo -> ecs 

배포전략 2개

블루그린배포 - 두개 띄워서 문제 있으면 예전걸 쳐 지움

롤링배포 - 두개 띄워서 문제 있으면 하나하나씩 예전걸 쳐 지움 

 

s3

기본설정으로 만들기 front

ecr

기본설정으로 만들기 backend

 

codecommit 

레포지토리 기본값으로 두개 생성 하기 

 

IAM

에서 EC2역할 - poweruser

ec2에서 역할 연결 

 

ec2에 ssh 접속 

ssh -i "[키 이름]" ec2-user@[서버주소]

2. sudo su 권한 주기 ( 앞으로 명령어를 칠때 앞에 sudo를 안써도 되게 해준다 단, 접속할때마다 해줘야함 그냥 필요로 하면 될듯 )

3. 도커 설치 하기 
sudo yum install -y docker

4.  도커실행 
sudo systemctl start docker
sudo systemctl enable docker

4. 공개과제 파일 인스턴스로 가져오기 
[중요] 이거 하기 전에 SSH 연결 끊어야 함 exit (윈도우에서 해야함)
scp -i "[키 이름]" "[파일]" ec2-user@[서버주소]:/home/ec2-user/cloud.zip
( 뒤에 있는 cloud.zip은 긴 파일 이름을 변경해준거임)

5. zip 파일 풀기 [ 다시 ssh 접속해서 ec2 안에서 해줘야함 ] 

unzip [해당 zip파일]

6. 다시 aws ecr에서 푸쉬명령 따라서 쳐주기 

sudo dnf update -y
sudo dnf install docker -y
sudo systemctl enable docker
sudo systemctl start docker
sudo usermod -aG docker $USER

 

backed 사전준비 끝

 

 

IAM 

본인 사용자 클릭 - 보안자격증명 - HTTPS git 암호 생성 후 메모장에 잘 적어두자 

 

codecommit - frontend

1.리포지토리 복제 명령어 복사후 ec2에 붙여넣기 

안되면 git 설치 명령어 [sudo yum install git]

 

2.ID랑 비번 위에서 적은 메모장 그거 붙여넣기 

 

3. [중요] 이거 하기 전에 SSH 연결 끊어야 함 exit (윈도우에서 해야함)
scp -i "[키 이름]" "배포파일" ec2-user@[서버주소]:/home/ec2-user/

 

4. mv 배포파일 front 

mv index.html front

 

cd front ( 프론트 레포에서 ) 

 

5. git add .

 

6. git commit -m "원하는것"

 

7. git push origin

 

8. 콘솔가서 리포지토리 들어갔을때 index.html  있으면 성성공! 안되면.. 씨발을 외치자 

 

codecommit - 파이프라인 - 시작하기 - 파이프라인 생성 

아무것도 안건드리고 이름만 만들어서 다음

소스 공급자 -> codecommit -> front 고르기 -> mester

빌드 건너뛰기 

배포 공급자 -> s3 -> 버킷 s3 -> 압축풀기 허용

확인하고고 생성

 

s3가서 확인하기 

front 레포에 index.html 있으면 성공 

 

이제 backend 해야하는게 괜찮다 그러면 시발 ECS가 필요하다 힝힝구리팡팡씨발

 

ver1. ECS (롤링배포전략) 

1.클러스터 이름만 넣고 생성 (fargate 이미 설정 되있으니까)

 

2. IAM 역할 생성 ECS - service task 

[문제에서 제공한 역할 제공하자 안주면.. 씨발을 외치자]

- Registry Read only (도커 올린 레포 가져오기?)

-S3 read only (버킷 레포 가져오기?)

-CloudWatchfullaccess (로그 쓰기?)

선택 후 생성 

 

3.태스크 정의 생성 

 태스크 역할2개 위에서 만든거 똑같이 넣어주기 

 

컨테이너 -1 설정  

backend 아름 알아서 박고 - ecr 들어가서 이미지 URL 복붙해서 넣고 - 컨테이너 포트 8080 

생성 

 

4. EC2 - 대상그룹 

IP 주소 선택 - 이름 알아서 - 프로토콜 포트 8080 설정

 

-상태검사 설정에서

상태검사 경로 : 문제 제공 ~ 넣으면 여기로 뜨개게 해야한다 

EX) /api/hello

재정의 누르고 8080

 

스킵 후 만들기 

 

5. 로드밸런서 ALB

vpc 선택 -> 서브넷 퍼블릭 두개 선택 

 

보안그룹 생성하고 와서 적용

- 인바운드 : HTTP 0000

- 아웃바운드 : 모든 트래픽 0000

 

리스너 및 라우팅

80에 대상그룹 선택 

 

생성

 

6. ECS 클러스터 가서 서비스 생성 

-배포구성

서비스 누르고 

패밀리는 아까 만든거 

서비스 이름은 아무거나 

원하는 태스크는 ( 고가용성이라는 단어가 나오면 4)

 

-네트워킹 

프라이빗 두개 넣고 

새 보안그룹 만들기 

인바운드 : 사용자 지정 TCP 8080  0000

퍼블릭 IP 끄기 

 

-로드밸런싱

alb 선택 

컨테이너 만든거 

기존 로드 밸런서 사용

기존 리스너 사용

기존 대상그룹 사용 

 

생성

 

로드밸런서에서 DNS 복사 후 

아까 설정한 상태경로 뒤에 추가 해서 웹에서 제대로 되는지 보자!!!

 

이제 cloud front와 밑에 그거 backend 네모 하면 끝임 시발~~

 

7. backend 작업 

1.ssh 접속

 

2.codecommt에서 리포지토리 -> 리포지토리 복제 누르고 명령어 입력 

위에서 front 할때 만든 git 자격증명 (메모장에 넣은거) 넣기 

 

3. 공개과제 파일 인스턴스로 가져오기 
[중요] 이거 하기 전에 SSH 연결 끊어야 함 exit (윈도우에서 해야함)
scp -i "[키 이름]" "[파일]" ec2-user@[서버주소]:/home/ec2-user/cloud.zip

 

3.backend 배포파일 복사 [대회에서 줌]

cp -r [배포파일]/* [깃클론해서만들어진 레포이름]/

 

[깃클론해서 만들어진 레포 경로]

5. git add .

 

6. git commit -m "원하는것"

 

7. git push origin

 

8. 콘솔가서 리포지토리 들어갔을때 배포파일이 있으면 성공 안되면 씨발을 외치자 

 

이제 그 그림에서 두번째 세번째꺼 하는거임

 

8. codepipeline

파이프라인 생성 - 이름만 설정하고 - 소스공급자는 codecommit 선택후 설정 - 빌드는 이번엔 설정해야한다 AWS codebuild 선택 

 

프로젝트 생성 (창) - 추가 구성에서 권한이 있음 체크 - vpc 선택 - 서브넷은 프라이빗 a,b두개

- 보안그룹은 디폴트 박고 설정검증 - 환경변수 파라미터 싹 지우기 - buildspec 파일사용 - 코드파이프라인으로 계속 

 

다음 누르고 배포 공급자는 ECS 

클러스터랑 서비스 이름 선택 

이미지 정의에 뭐시기 yml 파일안에 있는 files:에 할당된그거 복사해서 넣기  사실 씨발 배포파일을 줄지 뭘지 모르겠음

 

파일 수정

password stdin : 계정ID 넣을곳에 다 넣기 

registry ~ : ECR URI 바꾸기 

printf 에서 수정 : 태스크정의 - 컨테이너 이름 넣기 

c + o 하고 엔터  (저장) 

c + x ( 나가기 )

 

[깃클론해서 만들어진 레포 경로]

 git add .

 

 git commit -m "원하는것"

 

 git push origin

 

생성

 

오류로그에서 뜬 역할이름을 iam 에서 선택하고 정책연결

-EC2contianer Registrypullaccess

 

그리고 재시도 해보자 씨발 아시발 아 좆같은거 씨발 조프베이조스 뒤져라 미친새기 ㅆ발련이 좆같은 플랫폼을 쳐 만들어 ㅁㅊ넘아 

 

9. cloud front

 

1. 배포생성 - origin domain (어디에 연결할지) : s3 - 원본액세스 : 원본액세스제어 - 

orgin access control : creat 그냥 하셈 - 정책복사 하고 버킷 권한 가서 버킷정책편집 누르고 다 지우고 복사한거 붙여넣기 - 뷰어 프로토콜 rediact - 캐시 정책 disabled - 보안보호 비활성화 - 생성

 

끝이다 ~ 해방이다 ~ 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

VPC

- 서브넷 설정

각각 퍼블릭 서브넷은 생성후 서브넷 설정편집에서 퍼블릭 IPv4 자동할당 활성화 

 

- 라우팅 테이블 생성

문제에서 서브넷에 할당되는 라우팅 테이블은 총 3개 (퍼블릭은 tag 가 같은걸로 봐서 하나의 라우팅 테이블을 쓰는 걸로 추정) 

 

- igw 생성

 

인터넷 게이트웨이 생성후 퍼블릭 라우팅 테이블(wsi-public-rtb)에 가서 라우팅 편집을 누르고 인터넷 게이트 웨이를 추가해준다.

 

- nat 게이트웨이 생성

 

nat게이트웨이는 private 서브넷 접속이 퍼블릭에 있는 nat 게이트 웨이를 통해서 나가도록 만드는 것이니까 

문제에서 private subnet 조건에 있더라도 꼭 퍼블릭에 만들자

 

EC2

- bastion서버 

 

ec2의 보안그룹설정은 vpc 탭에 들어가서하는게 간편하다 ( outbound 설정이 ec2에서 바로 못 하기 때문)

 

IAM 에서 역할 생성후 인스턴스에서 역할 업데이트 

 

ECR

wsi-about, wsi-projects 두 개 만들기 

 

여기서부터는 윈도우 터미널에서 진행할거라 mac 은 잘 모른다... 

 

1. key.pem이 있는 경로에서 ec2로 ssh 접속하기 

ssh -i "[키 이름]" ec2-user@[서버주소]

 

2. sudo su 권한 주기 ( 앞으로 명령어를 칠때 앞에 sudo를 안써도 되게 해준다 단, 접속할때마다 해줘야함 그냥 필요로 하면 될듯 )

 

3. 도커 설치 하기 

sudo yum install -y docker 

 

4.  도커실행 

sudo systemctl start docker
sudo systemctl enable docker

4. 공개과제 파일 인스턴스로 가져오기 
[중요] 이거 하기 전에 SSH 연결 끊어야 함 exit (윈도우에서 해야함)

scp -i "[키 이름]" "37.클라우드컴퓨팅(2023 지방).zip" ec2-user@[서버주소]:/home/ec2-user/cloud.zip
( 뒤에 있는 cloud.zip은 긴 파일 이름을 변경해준거임)

 

5. zip 파일 풀기 [ 다시 ssh 접속해서 ec2 안에서 해줘야함

좀 어지러워 보이지만 cd와 ls를 이용해서 잘 about 까지 잘 들어가보자...

unzip [해당 zip파일]

 

6. 다시 aws ecr에서 푸쉬명령 따라서 쳐주기 

 

이렇게 하면 ECR 까지 완료했다 

나는 채점해본 결과 ECR 까지는 만점이였고 그 뒤는 사실 안풀었다 ㅋㅋ 

 

 

인스턴스 ssh 접속하는 법 
ssh 사용자명@아이피 -i 키파일이름
ex) ssh ec2-user@10.0.0.8 -i key.pem

접속하고 나서 도커 다루는 법 
가장 먼저 sudo su (귀찮은 sudo 붙이기 없이 명령어 사용가능)
^ 매번 들어올때마다 해줘야함

sudo yum install -y docker 

도커 설치 [ec2]

 

sudo systemctl start docker

sudo systemctl enable docker

도커실행 [ec2]

 

공개과제 파일 인스턴스로 가져오는 법 
[중요] 이거 하기 전에 SSH 연결 끊어야 함 exit (윈도우에서 해야함)

scp -i "KEYYY.pem" "37.클라우드컴퓨팅(2023 지방).zip" ec2-user@[서버주소 ec2]:/home/ec2-user/cloud.zip

 [local to ec2] ( 뒤에 있는 cloud.zip은 이름을 변경해준거임)

 

unzip cloud.zip

압축해제 [ec2] 

 

sudo docker build . --tag about:latest

[ 도커빌드 (이미지만들기) ] ec2

 

sudo docker run -d --rm -p 5000:5000 about:latest

[ 도커 이미지 실행 ] ec2

 

sudo docker ps -a

[ 실행중인 도커 컨테이너 목록 보기 ]

 

sudo docker rm -f [컨테이너 ID]

[ 컨테이너 종료 ]

EC2 인스턴스 생성 (Bastion A, Basiton B) 

문제에서는 Bastion_A 여서 솔직히 이름이 틀리긴 했는데 그냥 연습삼아 하는거니까 알아서 이해하길 바람..

 

Bastion A, Service A끼리 같은 키로 

Bastion B, Service B끼리는 같은 키로 만들라고 했으니까 키는 총 KEY_A 와 KEY_B pem을 만들어서 적용해준다.

 

Bastion A는 VPC A의 Public subnet 에 만들어준다 

퍼블릭 자동 할당 활성화

 

이번 문제에서 보안그룹은 총 5개 ( 인스턴스에 각각 하나씩 , ALB용 하나 )

다른 대역의 VPC끼리는 같은 보안그룹 설정이 불가해서 Basiton A와 B가 성질이 비슷해도 따로 만들어줘야함 

 

그래서 Bastion A, B의 보안그룹 설정은 SSH 접속이 가능하게 만들어준다 

 

EC2 인스턴스 생성 (Service A, Service B)

Service A의 key.pem은 Bastion A와 같은 KEY_A 

service B의 key.pem은 Bastion B와 같은 KEY_B

 

 

Service 보안그룹 설정하다가 문제랑 그림이랑 다르고 ALB도 달라서 그냥 던짐 

2023 글 쓰는걸로 ^-^

VPC 생성은 딸깍 이라 제외

서브넷 연결 설정

퍼블릭 서브넷들은 서브넷 설정 편집 -> 자동 할당 활성화 해준다

 

 

인터넷게이트웨이 설정

igw 는 VPC에 각각 하나씩 만들고 연결해주고 

라우팅 테이블 -> 퍼블릭A,B 라우팅테이블에 라우팅 설정 편집 ->로컬은 냅두고 0.0.0.0/ + igw 설정 

 

 

라우팅테이블 설정

라우팅 테이블은 기본적인 테이블을 제외하고 총 서브넷에 각각 하나씩 4개를 만들어준다

 

NAT 게이트웨이 설정

NAT 게이트웨이는 프라이빗을 위한 통로이다 

그렇기 때문에 프라이빗 말고 퍼블릭에 만들어줘야한다. 

퍼블릭 서브넷 A,B에 만들어주자.

 

PCX (피어링) 설정

요청자에 A VPC 를 넣고 수락자에 B VPC 를 넣고 
내 계정과 현재 리전 을 선택해준다.
설정을 마치고 피어링 연결 생성 을 누르면 Peering 상태에 수락 대기중 이라는 글이 뜨는데 

해당 VPC Peering을 선택하고 작업 버튼을 눌러 요청 수락을 눌러준다.

 

 

VPC_A의 아이피를 복사해서 

public b, private b 라우팅 테이블에 라우팅 편집에 들어가서 붙여넣고 -> 피어링 연결에 생성된 피어링을 선택해준다  

 

VPC_B의 아이피를 복사해서 

똑같이 public a, private a에 설정해준다

 

선배님이 알려주신 비유는.. 

피어링을 생성한것 = > VPC끼리 연결해주는 다리를 놓은것

라우팅테이블에 설정해준것 = > 다리 놓았다고 홍보한것 

ㅋㅋㅋㅋ 하나도 몰랐는데 알아먹음.

 

 

남은건 ec2, 피어링,웹서버구축 등등등.. 이 남았는데 문제가 뭐 이래 오류가 많은건지 ec2 하다가 던짐 2023 하러 감.

ec2 초반 글은 있음.....

ec2 - 로드밸런서- 로드밸런서선택 - Application Load Balancer 생성  - vpc , 매핑 

로드밸런서 만들때는 필요한 보안그룹을 만들어야해서 설정해줄거임.

 

인바운드 규칙 설정 

보안그룹 설정하고 다시 로드밸런서 설정으로 돌아와서 선택 

* 보안그룹이 안뜬다면 보안그룹 옆에있는 새로고침 누르기 

 

 

리스너 및 라우팅 설정

그룹을 설정해줘야하는데 이때 그룹이란, 누구누구한테 로드밸런싱을 할지 묶어주는게 그룹 

 

대상 그룹 생성 클릭 해서 vpc 확인후 선택 

아래에 보류중인것으로 포함 클릭 -  대상그룹 생성하면됨 

 

다시 돌아와서 새로고침 한번하고 대상그룹 선택 후 로드밸런서 생성 

* vpc 들어가서 작업 누르고 DNS 설정 둘다 켜져있는지 확인 

 

로드밸런서가 활성화 됐으면 원래 쓰던 myvpc-sg 클릭

인바운드 규칙 편집 - 새 규칙추가 -

새로 만든 보안규칙 선택 

- 이 보안규칙대로만 접속을 받겠다는것. 

 

로드밸런서 DAN  복사해서 웹 브라우저에 붙여넣고 새로고침 할때마다 

web01, web02, mydb에 접속이 되는걸 볼수있다. 

이제 cpu부하테스트 할거임 

stress 라고하는 패키지를 깔아서 테스트 할거니까

- web02에서 stress 깔아주기 

yum -y install stress

 

-stress 버전 확인 

stress --version

 

이미지 만들거니까  인스턴스로 가서 web02 중지하고 이미지 생성

 

이제 추가 설정을 할것이다.

 

  Amazon Simple Notification Service - 주제 - 주제생성 

 구독생성 - 프로토콜 (이메일) - 이메일 입력후 구독생성

이메일 들어가보면 메일이 와있을건데 confirm subscription 클릭 

 

이미지 다 만들었으니까 ec2에서 web02 인스턴스 시작 누르기 

 

알람받기 설정하기.

web02 작업 - cloudwatch 경보관리 - 경보생성 - 경보알림에서 위에서 만든 주제 선택 

 

 

5분마다 알람주겠다라는거임 cpu 부하테스트 할거니까 유형도 cpu 선택하고 생성 

 

 

다시 터미널로 접속할건데,

중지했다가 다시 시작했으니까 ip 바뀌었을거니까 다시 접속

- stress가 5분 안팍이면 알람이 안오니까 timeout을 500초로 해서 stress 주기 

stress --cpu 1 --timeout 500

 

 

좀 시간 지나서 cloudwatch 가면 ec2가 화나있음

 

Auto Scaling을 해주면 부하분산을 해주는데 안해줬으니까 지 혼자 견디고 있는것..

견디다 견디다 죽을수도있음 

그래서 Auto Scaling을 해볼거임.

 

템플릿 만들기 

ec2 페이지 - 시작 템플릿 

템플릿 : 설정정보를 저장

이미지 : 모든것을 저장

차이가 있음 

 

시작 템플릿 생성 - Auto Scaling 지침 체크 

내가 서버를 만드는게 아니라 얘가 서버를 만들어줄거기때문에 이미지를 만들어줘야함 AWS에서 주는거 써도 되긴하는데

아무것도 안되어있으니까 내가 세팅해준 이미지 선택 

 

인스턴스 유형 선택 - 키페어 선택 (ssh 접속해서 부하줄거니까) -보안그룹 선택 후 템플릿 생성 

 

ec2 로드밸런싱 메뉴 - 대상그룹 클릭 - 대상에서 아까 만든 인스턴스 3개 등록 취소 

 

vpc - 서브넷 들어가서 web01,web02 둘다 퍼블릭 IPv4 주소자동할당 되있는지 확인 -안되어있으면 편집해서 선택 

퍼블릭 ip를 안주면 외부에서 못들어옴 (고립) 

 

7단계라 번호로 정리하겠음 

1. ec2 - Auto Scaling 그룹 - 그룹생성 - 아까 만든 템플릿 선택 

2. vpc 선택 - 가용영역 2개 다 선택 (가상서버들이 확장되는 영역 ) 

3. 기존 로드밸런서 연결 선택 - 대상그룹선택에서 아까 만든 로드밸런서 선택 - 상태확인 시간을 100초로 수정 ( 부하확인 시간 100초가 넘었는데도 부하다? 그럼 그때 서버증설 즉 테스트 하려고 하는거임 진짜 부하인지 잠깐인지 하는거 보는거임 ) 

cloudwatch 내에서 그룹지표 수집 활성화 해야지 cloudwatch에서 모니터링 가능하니까 선택 

4. 그룹크기 (가상서버의 숫자) 원하는 용량 2로 설정 - 최소용량 2, 최대용량 6으로 설정 (아무리 부하가 와도 6개 이상 증설 불가능)

Auto Scaling 종류

이벤트 기반 : cpu가 얼마이상 되면 서버 증설 

시간기반 : 일정을 딱 정해줌 ex) 교육서버같은거는 개강일에 부하가 패턴처럼 진행되니까 그때만 오토스케일링 켜지도록 설정하는거 

대상 추적 크기 조정 정책 선택 - 인스턴스 워밍업 100초로 설정 

5. 알림추가 - 아까 만든거 클릭 

6. 태그추가 (이름) 

이건 사실 알아서 ㅎㅎ

7. 이건 그냥 검토라 생성하면 된다.

 

생성후에 ec2 인스턴스 클릭해서 보면 서버가 자동으로 생성되는걸 볼수있음 

 

인스턴스 - Auto Scaling서버 중에 하나를 종료하고 조금 기다리면 또 다시 생겨남

아까 최소설정한게 2여서 하나가 장애가 생겨도 다시 생겨나는것. ( 컨테이너도 같음 ) 

 

 

이제 부하를 줘서 자동으로 늘어나는걸 볼거임

만들어진 서버 ssh 접속하기 

 

얘네는 stress 깔려있는 이미지 따서 만든거라 깔려있음 이미 

stress --cpu 1 --timeout 500

 둘다 스트레스 주고 기다려보면 

 

 

원래 두개 말고 더 늘어나는걸 볼수있음 최대 6개까지만 늘어나고 이메일도 온다 

좀 더 기다리면 줄어들기도 함 

개별서버를 닫으면 증식 되는데 그룹을 삭제하면 아예 삭제됨

 

 

모니터링해보기 ~-~

Bastion Host 는 보안을 위해서, 쉽게말하면 특정host만 들어갈수있도록 만드는거다

나는 web03을 pubilc에 있는 web02만 접속할수있도록 만들거 

참고로 프라이빗 서브넷에는 mydb라는 db도 있음 이전글 확인 

만약 터미널에서 접속하려고 한다며 

내 터미널에서 myweb02에서 접속을 하는 절차를 걸쳐야만 web03에  들어갈수있는거임 

 

먼저 보안그룹(방화벽)을 구축해줘야한다

vpc 잘 선택

 

 

이따가 테스트를 할거라서 들어갈수있는 "인바운드 규칙"을 추가해줄거임 

 소스유형을 사용자 지정으로 바꾸고 

우리는 web02만 들어올수있게 할거니까 ec2 메뉴에 가서 web02의 프라이빗 ip를 복사해서 

소스메뉴에 CIDR 형식으로 넣어준다 

규칙추가를 눌러서 하나 더 추가

 

ec2가서 접속을당할 (프라이빗서브넷에 있는) ec2 선택 - 작업 - 보안 - 보안그룹 변경하고 위에서 만든거 선택 

 

 

vpc - 라우팅 테이블 -라우팅테이블 클릭 - 서브넷연결 클릭

연결이 되있는게 public

없는게 private

 

* 위처럼 연결 확인해주고 터미널에서ssh 접속으로 web 01에서  my db로 접속하려고 하면  접속이 안되는걸 볼수있음

 

 

 

이제 web02로 접속 후 ping -c 10 10.0.1.84 

10.0.1.84는 mydb의 사설ip

-c 10 은 10번만 ping 날리라고 제한 한거임 

나는 termius를 사용한다 늘..^vY

 

아주 잘됨 ^v^

근데 myweb01에서 하면 ping이 안날려질거임 

 

mysql -h 10.0.1.84 -uhr -p

입력후 비번 입력 하면 접속 됨 10.0.1.84는 위에도 말했듯이 mydb의 privat ip,즉  사설 ip임 이제부터 설명 생략

 

 

*  이때 보안그룹에서 설정된 ip를 지워도 접속한 상태에서는 아무문제가 없어보이는데 

exit 한다음 다시 접속하려하면 안됨. 

하지만 ping은 날릴수있음 인바운드 규칙은 삭제안했기때문.

 

이런 과정으로 설정해주면 원하는 ec2만 private 서브넷에 자원에  접속할수있다 

 

 

 
 
Scale in(줄이는거) <-> out (늘리는거) : 주로 웹서버 ,
Scale up(늘리는거) <-> down(줄이는거) : 주로 DB서버 개수를 늘리는게 아니라 요청수가 많아지면 스펙을 올려주는거 안쓰면 down하면 되니까.
 
 
테이블 생성 ( 정형화되있는 테이블이 아님 관계형 DB랑 다름 )
 

 Tag 클릭 - 표 항목 탐색 - 항목 생성 
 

 
새속성 추가 누르고 속성 추가
속성이름  
문자열 추가 - item_category
숫자 추가 - price
 
값넣기 
파티션키 - 101ABS
정렬 키 - 2023-11-07
item_category - Storagebox
price - 50000
 
관계형데이터베이스
- 정해준 형태의 알맞은 데이터를 넣어야함 ex ) 정해진 형태는 숫자형인데 문자 넣으면 에러남.
- null도 데이터로 인정함 
 
DynamoDB
- schema 없음 (구조가없음) 특정한 정해진 곳 아니면 그 뒤는 아무렇게나 넣어도 됨 
 
하나의 컬럼에 데이터를 다 넣을때 관계형은 숫자로 지정되어있다면 계속 숫자만 넣어야하지만 Dynamo는 그렇지 않다 문자넣고 숫자넣고 아무거나 넣어도 에러안남.
 
 
선택 - 작업 - 항목복제

 
그냥 아무렇게나 넣어서 데이터 어떻게 넣는지 해보기 
불편하니까 스크립트로 데이터 넣는거 하려고 이거 포스팅 하는거임.
 
IAM - 정책 - 정책생성 - 서비스선택에서 dynamodb 선택 - 쓰기 선택 - batchwriteitem, putitem 선택 - 리소스는 "모두" 선택

 필터에서 고객관리형(유저가만든거) 볼수있음 
 
역할 - 역할생성 - 사용사례 Lambda 선택 - 고객관리형으로 바꿔서 내가 만든거 선택 -  이름 설정- 역할생

 

 
선택후 들어가서 정책연결 - AWSlambdabasicExe...선택 (aws에서 lambda 사용할수있는 권한)

내가 만들었던거랑 AWS 있으면 준비 끝
내가 lambda함수를 생성하면 dynamo가 item를 저장할수있는 권한을 구성한 
 
서비스 - 컴퓨팅 - Lambda - 함수생성 - 

스크립트에 맞는 런타임 선택 - 기본실행역할변경 선택 - 기존역할사용 클릭후 위에서 만든 역할 선택- 함수생성

#Lambda Function for Multiple row insert 
import boto3

def lambda_handler(event, context):
    client = boto3.resource('dynamodb')
    table = client.Table('Customer-Transaction')
    
    with table.batch_writer() as batch:
        batch.put_item(
            Item={
                'customer_id' : '101ABC',
                'transaction_date' : '2023-11-12',
                'item_category' : 'Drawer',
                'price' : 600000
            }
        )
        batch.put_item(
            Item={
                'customer_id' : '103RAX',
                'transaction_date' : '2023-11-12',
                'item_category' : 'Chair',
                'price' : 275000
            }
        )
        
        batch.put_item(
            Item={
                'customer_id' : '304AAC',
                'transaction_date' : '2023-11-12',
                'item_category' : 'Storagebox',
                'price' : 50000
            }
        )

 
샘플코드 지우고 코드에 스크립트 넣기 

다 했으면 Deploy 선택 
 

 

- 실행해보고 데이터가 추가 안됐다면 좀 기다려보자 

처음에 추가가 안되서 에러인줄 알았는데 다음날에 보니까 추가되어있었음

+ Recent posts