6 프로덕션 배포

6.1 서비스 아키텍처

6.1.1 EC2 (Elastic Compute Cloud)

  • 컴퓨터

6.1.2 라우트 53 - DNS

  • DNS

    • 도메인 이름과 주소를 매핑해 놓은 시스템

one of many DNS is Route 53

  • ISP (Internet Service Provider)

6.1.3 애플리케이션 로드 밸런서

  • 로드밸런서

    • 연결된 여러 서버의 트래픽을 균형있게 처리하도록 도와줌

    • 즉 트래픽을 서버에 적절히 분배

6.1.4 오토 스케일링 그룹

  • 오토 스케일링 그룹 (ASG)

    • 자동으로 스케일 해 줌

    • ASG에 min, max, desired 인스턴스 수 정할 수 있음

    • 트래픽 변동에 따라 자동으로 스케일 인 또는 스케일 아웃 해줌

6.1.5 VPC와 서브넷

  • VPC

    • 독립된 가상의 네트워크

    • 특별한 설정을 하지 않는 이상 이 네트워크 안에서 생성되는 EC2는 외부에서 접근 못함

    • VPC 안에는 서브넷이라는 여러 개로 쪼개진 네트워크가 존재

      • 우리는 VPC의 한 서브넷 내에 EC2 서버를 생성할 거임

6.1.6 일라스틱 빈스톡

  • 일라스틱 빈스톡

    • 환경 구축을 대신 해주는 서비스

    • 일라스틱 빈스톡에게 필요한 리소르들을 말해주면 일라스틱 빈스톡이 알아서 구축하고 실행해줌

IaC (Infrastructure as Code) : 파일에 코드로 인프라를 묘사하고 서비스가 이를 반영해 인프라를 구축하는 것

6.2 AWS와 EB CLI 설치

6.2.1 AWS 계정 생성

  • AWS 리소스에 접근하는 방법

    • [x] AWS 콘솔

    • [x] AWS DLI

    • [ ] AWS SDK

6.2.2 파이썬 설치

6.2.3 AWS CLI 설치

6.2.4 AWS CLI 설정

 aws configure
AWS Access Key ID [None]: <액세스키 ID>
AWS Secret Access Key [None]: <비밀 액세스키>
Default region name [None]: ap-northeast-2
Default output format [None]: json

6.3.5 pip를 이용해 EB CLI 설치

pip3 install awsebcli --upgrade --user

export PATH=/Users/<you>/Library/Python/3.8/bin:$PATH
 eb --version
EB CLI 3.20.3 (Python 3.9.7)

6.2.6 윈도우 사용자를 위한 환경 변수 설정

6.3 AWS의 일라스틱 빈스톡을 이용한 백엔드 배포

6.3.1 일라스틱 빈스톡이란 ?

6.3.2 eb init 을 이용해 애플리케이션 생성

 eb init TodoApplication-backend

Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-south-1 : Asia Pacific (Mumbai)
7) ap-southeast-1 : Asia Pacific (Singapore)
8) ap-southeast-2 : Asia Pacific (Sydney)
9) ap-northeast-1 : Asia Pacific (Tokyo)
10) ap-northeast-2 : Asia Pacific (Seoul)
11) sa-east-1 : South America (Sao Paulo)
12) cn-north-1 : China (Beijing)
13) cn-northwest-1 : China (Ningxia)
14) us-east-2 : US East (Ohio)
15) ca-central-1 : Canada (Central)
16) eu-west-2 : EU (London)
17) eu-west-3 : EU (Paris)
18) eu-north-1 : EU (Stockholm)
19) eu-south-1 : EU (Milano)
20) ap-east-1 : Asia Pacific (Hong Kong)
21) me-south-1 : Middle East (Bahrain)
22) af-south-1 : Africa (Cape Town)
(default is 3): 10

Select a platform.
1) .NET Core on Linux
2) .NET on Windows Server
3) Docker
4) GlassFish
5) Go
6) Java
7) Node.js
8) PHP
9) Packer
10) Python
11) Ruby
12) Tomcat
(make a selection): 6

Select a platform branch.
1) Corretto 11 running on 64bit Amazon Linux 2
2) Corretto 8 running on 64bit Amazon Linux 2
3) Java 8 running on 64bit Amazon Linux (Deprecated)
4) Java 7 running on 64bit Amazon Linux (Deprecated)
(default is 1): 2

