주노 님의 블로그

20241007 본캠프 57일차 TIL 본문

TIL

20241007 본캠프 57일차 TIL

juno0432 2024. 10. 7. 22:19

본캠프 57일차 내용 간단요약

  • 09:00 ~ 10:00 : 코드카타
  • 10:00 ~ 12:00 : AWS 강의
  • 12:00 ~ 13:00 : 점심시간
  • 13:00 ~ 14:00 : 면접준비
  • 14:00 ~ 16:00 : AWS 강의
  • 16:00 ~ 18:00 : 프로젝트 복습
  • 18:00 ~ 19:00 : 저녁시간
  • 19:00 ~ 21:00 : 챌린지반 강의

redis

더보기

redis는 싱글쓰레드에서 작동한다

  • 스프링부트는 멀티 쓰레드에서 작동한다.
    멀티쓰레드 : 한 프로그램 내에서 여러 쓰레드가 자원을 공유해 분할해 일을 처리한다
  • 싱글쓰레드는 뭐겠냐!
    한번에 하나씩 처리해준다.

  • 그럼 스프링부트에 왜 redis를 ??
    멀티쓰레드인 스프링부트에다 싱글쓰레드인 레디스를 사용한다면?
    멀티쓰레드는 여러개의 요청을 레디스에 요청하지만, 레디스는 한번에 한개씩만 줄을 세워준다.

    어떨때 사용하겠느냐?
    선착순! 티켓팅! 같은 이벤트를 실행할때 효과가 돋보인다

    redis에 할인쿠폰을 100장 저장한다 set coupon 100
    스프링부트에서 1000명이 쿠폰을 요청한다
    스프링부트는 1000개의 요청을 모두 처리해준다
    redis는 싱글쓰레드라서 1000개의 요청에대한 순위를 두고, 하나씩처리해주고
    100장이 소진되면 ㅃㅇ...

    동시성 제어이슈를 해결해준다

  • redis를 springBoot에서 사용해보기
    jedis
    lettuce

    jedis는 간단
    lettuce는 사용하기 어렵지만, 다양한 방식의 통신을 지원한다.

    build.gradle
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
     
    추가추가

    1. RedisConfig파일 생성

    redis를 사용하기 위해서는 redisTemplate를 만들어야한다.
    @Bean
    //redis를 사용하기위해서는 key와 value로 이루어져있는데 그걸 지정해주고
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
    {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        //redisTemplate에다 connection연결하여 redis와의 연결을 설정한다.
        template.setConnectionFactory(redisConnectionFactory);
    
        // Key를 문자열로 직렬화하기 위해 StringRedisSerializer 설정
        template.setKeySerializer(new StringRedisSerializer());
    
        // Value를 JSON 형식으로 직렬화/역직렬화하기 위해 GenericJackson2JsonRedisSerializer 설정
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    
        return template;
    }

    설명은 주석참고!

    2. docker를 실행
    user@localhost:~$ docker images
    REPOSITORY           TAG             IMAGE ID       CREATED         SIZE
    testdocker           latest          dbb90c63cb6d   4 days ago      762MB
    redis/redisinsight   latest          227e84a952e3   4 days ago      250MB
    node-test            1.0             ab7e6a400426   6 days ago      139MB
    debian               latest          c7f9867d6721   9 days ago      117MB
    ubuntu               22.04           97271d29cb79   3 weeks ago     77.9MB
    alpine               latest          91ef0af61f39   4 weeks ago     7.8MB
    ubuntu               latest          b1e9cef3f297   5 weeks ago     78.1MB
    kjuno/nginx-test     1.0             9527c0f683c3   7 weeks ago     188MB
    nginx                latest          9527c0f683c3   7 weeks ago     188MB
    redis                latest          7e49ed81b42b   2 months ago    117MB
    mysql                latest          c757d623b190   2 months ago    586MB
    debian               10              69530eaa9e7e   3 months ago    115MB
    redis                6.2             9aac89b4d50f   4 months ago    106MB
    nginx                1.25.3-alpine   2b70e4aaac6b   11 months ago   42.6MB
    ubuntu               14.04           13b66b487594   3 years ago     197MB
    user@localhost:~$ docker ps
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
    user@localhost:~$ docker run --name redis-container -p 6379:6379 -d redis
    c503b66ea8e66e3a1ef0215d2a7a7355f8720599151c24cf3549ac228148e3d4
    user@localhost:~$ docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                    NAMES
    c503b66ea8e6   redis     "docker-entrypoint.s…"   3 seconds ago   Up 3 seconds   0.0.0.0:6379->6379/tcp   redis-container
    user@localhost:~$

    레디스는 이미 이미지로 만들어진 상태라서 바로 실행해준다.

    3. 서버 실행
    4. 테스트해보기
    @GetMapping("/get")
    public String temp1()
    {
        String title = "이론수업 개꿀";
    
        redisTemplate.opsForValue().set("test", title);
        return title;
    }
     
    redis template를 통해서 값을 넣어줫다
    현재 test라는 key에는 이론수업 개꿀 이라는 value가 저장되어있다.

    127.0.0.1:6379> get test
    "\"\xec\x9d\xb4\xeb\xa1\xa0\xec\x88\x98\xec\x97\x85 \xea\xb0\x9c\xea\xbf\x80\""

    역직렬화되지않은 상태의 값을 보여준다.

    저장된 값을 다시 받아와보자
    @GetMapping("/get")
    public String temp2()
    {
        String result = (String) redisTemplate.opsForValue().get("test");
        return result;
    }

    이론수업 개꿀이라는 내용이 반환될까?
  • 자 그럼 redis는 어느 분야에서 사용될까?
    redis는 빠르다고했다
    1. 단순조회할때 많이 사용된다
    2. 잘 변경되지 않은 데이터를 레디스에 넣어서 많이 사용한다
    ex) 주민등록번호를 조회하는 api가 있다고 가정하자
    가. redis에 값이 있는지 없는지 확인한다.
    나. 값이 있으면(cache가 hit를 했다면..) 그 값을 바로 리턴해준다.
    다 .값이 없다면(cache가 miss했다면) db를 조회해서 주민등록번호를 가져와서 redis에 값을 넣어준다.

  • redis의 단점은?
    휘발성

    해결하는방법은?

    방법1
    일정한 주기마다 모든 값을 db에 저장한다 >> rdb스냅샷

    장점
    주기적으로 저장, 장애시 복구가능
    설정이 간단함

    단점
    스냅샷 사이의 데이터는 손실 될수있음

    방법2
    redis의 동작 기록을 로그에 기록하여 파일 자체를 갖고있는것,
    복구가 필요하면 모든 명령어를 하나씩 실행하는법

    장점
    데이터 손실은 서버가 터졌을때 밖에없음

    단점
    파일크기가 오래걸리고
    복구시간이 오래걸릴수있다.

    방법3
    redis를 데이터를 복제하자
    master에 요청한 데이터를 처리하고
    처리한 데이터를 바로 slave 레디스에 저장을하자.

    방법3의 예시는 sentienl전략 cluster전략이 있다.


  • redis sentinel
    redis와 sentinel이 있는데
    reis는 master과 slave 구조로 되어있고
    sentinel은 각 redis의 상태를 모니터링 하고있다.

    과정
    1. 일정 시간마다 sentinel은 redis에 ping 을 보낸다, redis는 pong을 답신한다
    2. 어느순간 redis에서 pong이 오지않는다면?
    3. 문제 발생시 failover과정을 진행한다.
        장애가 있는 master를 kill하고 살아있는 slave를  master로 승격시킨다.

    만약 failover과정에서
    장애감지를 하는 sentinel이 오류로 master가 장애가 발생되었다고 한다면?
    다른 slave에 있는 sentinel도 master의 헬스 체크를하는데

    몇개의 sentinel이 장애가 있다고 판단했을때 교체를하는지의 과정도 포함되어있다(퀀텀) 

  • redis cluster
     샤딩을통해 데이터를 여러 노드에 저장하는 방식이다.

