문제파일을 받아보니 아래와 같은 파이썬 코드가 있었는데 

from math import lcm
from Crypto.Util.number import*

with open('flag.txt', 'rb') as f:
    flag = bytes_to_long(f.read().strip())

oops = getPrime(20) #e
p1 = getPrime(512)
p2 = getPrime(512)

haha = (p1-1)*(p2-1) #phi
crazy_number = pow(oops, -1, haha) #d
discord_mod = p1 * p2 #n
hehe_secret = pow(flag, crazy_number, discord_mod) #c

print('admin =', discord_mod)
print('hehe_secret =', hehe_secret)
print('crazy number =', crazy_number)

주석처리를 하면 이렇게 된다 이때 oops는 e가 되는데 getprime(20)이면 e값이 20자리 소수로 너무 큰 값이된다 

그래서 이때 wienr attack 을 사용하게 되면 flag 값이 나온다 

 

'''
Created on Dec 22, 2011

@author: pablocelayes
'''

def egcd(a,b):
    '''
    Extended Euclidean Algorithm
    returns x, y, gcd(a,b) such that ax + by = gcd(a,b)
    '''
    u, u1 = 1, 0
    v, v1 = 0, 1
    while b:
        q = a // b
        u, u1 = u1, u - q * u1
        v, v1 = v1, v - q * v1
        a, b = b, a - q * b
    return u, v, a

def gcd(a,b):
    '''
    2.8 times faster than egcd(a,b)[2]
    '''
    a,b=(b,a) if a<b else (a,b)
    while b:
        a,b=b,a%b
    return a

def modInverse(e,n):
    '''
    d such that de = 1 (mod n)
    e must be coprime to n
    this is assumed to be true
    '''
    return egcd(e,n)[0]%n

def totient(p,q):
    '''
    Calculates the totient of pq
    '''
    return (p-1)*(q-1)

def bitlength(x):
    '''
    Calculates the bitlength of x
    '''
    assert x >= 0
    n = 0
    while x > 0:
        n = n+1
        x = x>>1
    return n