Cannot setup CodeCommit because there is no Source Control setup, continuing with initialization
Do you want to set up SSH for your instances?
(Y/n): n

6.3.3 백엔드 애플리케이션 설정

application-prod.yaml

server:
    port: 5000
spring:
    jpa:
        database: MYSQL
        show-sql: true
        database-platform: org.hibernate.dialect.MySQL8Dialect
        hibernate:
            ddl-auto: update
    datasource:
        url: jdbc:mysql//${rds.hostname}:${rds.port}/${rds.db.name}
        username: ${rds.username}
        password: ${rds.password}

build.gradle

runtimeOnly 'mysql:mysql-connector-java'

HealthCheck API

package com.todoweb.todoSpringApp.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HealthCheckController {

    @GetMapping("/")
    public String healthCheck() {
        return "The server is up and running...";
    }
}

target jar 설정

> ./gradlew build

./elasticbeanstalk/config.yml 설정

branch-defaults:
  default:
    environment: TodoApplication-backend-dev
deploy:
  artifact: build/libs/todoSpringApp-0.0.1-SNAPSHOT.jar
global:
  application_name: TodoApplication-backend
  branch: null
  default_ec2_keyname: null
  default_platform: Corretto 8 running on 64bit Amazon Linux 2
  default_region: ap-northeast-2
  include_git_submodules: true
  instance_profile: null
  platform_name: null
  platform_version: null
  profile: null
  repository: null
  sc: null
  workspace_type: Application

6.3.4 eb create를 이용해 AWS에 환경 생성

❯ eb create --database --elb-type application --instance-type t2.micro

6.3.5 애플리케이션 배포

> eb setenv SPRING_PROFILES_ACTIVE=prod

6.3.6 환경 구성

aws rds describe-db-instances --region <REGION>
aws autoscaling describe-auto-scaling-groups --region <REGION>
eb elbv2 describe-load-balancers --resion <REGION>
aws elbv2 describe-target-groups --region <REGION>

6.3.7 엔드포인트 테스팅

6.3.8 프론트엔드 통합 테스팅

6.4 AWS의 일라스틱 빈스톡을 이용한 프론트엔드 배포

6.4.1 eb init을 이용해 애플리케이션 생성

 eb init TodoApplication-frontend

Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-south-1 : Asia Pacific (Mumbai)
7) ap-southeast-1 : Asia Pacific (Singapore)
8) ap-southeast-2 : Asia Pacific (Sydney)
9) ap-northeast-1 : Asia Pacific (Tokyo)
10) ap-northeast-2 : Asia Pacific (Seoul)
11) sa-east-1 : South America (Sao Paulo)
12) cn-north-1 : China (Beijing)
13) cn-northwest-1 : China (Ningxia)
14) us-east-2 : US East (Ohio)
15) ca-central-1 : Canada (Central)
16) eu-west-2 : EU (London)
17) eu-west-3 : EU (Paris)
18) eu-north-1 : EU (Stockholm)
19) eu-south-1 : EU (Milano)
20) ap-east-1 : Asia Pacific (Hong Kong)
21) me-south-1 : Middle East (Bahrain)
22) af-south-1 : Africa (Cape Town)
(default is 3): 10

Application TodoApplication-frontend has been created.

It appears you are using Node.js. Is this correct?
(Y/n): y
Select a platform branch.
1) Node.js 16 running on 64bit Amazon Linux 2
2) Node.js 14 running on 64bit Amazon Linux 2
3) Node.js 12 running on 64bit Amazon Linux 2 (Deprecated)
4) Node.js 10 running on 64bit Amazon Linux 2 (Deprecated)
5) Node.js running on 64bit Amazon Linux (Deprecated)
(default is 1): 2

Cannot setup CodeCommit because there is no Source Control setup, continuing with initialization
Do you want to set up SSH for your instances?
(Y/n):
 eb init TodoApplication-frontend
Cannot setup CodeCommit because there is no Source Control setup, continuing with initialization
Do you want to set up SSH for your instances?
(Y/n): n

6.4.2 eb create를 이용한 애플리케이션 배포

 eb create --elb-type application --instance-type t2.micro
Enter Environment Name
(default is TodoApplication-frontend-dev):
Enter DNS CNAME prefix
(default is TodoApplication-frontend-dev): TODOWEB-REACT