AWS

더보기

클라우드 왜쓰는가?

  • 개인이나 기업이 서버를 구축하고, 배포하기에는 부담스러울수 있음

on-premise

  • 회사 내부에서 서버와 물리적인 하드웨어를 보유하고 운영하는것

차이점

  • on-premise : 초기비용이 높고, 운영비용이 높음
  • 클라우드 : 사용한만큼 쓰기때문에 초기비용이적고, 유연하게 운영이 가능하다

AWS에서는

  • 컴퓨터 대여 : EC2
  • 데이터베이스 : RDS

어떻게 배포해야하는거지?

  • 완성된 프로젝트가 있다
  • 그 파일을 JAR로 압축한다
  • AWS에서 EC2서비스를 하나 빌린다
  • AWS에서 JAR를 실행하거나, 도커 이미지를 넣어서 실행시킨다

AWS의 용어

  • Regions
    AWS는 전세계 여러지역에 데이터센터를 가지고있다, 우리는 위치를 지정할수있다

  • EC2
    가상 서버 서비스이다

  • RDS
    클라우드 데이터베이스 서비스이다

  • ECR
    DOCCKER 컨테이너 이미지 저장소이다

  • CodeDeploy
    자동 배포 서비스이다

  • S3
    스토리지 서비스이다

  • Route53
    도메인 이름을 IP 주소로 변환해주는 역할이다.

  • INBOUND
    내가 AWS에서 구입한 리소스를 외부에서 접근하는 트래픽을 관리한다

  • OUTBOUND
    AWS 리소스에서 나가는 트래픽을 정의한다

  • IAM
    사용자, 그룹, 역할에 대한 권한을 관리하는 서비스이다

  • EKS
    쿠버네티스 서비스

  • ECS
    컨테이너 오케스트레이션 서비스

카프카

더보기

