Post

데브코스 TIL - 스프린트4 배포환경 테스트

스프린트4 배포환경 테스트

1. 테스트용 데이터베이스 초기화

1
mysql -h [아이디].prgms-fullcycle.com -u prgms -p < init-test-db.sql

2. 데이터베이스 확인

1
mysql -h [아이디].prgms-fullcycle.com -u prgms -p
  • 데이터베이스 선택
    1
    
    mysql> use prgms_notes;
    
  • user 테이블 확인
    1
    2
    3
    4
    5
    6
    7
    
    mysql> select * from users;
    +----+------------------+--------------------------------------------------------------+
    | id | email            | encrypted_password                                           |
    +----+------------------+--------------------------------------------------------------+
    |  1 | test@example.com | $2b$10$432oW5OwXPcHPcmyQghkxeICMi65DGPdFnDv21dJ2QU3CSj.xFbi6 |
    +----+------------------+--------------------------------------------------------------+
    1 row in set (0.01 sec)
    

3. BE 환경 설정 (.yaml)

1
2
3
4
5
6
7
8
9
10
11
12
 apiVersion: v1
 kind: ConfigMap
 metadata:
  name: notes-be-config
  namespace: prgms-notes
 data:
  DB_HOST: hyemin.prgms-fullcycle.com
  DB_USER: prgms
  DATABASE_PASSWORD: prgms
  DATABASE: prgms_notes
  TOKEN_ISSUER: prgms
  CORS_ALLOWED_ORIGIN: https://hyemin.prgms-fullcycle.com

4. FE 환경 설정 (.yaml)

1
2
3
4
5
6
7
8
9
10
spec:
    containers:
    - name: notes-frontend
    image: hyeem66/prgms-fe:latest
    imagePullPolicy: Always
    ports:
    - containerPort: 3000
    env:
    - name: REACT_APP_API_BASE_URL
      value: https://hyemin.prgms-fullcycle.com/api

5. 시험배포

  • context 변경
1
kubectl config use-context [context]
  • namespace 만들기
1
kubectl create namespace prgms-notes
  • namespace 목록 가져오기
    1
    
    kubectl get namespaces
    
  • backend 폴더에서 notes-be.yaml파일 빌드
1
kubectl apply -f notes-be.yaml
  • frontend 폴더에서 notes-fe.yaml파일 빌드
1
kubectl apply -f notes-fe.yaml
  • kubectl 목록 확인
1
kubectl -n prgms-notes get all
  • pods 목록 확인
1
kubectl -n prgms-notes get pods

6. aws에 올린 이미지를 다운 받기

1
kubectl create namespace prgms-notes
1
kubectl apply-f notes-be.yaml
  • pod 확인하기 => 오류
1
2
3
4
kubectl -n prgms-notes get pods

NAME                        READY   STATUS         RESTARTS   AGE
notes-be-558ff4dbb9-fmtgf   0/1     ErrImagePull   0          12s

no basic auth credentials 오류가 발생해서 이미지를 pull할 수 없는 상태

✅AWS 인증 토큰 받기

1
2
3
4
5
6
7
8
9
10
11
aws ecr --region=ap-northeast-2 get-authorization-token

{
    "authorizationData": [
        {
            "authorizationToken": "생략",
            "expiresAt": "생략",
            "proxyEndpoint": "생략"
        }
    ]
}
  • json 형태를 text 형태로 반환 + authorizationToken 값만 추출
1
2
3
aws ecr --region=ap-northeast-2 get-authorization-token --output text --query "authorizationData[].authorizationToken"

(...)

✅리눅스 환경에서 토큰 디코드하고 저장하기

1
2
3
aws ecr --region=ap-northeast-2 get-authorization-token --output text --query "authorizationData[].authorizationToken" | base64 --decode

AWS: (...)
  • 디코드한 토큰값 얻기 (AWS값 지우기)
1
2
3
aws ecr --region=ap-northeast-2 get-authorization-token --output text --query "authorizationData[].authorizationToken" | base64 --decode| cut -d: -f2

(...)
  • 환경변수에 저장하기
1
TOKEN=`aws ecr --region=ap-northeast-2 get-authorization-token --output text --query "authorizationData[].authorizationToken" | base64 --decode| cut -d: -f2`
  • 환경변수에 잘 저장되어있는지 확인하기
1
echo ${TOKEN}

✅윈도우 환경에서 토큰 디코드하고 저장하기

1
2
3
4
5
6
7
8
9
10
11
12
# AWS CLI를 사용하여 ECR에서 인증 토큰을 가져옵니다.
$token = aws ecr get-authorization-token --region ap-northeast-2 --output json | ConvertFrom-Json

# Base64 디코딩 후 토큰을 추출합니다.
$decodedToken = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($token.authorizationData[0].authorizationToken))

# 토큰에서 필요한 부분을 추출합니다.
$finalToken = ($decodedToken -split ':')[1]

# 결과를 출력합니다.
Write-Output $finalToken

✅받은 토큰으로 kubernetes secrets 생성 및 확인하기

1
2
3
kubectl -n prgms-notes create secret docker-registry [비밀번호 이름]--docker-server=[https://로 시작하는 서버 주소] --docker-username=[유저이름] --docker-password="$finalToken"

secret/[비밀번호 이름] created

비밀번호 확인

만약 -n prgms-notes 옵션을 사용하지 않았다면 다음 명령어를 입력하고,

1
2
3
4
kubectl get secrets

NAME           TYPE                             DATA   AGE
[비밀번호 이름] kubernetes.io/dockerconfigjson   1      28s

-n prgms-notes 옵션을 사용했다면 다음 명령어를 사용하여 확인하면 됨

1
2
3
4
kubectl get secrets -n prgms-notes

NAME           TYPE                             DATA   AGE
[비밀번호 이름] kubernetes.io/dockerconfigjson   1      28s

7. Manifest 파일에 비밀번호 적용

  • backend/notes-be.yaml
1
2
3
4
5
6
7
8
9
    spec:
      containers:
      - name: notes-backend
        (...)
        envFrom:
        - configMapRef:
            name: notes-be-config
      imagePullSecrets:
      - name: [비밀번호 이름]
  • backend/notes-fe.yaml
1
2
3
4
5
6
7
8
9
    spec:
      containers:
      - name: notes-backend
        (...)
        envFrom:
        - configMapRef:
            name: notes-be-config
      imagePullSecrets:
      - name: [비밀번호 이름]

8. Manifest 실행

  • backend 폴더에서 해당 명령어 실행
1
2
3
4
5
kubectl apply -f notes-be.yaml

configmap/notes-be-config configured
deployment.apps/notes-be created
service/notes-be created
  • 확인

be

  • 프론트엔드 폴더에서 해당 명령어 실행
1
2
3
4
kubectl apply -f notes-fe.yaml

deployment.apps/notes-fe created
service/notes-fe created
  • 확인

fe,be

9. https로 시작하는 사이트 들어가서 확인해보기

나의 경우에는 내가 작업한 프로젝트 컨테이너 이미지를 사용하지 않고, 강의에서 사용한 컨테이너 이미지를 다운받아서 적용함

  • 메인페이지

잘 동작

  • 로그인 성공

로그인해보기

  • 노트 조회

노트조회

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