# 6 프로덕션 배포

## 6.1 서비스 아키텍처

### 6.1.1 EC2 (Elastic Compute Cloud)

* 컴퓨터&#x20;



### 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 일라스틱 빈스톡

* 일라스틱 빈스톡
  * 환경 구축을 대신 해주는 서비스
  * 일라스틱 빈스톡에게 필요한 리소르들을 말해주면 일라스틱 빈스톡이 알아서 구축하고 실행해줌

{% hint style="info" %}
IaC (Infrastructure as Code) : 파일에 코드로 인프라를 묘사하고 서비스가 이를 반영해 인프라를 구축하는 것
{% endhint %}

## 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 설치

* AWS CLI 설치
  * [https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
  *   위의 공식문서 따라서 설치

      ```bash
      ❯ aws --version
      aws-cli/2.4.25 Python/3.8.8 Darwin/21.3.0 exe/x86_64 prompt/off
      ```

![](https://2669959621-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxncaDDrGpdjhVy86HbwM%2Fuploads%2F9JuxYhtbK4G11QxMw1X9%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-03-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%201.08.17.png?alt=media\&token=578965ae-939e-432b-895c-1f261481dfb3)

![](https://2669959621-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxncaDDrGpdjhVy86HbwM%2Fuploads%2Fm3LmSRTBOHQjLECGpMDT%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-03-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%201.10.00.png?alt=media\&token=04ddda4f-b9cb-406d-9d5b-ff938d44bca5)

![](https://2669959621-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxncaDDrGpdjhVy86HbwM%2Fuploads%2Fd38B7gzAnnSCKnakij1O%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-03-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%201.10.58.png?alt=media\&token=c5d982c2-9253-4cf0-8895-c65a9caf5ad8)

![](https://2669959621-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxncaDDrGpdjhVy86HbwM%2Fuploads%2FpoJKxed6CQoJrGlcX328%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-03-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%201.11.45.png?alt=media\&token=5630744a-9cb8-4714-99ab-a8b377b74d01)

![](https://2669959621-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxncaDDrGpdjhVy86HbwM%2Fuploads%2FLpWcdJDNgLcUuXdM229t%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-03-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%201.12.37.png?alt=media\&token=282269b8-7257-4cd4-b98b-200109c58909)

![](https://2669959621-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxncaDDrGpdjhVy86HbwM%2Fuploads%2FBYK0MyCqGDdJnuIbKI6r%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-03-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%201.12.50.png?alt=media\&token=78ee8594-4d79-4963-8e1f-5e41887363e3)

![](https://2669959621-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxncaDDrGpdjhVy86HbwM%2Fuploads%2FbFy8BZUVHhMXjvAnEZPC%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-03-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%201.13.15.png?alt=media\&token=c8577744-2075-49f9-a527-bf2b94e83749)

### 6.2.4 AWS CLI 설정

```bash
❯ 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 설치



```bash
pip3 install awsebcli --upgrade --user
```



```bash
export PATH=/Users/<you>/Library/Python/3.8/bin:$PATH
```

```bash
❯ eb --version
EB CLI 3.20.3 (Python 3.9.7)
```

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

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

### 6.3.1 일라스틱 빈스톡이란 ?

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



```bash
❯ 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

```java
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 설정&#x20;

```
> ./gradlew build
```



./elasticbeanstalk/config.yml 설정&#x20;

```
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 환경 구성



```bash
aws rds describe-db-instances --region <REGION>
```

```bash
aws autoscaling describe-auto-scaling-groups --region <REGION>
```

```bash
eb elbv2 describe-load-balancers --resion <REGION>
```

```bash
aws elbv2 describe-target-groups --region <REGION>
```

### 6.3.7 엔드포인트 테스팅

### 6.3.8 프론트엔드 통합 테스팅

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

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

```bash
❯ 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를 이용한 애플리케이션 배포

```bash
❯ 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 문제 해결&#x20;

### 6.5.4 프론트엔드 재배포

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

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

### 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를 네트워크 중간에 누가 가로채로 암호화됐기 때문에 토큰을 사용할 수 없다