카프카의 장점

  • 높은 처리성능 : 대용량 데이터를 실시간으로 빠르게 처리할 수 있음
  • 확장성 : 노드를 추가하여 쉽게 확장할수있음, 트래픽이 늘어나도 안정적으로 대응 가능하다
  • 내구성 : 데이터를 안정적으로 저장하고, 장애가 발생해도 손실없이 복구 가능하다
  • 유연한 통합 : 다양한 시스템과 애플리케이션간 데이터를 쉽게 교환가능하다

어디서사용하나?

  • 전자상거래, 로그분석, 금융서비스, 스트리밍서비스등에 사용된다.

최근 기업들이 모놀리식 구조에서 마이크로 서비스 아키텍쳐 (MSA)로 변화하고 있다

MSA는 서비스간에 독립적으로 동작하는 API가 있으며 이들간의 데이터 통신을 안정적이게 관리하는것이 중요하다.

 

카프카는 이를 관리하는데 도움을주는 허브 역할을 한다. 모든 마이크로서비스간의 비동기 데이터 통신을 관리한다

쉽게 말하자면 마이크로 서비스들이 각자의 마이크로서비스들에게 직접적으로 API를 호출하는것이아닌 카프카의 중계를 통한 통신을 한다.

 

카프카의 기본적인 내용

  • 프로듀서 : 데이터를 생성해서 TOPIC으로 보낸다
  • 브로커 : 데이터를 TOPIC에 저장한다
  • 컨슈머 : 토픽에서 동시에 같은 토픽에서 데이터를 읽어간다.

쉽게 예를 들어보자.
내가 바니걸 코스튬을 장바구니에 집어넣고, 

1. 스프링 서버 안에 프로듀서 객체를 만듬 : 고객이 장바구니에 바니걸 코스튬을 넣는다. 서버는 이를 감지해 프로듀서 객체를 만든후, 카프카로 장바구니 라는 토픽으로 카프카를 만든다

2. 브로커는 장바구니라는 토픽을 생성하고 프로듀서가 보낸 장바구니 내용을 토픽에 저장한다

3. 컨슈머 : 장바구니 라는 토픽에 데이터를 읽어와서 어떤 상품이 많이 담겼는지 분석하거나, 맞춤형 추천을한다

 

카프카에서 추가되는 개념

  • 파티션
    브로커에 저장된 TOPIC을 물리적으로 분리하는 역할
    >> 병렬로 처리하면 고 가용성 프로젝트를 만들수있다.

  • 컨슈머 그룹
    컨슈머의 묶는 단위의 개념, 동일한 토픽의 내용을 중복해서 읽는 문제를 방지함
    같은 컨슈머 그룹에 속한 컨슈머들은, 중복 없이 데이터를 나눠 처리함,
    하나의 파티션은 하나의 컨슈머만 처리함.

  • offset
  • Kafka Cluster
    여러개의 카프카 브로커를 묶는것이 카프카 클러스터이다
    왜 카프카 클러스터를 사용하나?
    확장성
    한 브로커가 장애가 나더라도 데이터 손실없이 다른 브로커에서 데이터를 처리할수있고,
    여러 브로커가 동시에 처리하기때문에 처리성능이 향상될수있다.

aws

더보기

아래 내용은 인프런 강의 - 비전공자도 이해할 수 있는 AWS 입문/실전 중 내용을 발췌 및 인용한 자료입니다.

 

배포

  • 로컬에서 테스트하던 서버를 다른사람들도 인터넷을 통해 사용할 수 있게 만드는것
  • 로컬에서 테스트를 하면 localhost라는 주소로 테스트를 하게되었을건데, 외부에서는 접속 할 수 없다.
    배포를 하게되면 IP나 도메인과같이 고유의 주소를 부여받게되고, 그 주소로 접속할 수 있게 된다.

EC2

  • 하나의 컴퓨터를 대여하는 서비스이다
  • 왜 EC2를 대여할까?
    1. 내 컴퓨터로 24시간 서버를 배포해야한다
    2. 보안적으로도 위험할 수 있다.
    >> 이러한 위험과 불편으로 인해 EC2를 사용한다
    또한 EC2는 여러 부가기능들(로깅, 오토스케일링, 로드밸런싱 등)을 많이 가지고있다

  • 현업에서는?
    EC2를 많이사용한다. 백엔드 서버를 배포할때면 EC2서버를 배포한다.

리전

  • 인프라를 지리적으로 나누어 배포한 각각의 데이터 센터이다
    EC2는 컴퓨터를 빌려서 원격으로 접속하는 서비스라고했는데,
    그 컴퓨터가 실제 있을 위치를 지정해야한다
    아마존은 전세계에 각각의 데이터센터가 있다
    지리적으로 가까울수록 속도가 빠르다
    애플리케이션을 사용할 사용자들의 위치와 가까운곳으로 선택하는게 좋다.
    리전마다 EC2가 다르게 관리되고있기때문에
    시드니 들어가놓고 인스턴스가 사라졌다고 생각하면 안된다!(내가 그랬어!) 낄낄...

