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 일라스틱 빈스톡
일라스틱 빈스톡
환경 구축을 대신 해주는 서비스
일라스틱 빈스톡에게 필요한 리소르들을 말해주면 일라스틱 빈스톡이 알아서 구축하고 실행해줌
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 설치
위의 공식문서 따라서 설치
❯ aws --version aws-cli/2.4.25 Python/3.8.8 Darwin/21.3.0 exe/x86_64 prompt/off







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
도메인과 호스팅 관리를 도와주는 서비스
AWS console → Route 53
도메인 등록
도메인 구매
6.5.2 호스팅 영역 생성
AWS console → Route 53 → 왼쩍 탭에서 호스팅 영역 추가
구매한 도메인 이름 기입하고 호스팅 영역 생성 버튼 클릭
호스트 영역
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