Would you like to enable Spot Fleet requests for this environment? (y/N): n
Creating application version archive "app-220315_002104127825".
Uploading: [---------------------------------------Uploading: [###------------------------------------Uploading: [######---------------------------------Uploading: [########-------------------------------Uploading: [###########----------------------------Uploading: [##############-------------------------Uploading: [#################----------------------Uploading: [###################--------------------Uploading: [######################-----------------Uploading: [#########################--------------Uploading: [############################-----------Uploading: [###############################--------Uploading: [#################################------Uploading: [####################################---Uploading: [#######################################Uploading: [#######################################Uploading: [#######################################Uploading: [#######################################Uploading: [##################################################] 100% Done...
Environment details for: TodoApplication-frontend-dev
  Application name: TodoApplication-frontend
  Region: ap-northeast-2
  Deployed Version: app-220315_002104127825
  Environment ID: e-p6yipvqbrd
  Platform: arn:aws:elasticbeanstalk:ap-northeast-2::platform/Node.js 14 running on 64bit Amazon Linux 2/5.5.0
  Tier: WebServer-Standard-1.0
  CNAME: TODOWEB-REACT.ap-northeast-2.elasticbeanstalk.com
  Updated: 2022-03-15 07:21:38.883000+00:00
Printing Status:
2022-03-15 07:21:37    INFO    createEnvironment is starting.
2022-03-15 07:21:39    INFO    Using elasticbeanstalk-ap-northeast-2-436991251381 as Amazon S3 storage bucket for environment data.
2022-03-15 07:22:00    INFO    Created target group named: arn:aws:elasticloadbalancing:ap-northeast-2:436991251381:targetgroup/awseb-AWSEB-1RFO8GOEU7W59/6b388c7b388805f0
2022-03-15 07:22:00    INFO    Created security group named: sg-0b76a4275006b8b4f
2022-03-15 07:22:16    INFO    Created security group named: awseb-e-p6yipvqbrd-stack-AWSEBSecurityGroup-J7TAPLTJBJ18
2022-03-15 07:22:16    INFO    Created Auto Scaling launch configuration named: awseb-e-p6yipvqbrd-stack-AWSEBAutoScalingLaunchConfiguration-H8umFripfbeZ
2022-03-15 07:23:17    INFO    Created Auto Scaling group named: awseb-e-p6yipvqbrd-stack-AWSEBAutoScalingGroup-HOZH7WHUCJ2W
2022-03-15 07:23:18    INFO    Waiting for EC2 instances to launch. This may take a few minutes.
2022-03-15 07:23:18    INFO    Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-2:436991251381:scalingPolicy:fe2cb749-714e-440a-a345-b889f776f86b:autoScalingGroupName/awseb-e-p6yipvqbrd-stack-AWSEBAutoScalingGroup-HOZH7WHUCJ2W:policyName/awseb-e-p6yipvqbrd-stack-AWSEBAutoScalingScaleDownPolicy-1FNMDGSFKI763
2022-03-15 07:23:18    INFO    Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-2:436991251381:scalingPolicy:29ed2050-a2a9-4745-90b6-686bfbf2a4d2:autoScalingGroupName/awseb-e-p6yipvqbrd-stack-AWSEBAutoScalingGroup-HOZH7WHUCJ2W:policyName/awseb-e-p6yipvqbrd-stack-AWSEBAutoScalingScaleUpPolicy-14CFWVTERE2GT
2022-03-15 07:23:18    INFO    Created CloudWatch alarm named: awseb-e-p6yipvqbrd-stack-AWSEBCloudwatchAlarmLow-1HHHJBOR3E2N9
2022-03-15 07:23:18    INFO    Created CloudWatch alarm named: awseb-e-p6yipvqbrd-stack-AWSEBCloudwatchAlarmHigh-GNV4XXPLJYHI
2022-03-15 07:23:33    INFO    Created load balancer named: arn:aws:elasticloadbalancing:ap-northeast-2:436991251381:loadbalancer/app/awseb-AWSEB-W7TXB7BKRZQD/d0d3508d29326e5a
2022-03-15 07:23:36    INFO    Created Load Balancer listener named: arn:aws:elasticloadbalancing:ap-northeast-2:436991251381:listener/app/awseb-AWSEB-W7TXB7BKRZQD/d0d3508d29326e5a/88dee002a64f7916
2022-03-15 07:23:50    INFO    Instance deployment: You didn't specify a Node.js version in the 'package.json' file in your source bundle. The deployment didn't install a specific Node.js version.
2022-03-15 07:23:53    INFO    Instance deployment completed successfully.
2022-03-15 07:24:59    INFO    Application available at TODOWEB-REACT.ap-northeast-2.elasticbeanstalk.com.
2022-03-15 07:24:59    INFO    Successfully launched environment: TodoApplication-frontend-dev

6.4.3 크로스-오리진 문제

6.5 Route 53 도메인 설정

인증과 인가를 구현할 때 JWT는 반드시 HTTPS와 사용해야 한다.

HTTPS 인증서를 받기 이전에 도메인을 구입해야 하는데, 인증서는 자기 자신이 소유한 도메인에 대해서만 추가할 수 있기 때문이다.

6.5.1 도메인 구매

  • Route 53

    • 도메인과 호스팅 관리를 도와주는 서비스

  1. AWS console → Route 53

  2. 도메인 등록

  3. 도메인 구매

6.5.2 호스팅 영역 생성

  1. AWS console → Route 53 → 왼쩍 탭에서 호스팅 영역 추가

  2. 구매한 도메인 이름 기입하고 호스팅 영역 생성 버튼 클릭

호스트 영역

  • DNS 영역 파일

  • DNS 영역이란 DNS spdlatmvpdltm wmr, <도메인 이름>이 관리할 영역

  • DNS 영역을 생성하는 이유는 여러 개의 레코드를 한 곳에서 관리하기 위해서임

레코드

  • 이름과 IP를 연결해 놓은 파일 혹은 엔트리

  • 여러 종류가 존재

  • 호스트 영역을 생성하면 SOA와 NS가 각각 하나씩 자도 ㅇ생성

    • SOA (Start of Aututhority) 레코드 : 이 영역을 관리하는 관리자의 정보를 가지고 있음

    • NS (Name Server) 레코드 : 해당 도메인

    • A 레코드 : 해당 도메인으로 프론트엔드 도메인 혹은 백엔드 도메인을 특정 IP 또는 다른 도메인(로드 밸런서의 도메인)으로 연결하는 레코드

서브 도메인 추가 (프론트, 백)

  • 레코드 생성

  • 단순 라우팅 선택

로드 밸런서의 이름은 AWS 콘솔 → EC2 → 로드밸런서에서 확인

6.5.3 백엔드 재배포

  • http://<도메인>, https://<도메인> 추가하연 CORS 문제 해결

6.5.4 프론트엔드 재배포

  • http://<도메인>, https://<도메인> 추가하연 CORS 문제 해결 (프론트, 백)

6.6 백엔드/프론트엔드 AWS Certificate Manager 를 이용한 https설정

6.6.1 인증서 요청

  • AWS console → Certificate Manager

    • 인증서 프로비저닝의 시작하기 또는 인증서 요청

    • 공인 인증서 요청

    • *.<도메인이름> 기입

    • DNS 검증

    • 확인 및 요청

이후 테이블에 검증 보류 상태의 도메인 이름이 추가 된다. 이 레코드를 검증하려면 Route 53에서 레코드를 생성해야 한다.

  • Route 53에서 레코드 생성 버튼을 클릭

6.6.2 백엔드 애플리케이션 HTTPS 설정

  • AWS console → Elastic Beanstalk

  • 환경창 → 백엔드 애플리케이션 → 구성

  • 로드 밸런서 → 편집 → 리스너 추가

  • HTTPS가 있으니 HTTP, 즉 80포트를 비활성화

  • 적용 클릭

6.6.3 프론트엔드 애플리케이션 HTTPS 설정

  • AWS console → Elastic Beanstalk

  • 환경창 → 프론트엔드 애플리케이션 → 구성

  • 로드 밸런서 → 편집 → 리스너 추가

  • HTTPS가 있으니 HTTP, 즉 80포트를 비활성화

  • 적용 클릭

여기까지 ACM으로 SSL 인증서를 만들고 인증서를 로드 밸런서에 추가하였다.

이제 백엔드와 프론트엔드 API 모두 HTTPS로만 접근할 수 있으며, JWT를 네트워크 중간에 누가 가로채로 암호화됐기 때문에 토큰을 사용할 수 없다

Last updated