EC2 세팅하기

  • 1. EC2 검색 > 인스턴스 시작
    인스턴스란? EC2에서 빌리는 컴퓨터의 한대 단위이다

  • 2. 내용작성

    인스턴스이름과 os를 선택한다
    왜 윈도우나 맥이 아닌 ubuntu인가?
    서버 배포용으로 윈도우나 맥은 너무 무거울수 있다.


    인스턴스 유형(컴퓨터의 사양)을 지정한다
    키 페어(EC2 인스턴스에 접근하기 위한 키)를 설정해준다
    네트워크 설정


    보안그룹
    AWS 클라우드에서의 네트워크 보안을 의미한다
    인바운드 트래픽 : 외부에서 EC2 인스턴스로 보내는 트래픽
    아웃바운드 트래픽 : EC2 인스턴스에서 외부로 나가는 트래픽
    즉 들어오는 트래픽과 나가는 트래픽을 제어하는 규칙이다.

    보안그룹 생성이나, 기존 보안그룹 선택이 있다.


    ssh란 ec2에 원격으로 접속하기 위한 포트이다
    어디서든 원격으로 접속할수 있다는뜻.

    스토리지 구성

    EC2도 하나의 컴퓨터라서 저장공간이 필요하다.
    AWS는 이것을 EBS라고 한다.
    프리티어는 30기가까지 사용할수 있긴하다.

    그리고 인스턴스 시작을 누르며된다

  • EC2 인스턴스 확인
    대시보드 > 인스턴스 > 인스턴스id 클릭
    몰 지워야하는지 모르겠으니까 다 지우기

    위에서 퍼블릭 ipv4주소랑
    ipv4 : 외부에서 접속하기 위한 주소
    인스턴스 상태 : 현재 인스턴스가 어떤 상태(실행중, 중지, 종료 등등)


    보안 메뉴로 간다.


    인바운드 (들어오는) 규칙은 한정
    아웃바운드 (나가는) 규칙은 전체로 열려있다

    현재 인스턴스의 상태 정보를 모니터링하는 기능도 제공한다.

  • EC2 접속해보기

    연결

    기본 우분투 cil로 연결된것을 볼 수 있다.

  •  탄력적 IP연결하기
    EC2 인스턴스를 생성하면 IP를 할당받는데 이 IP는 임시적인 IP이다(중지 후 재실행하면 IP가 바뀐다)
    재실행해도 다시 바뀌지않는 고정 IP를 할당받고싶다
    그것을 탄력적 IP라고 하는데 어떻게 설정하는지 한번 확인해보자

    네트워크 및 보안 > 탄력적 IP
    기본값으로 할당을 받는다
    작업 > 탄력적 IP 주소 연결

    인스턴스 선택
    퍼블릭 IP 주소가 바뀐것을 확인할수있고
    재기동을 해도 고정된 상태임을 확인 할 수 있다.

    IP와 PORT의 개념
    • IP
      네트워크 상에서의 특정 컴퓨터를 가리키는 주소

    • PORT
      한 컴퓨터 내에서 실행되고 있는 특정 프로그램 주소
      0~1023까지의 포트는 주요 통신을위한 규약에 따라 이미 정해져있다
      22(SSH) : 원격 접속을 위한 포트 번호
      80(HTTP) :  HTTP로 통신 할 때 사용
      443(HTTPS) :  HTTPS로 통신 할 때 사용

    • 서버와 연결할때는 컴퓨터의 주소와 서버를 실행하는 프로그램 주소가 필요하다
      IP:PORT
      127.0.0.1:8080
      여기서 IP는 127.0.0.1 포트는 8080이다.


  • spring 서버를 ec2에 배포해보기
    인스턴스 > 연결 > 원격접속을 수행한다

    #apt를 업데이트한다
    $ sudo apt update && /
    #jdk 17버전을 설치한다
    sudo apt install openjdk-17-jdk -y
    #설치 확인
    java -version
    #깃허브에 올려진 스프링 프로젝트를 가져온다
    git clone 스프링 프로젝트 가져오기
    #application.yml파일을 만들기위해 접근한다
    cd src/main/resources
    #application.yml파일을 만든다 빠져 나올때는 esc > :wq (저장후 종료)
    vi application.yml
    #yml 파일을 만든후 스프링 최상단 디렉토리라 간다
    cd..
    cd..
    cd..
    #서버 실행시키기
    #빌드를 한다
    $ ./gradlew clean build
    #jar 파일을 찾기위해 이동한다
    cd build/libs
    #jar 파일을 실행한다
    $ sudo java -jar 파일명.jar

    빌드 후 생긴 jar파일이 spring 실행파일이다.
    그 jar파일을 실행하면 아래와같이 스프링이 실행된 화면을 볼 수 있다.

    ipv4 주소 : 포트를 링크에 적자


    그럼 위와같이 연결된것을 볼 수 있다.

  • 인스턴스를 종료하기
    인스턴스를 종료하지않으면 과금이 될수도있다 종료해보자
    인스턴스 > 종료할 인스턴스
    인스턴스 상태 > 인스턴스 종료

    탄력적 ip도 돈을받는다!
    따라서 탄력적 ip도 삭제해야한다.

    네트워크및 보안 카테고리 > 탄력적 ip
    작업 > 탄력적 ip주소 릴리스를 하면된다
    기존 작업이 완전히 종료되지 않은 상태에서는 종료되지않으니 주의하기!