def isqrt(n):
    '''
    Calculates the integer square root
    for arbitrary large nonnegative integers
    '''
    if n < 0:
        raise ValueError('square root not defined for negative numbers')
    
    if n == 0:
        return 0
    a, b = divmod(bitlength(n), 2)
    x = 2**(a+b)
    while True:
        y = (x + n//x)//2
        if y >= x:
            return x
        x = y


def is_perfect_square(n):
    '''
    If n is a perfect square it returns sqrt(n),
    
    otherwise returns -1
    '''
    h = n & 0xF; #last hexadecimal "digit"
    
    if h > 9:
        return -1 # return immediately in 6 cases out of 16.

    # Take advantage of Boolean short-circuit evaluation
    if ( h != 2 and h != 3 and h != 5 and h != 6 and h != 7 and h != 8 ):
        # take square root if you must
        t = isqrt(n)
        if t*t == n:
            return t
        else:
            return -1
    
    return -1



'''
Created on Dec 14, 2011

@author: pablocelayes
    
'''
# Types
CFListT = list[int]  # CF coefficients
CVListT = list[tuple[int, int]]  # Convergents at each coefficient level

def rational_to_contfrac(x: int, y: int) -> tuple[CFListT, CVListT]:
    """
    Converts a rational x/y fraction into
    a list of partial coefficients [a0, ..., an], and
    a list of convergents at each coefficient level [(n0, d0), (n1, d1), ...]

    The algorithm of computing the convergents from left to right is available
    in Section 9.1 of https://r-knott.surrey.ac.uk/Fibonacci/cfINTRO.html#CFtofract

    Args:
        x (int): numerator of the given rational number
        y (int): denominator of the given rational number

    Returns:
        tuple[CFListT, CVListT]: a tuple of coefficients and convergents at each
        coefficient level
    """
    a = x // y
    cflist = [a]
    cvlist = [(a, 1)]
    ppn, ppd = 1, 0  # pre-pre numerator and denominator of convergent
    pn, pd = a, 1  # pre numerator and denominator of convergent
    while a * y != x:
        x, y = y, x - a * y
        a = x // y
        cflist.append(a)
        cn, cd = a * pn + ppn, a * pd + ppd
        cvlist.append((cn, cd))
        ppn, ppd = pn, pd
        pn, pd = cn, cd
    return cflist, cvlist





def hack_RSA(e,n):
    '''
    Finds d knowing (e,n)
    applying the Wiener continued fraction attack
    '''
    _, convergents = rational_to_contfrac(e, n)
    
    for (k,d) in convergents:
        
        #check if d is actually the key
        if k!=0 and (e*d-1)%k == 0:
            phi = (e*d-1)//k
            s = n - phi + 1
            # check if the equation x^2 - s*x + n = 0
            # has integer roots
            discr = s*s - 4*n
            if(discr>=0):
                t = is_perfect_square(discr)
                if t!=-1 and (s+t)%2==0:
                    print("Hacked!")
                    return d

########### 풀이 #########



from math import lcm
from Crypto.Util.number import bytes_to_long, getPrime, long_to_bytes

# with open('flag.txt', 'rb') as f:
#     flag = bytes_to_long(f.read().strip())

# oops = getPrime(20)
# p1 = getPrime(512)
# p2 = getPrime(512)

# phi = (p1-1)*(p2-1)
# crazy_number = pow(oops, -1, phi)
# n = p1 * p2

# hehe_secret = pow(flag, crazy_number, n)


# # pow = flag ** cn % n
# print('admin =', n)
# print('hehe_secret =', hehe_secret)
# print('crazy number =', crazy_number)


admin_n = 115527789319991047725489235818351464993028412126352156293595566838475726455437233607597045733180526729630017323042204168151655259688176759042620103271351321127634573342826484117943690874998234854277777879701926505719709998116539185109829000375668558097546635835117245793477957255328281531908482325475746699343
ct = 10313360406806945962061388121732889879091144213622952631652830033549291457030908324247366447011281314834409468891636010186191788524395655522444948812334378330639344393086914411546459948482739784715070573110933928620269265241132766601148217497662982624793148613258672770168115838494270549212058890534015048102
cn_e = 13961211722558497461053729553295150730315735881906397707707726108341912436868560366671282172656669633051752478713856363392549457910240506816698590171533093796488195641999706024628359906449130009380765013072711649857727561073714362762834741590645780746758372687127351218867865135874062716318840013648817769047

d = hack_RSA(cn_e, admin_n)

# using lcm 
print(f'{d = }')
flag = pow(ct, d, admin_n)
print(f'{flag = }')
print(f'{long_to_bytes(flag) = }')

https://github.com/pablocelayes/rsa-wiener-attack/blob/master/RSAwienerHacker.py

 

rsa-wiener-attack/RSAwienerHacker.py at master · pablocelayes/rsa-wiener-attack

A Python implementation of the Wiener attack on RSA public-key encryption scheme. - pablocelayes/rsa-wiener-attack

github.com

위 코드를 참고하여 flag 값을 도출했다 

tjctf{congrats_on_rsa_e_djfkel2349!}

CRT, 중국인 나머지 정리는 

  1.  값을 알아야 하고
  2.  중국인 나머지를 사용하여 계산하면  새로운 값 을 얻을 수 있음
  3. 세제곱근 계산의 세제곱근을 구하면, 원래의 메세지를 복구
  4. 바이트로 변환: 이 결과를 바이트로 변환하면 flag 값이 나오게 된다.

이때 중국인 나머지 정리는 

서로 소인 자연수 n1, n2, … , nk와 임의의 정수 a1, a2, … , ak가 있을 때, 임의의 i(1 ≤ i ≤ k)에 대해 
x ≡ ai (mod ni) 로 표현되는 변수 x의 연립 합동 방정식에 대해
이 방정식이 성립하는 값 x=a가 항상 존재하며
또한 그 값은 n1 n2 … nk의 나머지값 안에서 유일하게 존재한다. 
즉, 방정식의 해는 모두 x ≡ a (mod n1 n2 … nk)로 표현 가능하다.

 

https://flyingdcat4.tistory.com/entry/Chinese-Remainder-Theorem%EC%A4%91%EA%B5%AD%EC%9D%B8%EC%9D%98-%EB%82%98%EB%A8%B8%EC%A7%80-%EC%A0%95%EB%A6%AC 블로그 참고

 

그래서 코드로 보자면 아래와 같이 나온다

from Crypto.Util.number import *
from sympy.ntheory.modular import crt  # 중국 나머지 정리 사용
import gmpy2 

e = 3  # 공개키가 3인 경우 (RSA의 일반적인 값)


n1 =
c1 = 
n2 = 
c2 = 
n3 = 
c3 = 

# 중국 나머지 정리를 사용하여 결합된 암호화된 값과 모듈러를 계산
# crt는 주어진 리스트의 나머지와 모듈러를 사용하여, 새로운 모듈러와 암호화된 값을 반환.
M, N = crt([c1, c2, c3], [n1, n2, n3])  # M은 결합된 암호화된 값, N은 결합된 모듈러스

# 세제곱근을 사용하여 암호화된 값을 해독
# gmpy2.iroot()는 M의 세제곱근을 반환 이는 e=3일 때, RSA 암호화의 복호화 방법임
m = gmpy2.iroot(M, 3)[0]  # 세제곱근의 첫 번째 반환 값은 정수 부분

plaintext = long_to_bytes(int(m))  # 정수를 바이트로 변환

print(plaintext.decode())  # 출력되는 문자열이 암호화된 원래 메시지

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

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

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

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

다음에 참가하게 된다면
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 글 쓰는걸로 ^-^

+ Recent posts