도메인 연결(Route53)

  • 기존에는 ip주소:포트로 접속을 했다, 우리도 naver.com 같이 주소로 들어갈수없을까?
    도메인을 발급하고 관리해주는 서비스인 route53을 사용하여 도메인으로 접속해보자

  • 왜쓰는걸까?
    어느 페이지든 ip기반으로 통신을하지않고 도메인 기반으로 통신을한다
    ip기반 통신에서는 https가 적용이 되지않기때문인데, 이때문에 도메인 주소를 쓰기도한다.

  • Route53 사용법
    route 53 검색


    우리는 도메인 등록이에용


    쉬주노 엠주노 주노디자인 주노.ninja... 
    일단 진짜 살건아니니까 선택


    1년에 30달러? 괜찮지않나요?


    이메일로 도메인 등록 메일이 날라오니 꼭 이메일은 제대로 등록해야한다
    도메인 등록은 구매한 시점으로 10~20분뒤에 등록이된다



  • route53을 ec2에 연결하기

    호스팅 영역에서 레코드생성 버튼을 누른다.


    레코드 이름과 (이름을 붙이면 앞에 그 문자가 붙음 예를들면 hi라고 적었으면 hi.juno.ninja로)
    레코드 유형(주로 A - 특정 ipv4 주소에 연결하고 싶거나나 CNAME - 특정 도메인 주소에 연결하고 싶을때을 사용)
    값에는 탄력적 IP주소를 등록한 값을 넣는다.

    즉 juno.ninja 링크를 클릭하는순간 그 링크를 값(ip주소)로 변경해준다

  • 아이 비싸 무료로 쓰고싶다
    https://xn--220b31d95hq8o.xn--3e0b707e/


    회원가입은 별다른 정보를 받지 않아서 좋았다



    도메인 검색


    ip연결 a에 ec2 ip를 붙여넣게되면 들어갈수있다.
    다만 무료도메인은 불안정해서 실제 배포용으로는 적절하지않다

HTTPS 적용하기 (ELB)

  • 로드밸런서란?
    트래픽을 적절하게 분배하는 장치이다
    여러대의 서버가 존재할때 트래픽이 몰렸을때 ELB를 통해 적절하게 트래픽을 분배해준다

  • ELB
    ELB는 로드밸런서 기능도 제공해주지만
    SSL / TLS기능도 제공해준다
    >> 쉽게말하면 SSL/TLS 인증서를 활용해 HTTP가 아닌 HTTPS로 통신할수있게해준다

  • HTTPS를 써야하는이유
    데이터를 서버와 주고 받을때 암호화를 시켜서 통신을 해아한다.
    암호화를 시키지 않으면 중간에 가로챌수 있기때문
    HTTPS 인증을 받은 웹사이트가 백엔드와 통신하려면 백엔드도 HTTPS인증을 받아야한다.

  • ELB 아키텍처
    기존 방식 : 사용자 > EC2
    ELB 도입 후 방식 : 사용자 > ELB > EC2
    위와 같은 방식으로 요청한다.
    추후 트래픽이 증가하여도 EC2를 증가하여도 구조가 바뀌지 않으므로 확장성이 있다.

  • 적용하는법
    EC2 > 로드밸런싱 > 로드밸런서 > 로드밸런서 생성


    세가지 유형중 Application Load Balancer를 사용해본다

    로드 밸런스가 어떤 가용영역으로만 트래픽을 보낼 건지 제한하는 기능이다
    가용 영역에 제한을 두지않고 모든 영역에 트래픽을 보내는것으로 하자.

    보안그룹 적용하기
    ec2 > 보안그룹으로 간다

    elb는 유저의 모든 요청을 '받아서' 그것을 ec2서버로 보내주는 역할을 한다.
    따라서 elb는 인바운드규칙을 http나 https에서 오는 모든요청을 받아주는 역할을 해야한다.
    따라서 위와같이 설정을한다.

    그리고 보안그룹에 방금 등록한 보안그룹을 설정해준다.

  • elb 리스너 및 라우팅
    elb로 들어온 요청을 어떤 ec2 인스턴스로 전달할것인지 설정하는 부분이다.
    대상그룹 생성 클릭
    대상유형은 인스턴스로,

    elb가 사용자로부터 트래픽을 받아서 보낼 인스턴스에게 어떤 방식으로 트래픽을 전송할지 지정하는 부분이다.
    elb는 인스턴스에게 http프로토콜을 이용하여 80번 포트로 보내고
    대상은 ipv4 프로토콜버전은 http1이다.

    상태검사 기능이있는데, elb는 ec2의 상태(에러가 났는지, 정상작동하는지)를 체크하기 위해 주기적으로 각각의 ec2인스턴스에 요청을 보내본다, 그 요청에 대한 200번대 응답이 잘 날라온다면, 서버가 정상적으로 잘 작동되었다고 판단하며, 200번대 응답이 날라오지 않는다면 elb는 해당 인스턴스에는 요청을 보내지않는다.

    각각 ec2 인스턴스에 get 요청으로 /healt 에 get 요청을 보내면서 정상 동작인지 체크를 한다.


    대상 등록에 현재 등록할 인스턴스를 체크한후

    아래에 보류중인것으로 포함
    있으면 대상그룹 생성을 하면된다.
    그리고 다시 리스너 및 라우팅에서 대상그룹을 지정하면되는데
    elb에 http 프로토콜을 활용하여 80번 포트로 들어온 요청은 위 인스턴스로 분배해서 (그룹이니 여러개일수 있음)

    그리고 로드밸런서 생성을 누른다.

  • 헬스체크를 해보자
    헬스체크 api를 만든것을 서버에 넣어야하는디!
    vim을 통해서 컨트롤러를 만들던가 하면된다..


    dns 이름 정보로 들어가도 정상적으로 들어갈수 있는것을 확인 할 수 있다.

  • elb에 도메인 연결해보기
    기존에는 우리가 ec2 서버를 직접 건들였지만 현재는 elb를 건들여야한다.

    route 53 > 호스팅영역 > 구매했던 도메인 클릭
    레코드 유형은 A 그대로
    다만 별칭을 체크하고
    Application/Classic Load Balancer에 대한 별칭 클릭
    로드 밸런서에서 봤던 dns주소 복붙

  • HTTPS 적용을 해보자
    HTTPS 적용을하기위해 인증서를 발급받아야한다.

    서비스 > certificate Manager 클릭
    인증서 요청 

    퍼블릭 인증서 요청
    도메인추가
    활성화된 인증서 id 클릭
    검증대기중인 상태인것을 볼 수 있다.
    도메인이 내 소유인지, 확인하는작업이다, route53에 레코드를 생성하는데
    Cname이름으로 보내면 Cname값을 반환해주면 맞는지... 확인한다는뜻이다.
    route53에서 레코드 생성을 누르면  자동으로 등록이되고, 인증이 된다.

  • ELB에 HTTPS 설정하기
    로드 밸런서에 HTTPS 프로토콜을 받기위해 수정하자

    EC2 > 로드밸런싱 카테고리 > 로드밸런서 > 이름선택

    리스너 및 규칙 > 리스너 추가

    HTTPS에 요청이 들어오면 대상그룹으로 보내준다.

    보안 리스너 설정에서 보안정책은 디폴트값으로
    certificate는 아까 등록해놓은 인증서를 넣는다

    추후 https://본인의 도메인 으로 접속한다.


  • http요청을 https로 전환해보기
    기존에 도메인을 입력하면 자동으로 http프로토콜로 들어오게 된다
    그걸 https로 바꿀순 없을까?
    기존 http 프로토콜의 리스너를 삭제해주고
    다시 http리스너를 추가해주되, 대상그룹으로 전달하는것이아닌 url로 리디렉션을 선택해서 옮겨준다.
    다음 도메인을 입력해도 https로 리디렉션이되는것을 볼 수있다.

  • IPv4 와 IPv6의 차이는?
    IPv4 : 192.0.0.1와같이 기존의 IP주소를 말한다
    IPv6 : IPv4가 고갈됨에따라 더 많은 주소값을 만들어낼수있게 구성되었다
    형태는 2001:0db8:85a3:0000:0000:8a2e:0370:7334 이런 형식이다

  • 과금이 되지 않게 지워줘야하는것들
    로드밸런서 삭제 > ec2 삭제  > 탄력적 ip 삭제(ec2가 종료되어야함!)

 

RDS

  • 주의 : rds에서 rds에 publicIp를 할당하면 과금이 될수도 있습니다!
    2시간 썼는데 0.01usd니까..
    1. RDS를 사용하지 않고 EC2에 mysql 설치해서 활용하기
    2. VPC 개념을 활용해서 RDS는 Public IP를 할당하지 않고 Private IP로만 연결해서 사용하기
    라고 하네요..!

  • EC2로 스프링을 올려서 배포했지만 정작 데이터베이스는 배포하지 않았다.
    그걸 배포하기 위해 생긴 기능이 RDS이다

    EC2에 RDS를 설치한다면 별도의 RDS비용이 나오지 않기때문에 비용을 절감할 수 있지만,
    실제 현업에서는 어지간하면 같이 사용하지는 않는다.
    또한 RDS가 제공하는 편의사항이 있어서 RDS를 사용한다.

  • 사용자는 EC2에 요청을 하게되면, RDS에 요청을보내 데이터를 가져온다(ELB가 없을때)

  • RDS 생성하기
    RDS 검색 > 데이터베이스 생성

    MYSQL 생성

    템플릿은 프리티어

    ec2도 하나의 인스턴스 rds도 하나의 인스턴스이다. 인스턴스의 이름을 지정해주고
    db에 접근하기전에 아이디랑 비밀번호 입력하잖아요?.. root 1234같이.. 그걸 입력해줘야한다.
    인스턴스는 디폴트값 그대로

    연결에서는 퍼블릭 엑세스를 학습용으로 예 눌러주자.
    외부에서 rds를 접속할수있게끔 하는장치이다.

    다른건 돈땃쥐

  • 보안 그룹 생성하기
    EC2 > 네트워크 및 보안 > 보안그룹
    아웃바운드는 고치지 않고 인바운드만 고친다.
    mysql 3306으로포트가 할당된다 (왜 3306일까?..)

    아무튼 보안그룹을 설정한 다음

    rds로 다시 들어가서 
    DB.인스턴스

    DB 체크 수정
    보안그룹을 default를 지우고, 등록한 보안그룹을 넣은다음 계속

    즉시 적용

  • 파라미터 그룹 세팅하기

    RDS > 파라미터 그룹
    파라미터 그룹 생성

    위 설정대로..생성한다

    생성된 파라미터 그룹 클릭

    우측 상단 편집

    문자형식 지정
    character_set을 검색해서 나오는 6가지를 utf8mb4로 변환을
    character_set_client
    character_set_connection
    character_set_database
    characater_set_filesystem
    characater_set_results
    character_set_server

    정렬방식 지정
    collation_connection
    collation_server
    위속성은 전부 utf8mb4_unicode_ci로 바꿔준다.

    time_zone은 Asia/Seoul로 설정한다.

    RDS의 파라미터 그룹 변경하기
    다시 수정을

    추가구성에 우리가 방금 등록한 파라미터 그룹을 설정한다.
    타임존을 변경했기때문에 DB를 재부팅해야만한다

    작업 > 재부팅을.

  • RDS에 접속해보기
    WORKBENCH, DATAGRIP, DBEAVER등등을 사용해도된다
    일단 DBEAVER로 접속을 해보겠다.
    db정보에 엔드포인트가 있을것이다
    mysql을 
    서버 호스트에 엔드포인트를 기입해주면된다.

    username과 password를 아까 등록했던 username과 password를 
    테이블을 하나 더 만들어보자

  • 엔드포인트란?
    특정 리소스에 접근할 수 있도록 해주는 URL이다.

  • SPRING에 DB 연결해보기
    application properties나 yaml의 db설정에
    spring.datasource.url=링크
    spring.datasource.username=username
    spring.datasource.password=password
    이롷게..

  • 과금이 나가지않게 종료해보기

    실제 데이터가 들어가있지도 않고 백업본도 없으니, 스냅샷과 백업보존은 체크를 해제한다

S3

  • S3란?
    파일업로드 관련기능을 구현할때에 최적화 되어있다

  • 아키텍처
    이미지 업로드 과정

    EC2앞에 ELB가 있을 수 있다
    RDS는 이미지의 실제 파일을 업로드하는게아니라, 이미지의 URL만을 저장한다
  • S3버킷 생성하기
    버킷이란?
    EC2에서 하나의 콤피타를 인스턴스라하듯이 S3는 버킷이라한다
    또 S3에 저장된 파일을 객체라고 부른다

    S3검색


    버킷생성



    다른건 돈땃쥐
    아래 모든 퍼블릭 액세스 차단 해제
    다른사람의 이미지를 조회할수있게 풀어줘야한다

  • 버킷 정책설정
    만든 버킷에 접속해주고 권한 클릭

    버킷 정책
    정책이란?
    권한을 정의하는 JSON문서이다, AWS는 보안이 강력해서 권한을 우리가 명시적으로 열어줘야한다.
    그것을 작성할때 버킷 정책을 작성하는것이다.

    우리는 버킷에 이미지를 넣고 사용할수있어야한다.

    버킷정책 > 편집
    새 문 추가


    서비스 선택 > S3

    GETOBJECT 입력 및 선택
    >> 버킷에 오브젝트를 가져오기 위해서
    리소스 추가
    리소스 arn에 ::: 버킷명/* 로 작성해준다

    또한 아래의 principal에 *을 추가한다
    {
    	"Version": "2012-10-17",
    	"Statement": [
    		{
    			"Sid": "Statement1",
    			"Principal": "*",
    			"Effect": "Allow",
    			"Action": [
    				"s3:GetObject"
    			],
    			"Resource": [
    				"arn:aws:s3:::aws-study-static-files/*"
    			]
    		}
    	]
    }


     위 내용을 간단히 요약하자면
    aws-study-static-files에 있는 모든 객체에 대하여 객체를 읽는작업(파일을 읽는작업)허용한다 라는 정책이다

    변경사항 저장

  • 파일을 업로드 할 수 있도록 IAM에서 액세스 키 발급받기
    지금까지는 파일을 다운로드 할수있도록 정책을 변경했지만, 업로드 할 권한은 부여받지 않았다.
    백엔드 서버만 파일을 업로드 할수있게 권한을 부여해보도록 하자


    사용자 > 사용자 생성

    S3FULL검색 및 체크
    S3에 대한 모든 접근권한을 얻는 정책이다
    그후 사용자 생성까지

    만든 사용자 이름을 클릭하고

    보안 자격증명

    액세스 키 발급
     
    스프링부트서버에서 사용할거니까..!
    키 만들기

    액세스키를 적용하기

  • 스프링 부트에서 사용해보자
    cloud:
      aws:
        s3:
          bucket: ${BUCKET}
        credentials:
          accessKey: ${PUBLIC}
          secretKey: ${SECRET}
        region:
          static: ap-northeast-2
        stack:
          auto: false

    물론 저 코드를 그대로 인토넷에 올리면 큰일난다
    퍼블릭과, 시크릿, 버킷네임을 각각 환경변수에 설정해주고

    controller와 service는 나중에 다듬어서 올리기로..
    정상적으로 업로드된것을 확인할수있다

  • 과금이 되지 않게 제거하기
    객체를 삭제한다
    버킷체크 삭제

 

웹 서비스 배포(S3, CloudeFront)

  • s3는 파일 저장 서비스라며?
    부가 기능으로 정적 웹 사이트 호스팅기능이 있다.

  • CloudFront란?
    컨텐츠 파일을 빠르게 전송하게 해주는 서비스이다
    s3를 한국에다가 달아놨는데 미국에 있는 사용자가 이미지를 다운받으려면?
    쪼큼 오래걸릴것이다.
    중간 중간의 저장소를 만드는데 그게 CloudFront이다.

  • 그럼 S3만으로도 웹 배포를 할 수 있는거 아님?
    CloudFront를 같이 쓰는 이유는 로딩의 속도를 지역마다 줄여주기 위해서 사용한다.
    S3는 HTTPS를 적용시키는 기능을 제공하지 않기때문에 CloudFront(HTTPS 적용 가능)를 쓰기도한다

  • 따라서 S3와 CloudFront를 같이 사용하여 배포를 많이한다.

아키텍처

  • user > AmazonCloudFront > AmazonS3
    유저가 s3를 직접 건들지않는다!
    유저가 ColudFront에 요청을하면 CloudFront는 s3에 데이터 요청을 보낸다. 이미 Front에 데이터가 있다면 s3를 거치지 않고 바로 user에게 전달해준다 

구현해보자

  • S3버킷 생성하기
    버킷이란?
    EC2에서 하나의 콤피타를 인스턴스라하듯이 S3는 버킷이라한다
    또 S3에 저장된 파일을 객체라고 부른다

    S3검색


    버킷생성



    다른건 돈땃쥐
    아래 모든 퍼블릭 액세스 차단 해제
    다른사람의 이미지를 조회할수있게 풀어줘야한다

  • 버킷 정책설정
    만든 버킷에 접속해주고 권한 클릭

    버킷 정책
    정책이란?
    권한을 정의하는 JSON문서이다, AWS는 보안이 강력해서 권한을 우리가 명시적으로 열어줘야한다.
    그것을 작성할때 버킷 정책을 작성하는것이다.

    우리는 버킷에 이미지를 넣고 사용할수있어야한다.

    버킷정책 > 편집
    새 문 추가


    서비스 선택 > S3

    GETOBJECT 입력 및 선택
    >> 버킷에 오브젝트를 가져오기 위해서
    리소스 추가
    리소스 arn에 ::: 버킷명/* 로 작성해준다

    또한 아래의 principal에 *을 추가한다
    {
    	"Version": "2012-10-17",
    	"Statement": [
    		{
    			"Sid": "Statement1",
    			"Principal": "*",
    			"Effect": "Allow",
    			"Action": [
    				"s3:GetObject"
    			],
    			"Resource": [
    				"arn:aws:s3:::aws-study-static-files/*"
    			]
    		}
    	]
    }


     위 내용을 간단히 요약하자면
    aws-study-static-files에 있는 모든 객체에 대하여 객체를 읽는작업(파일을 읽는작업)허용한다 라는 정책이다

    변경사항 저장

S3에 웹 사이트 업로드하기, 웹 호스팅 설정하기.

과금이 되지 않게 S3와 CloudFront 종료하기
CloudFront > 배포

id 체크 비활성화 > 사용중지가 될때까지 기다린다..

 ㅂ

S3 > 버킷

파일체크 > 삭제 

 

다시 버킷으로

버킷 > 삭제

'TIL' 카테고리의 다른 글

20241010 본캠프 59일차 TIL  (1) 2024.10.10
20241004 본캠프 56일차 TIL  (0) 2024.10.04
20241002 본캠프 55일차 TIL  (0) 2024.10.02
20241001 본캠프 54일차 TIL  (1) 2024.10.01
20240930 본캠프 53일차 TIL  (0) 2024.09.30