AWS 배포
🙈

AWS 배포

Created
Feb 29, 2024 08:10 AM
Last edited time
Last updated April 2, 2024
Tags
기타
Language
URL

Intro::

AWS 를 사용하여 프로젝트를 배포해 보자.
 

AWS 서비스

EC2

클라우드에서 제공되는 크기 조정 가능한 컴퓨팅
💡
프리티어 기준 월별 750시간까지 무료
 

ELB

수신되는 애플리케이션 트래픽을 EC2 인스턴스에 자동으로 배포해주는 서비스
💡
Classic Load BalancerApplication Load Balancer 만 월별 750시간까지 무료
 

Elasic IP

ip 주소를 고정으로 사용할 수 있도록 해주는 서비스
💡
프리티어는 1개 무료 사용가능
💡
ec2에 연결해두지 않는다면 요금 청구되니 조심!!!!!!!!!!!! 또한 ec2에 연결해두었더라도 ec2가 stop 되어있는 상태라면 요금이 청구된다.
 

CloudFront

Amazon CloudFront를 설정할 때 "뷰어 프로토콜 정책"을 "Redirect HTTP to HTTPS"로 설정하면, 클라이언트가 HTTP를 통해 CloudFront에 요청을 보낼 경우 CloudFront가 해당 요청을 HTTPS로 리다이렉트합니다. 이 설정은 클라이언트와 CloudFront 간의 연결에만 적용됩니다. 따라서, 클라이언트는 결국 HTTPS를 사용하여 CloudFront와 통신하게 됩니다.
원본 서버(EC2 인스턴스)로의 요청 프로토콜은 "원본 프로토콜 정책"에 의해 결정됩니다. CloudFront에서 원본으로의 요청 프로토콜을 HTTP만 사용하도록 설정했다면, CloudFront는 EC2 인스턴스로의 모든 요청을 HTTP 프로토콜을 사용하여 80 포트로 전송합니다. 이 경우, 원본 서버로의 트래픽은 암호화되지 않습니다.
  1. 클라이언트 -> CloudFront: 클라이언트가 HTTP를 사용해 CloudFront에 요청합니다.
  1. CloudFront: "뷰어 프로토콜 정책"에 따라 HTTP 요청을 HTTPS로 리다이렉트합니다.
  1. 클라이언트 -> CloudFront (HTTPS): 클라이언트가 리다이렉트된 HTTPS 요청을 CloudFront에 보냅니다.
  1. CloudFront -> EC2: "원본 프로토콜 정책"에 따라 CloudFront는 HTTP를 사용하여 EC2 인스턴스에 요청을 전송합니다.
  1. EC2 -> CloudFront: EC2 인스턴스가 요청을 처리하고 응답을 CloudFront로 보냅니다.
  1. CloudFront -> 클라이언트 (HTTPS): CloudFront가 응답을 클라이언트에게 HTTPS를 사용하여 전송합니다.
이러한 설정은 클라이언트와 CloudFront 간의 연결은 HTTPS를 통해 보호되지만, CloudFront와 EC2 인스턴스 간의 연결은 HTTP를 사용하므로 보호되지 않는다는 것을 의미합니다. 원본 서버와의 통신도 보호하고 싶다면, CloudFront의 원본 설정에서 HTTPS를 사용하도록 설정하고 EC2 인스턴스에서 443 포트(HTTPS)로 요청을 받을 수 있도록 구성해야 합니다.
 

IAM 이란?

💡
AWS Identity and Access Management(IAM)은 AWS 리소스에 대한 액세스를 안전하게 제어할 수 있는 웹 서비스이다. 사용자, 그룹, 역할 및 정책을 관리함으로써 AWS에서 실행되는 애플리케이션과 리소스에 대한 액세스를 세밀하게 제어할 수 있다.
  • 사용자(Users): 개인 AWS 사용자를 의미한다. 각 사용자에게는 고유한 식별 정보와 자격 증명이 있다.
  • 그룹(Groups): 여러 사용자를 하나의 그룹으로 묶어 그룹 단위로 권한을 관리할 수 있다.
  • 역할(Roles): AWS 서비스나 다른 계정에 할당할 수 있는 권한의 집합이다. 역할을 사용하면 임시 자격 증명을 통해 필요한 권한을 부여 받을 수 있다.
  • 정책(Policies): JSON 형식의 객체로, 특정 리소스에 대한 액세스 권한을 어떻게 제어할지 정의한다.

IAM을 사용해야 하는 이유?

  • 보안: 최소 권한 원칙을 적용하여 사용자나 시스템이 필요한 권한만을 가지도록 함으로써, 보안을 강화할 수 있다.
  • 유연성: 다양한 사용자와 그룹에 대한 권한을 세밀하게 제어할 수 있어, 조직의 보안 정책이나 비즈니스 요구사항에 맞게 구성할 수 있다.
  • 비용 효율: IAM 자체는 추가 비용 없이 사용할 수 있으며, 리소스에 대한 접근을 효율적으로 관리하여 비용을 절약할 수 있다.

IAM의 장점

  • 세밀한 액세스 제어: 사용자, 그룹, 역할 및 정책을 통해 AWS 리소스에 대한 액세스를 정밀하게 제어할 수 있다.
  • 중앙 집중식 관리: AWS 리소스에 대한 액세스 권한을 중앙에서 관리할 수 있어, 보안 관리가 용이하다.
  • 다양한 인증 옵션: 다중 요소 인증(MFA) 등 다양한 인증 옵션을 제공하여 계정 보안을 강화할 수 있다.

IAM의 단점

  • 복잡성: 매우 세밀한 액세스 제어 기능을 제공하기 때문에, 초기 설정과 관리가 복잡할 수 있다.
  • 학습 곡선: IAM의 다양한 개념과 옵션을 이해하고 적절히 활용하기 위해서는 일정한 학습이 필요하다.
 

RDS

MySQL, PostgreSQL, MariaDB, Oracle BYOL 또는 SQL server 를 위한 관리형 관계형 데이터베이스 서비스
💡
- RDS 인스턴스 1개 무료 사용 가능 - 월별 750시간 무료 - DB 엔진이 db.t2.micro 타입만 사용가능 - ssd 데이터 베이스 스토리지 20GB 제한 - db 백업 및 스냅샷용 스토리지 20GB - RDS 생성할때 오토 백업 안되게 주의 - RDS 스토리지 자동 조정 옵션 끄기 - Multi-AZ 와 고성능 I/O 인 Provisioned IOPS Storate 사용하지 않도록 설정
 

보안 그룹

💡
AWS 보안 그룹(Security Group)은 AWS에서 제공하는 가상 방화벽으로, 인스턴스(예: EC2)에 대한 인바운드(Inbound) 및 아웃바운드(Outbound) 트래픽을 제어하는데 사용된다. 각 보안 그룹은 다음과 같은 특징을 가진다
  • 인바운드 규칙(Inbound Rules): 외부에서 인스턴스로 들어오는 트래픽을 제어한다. 예를 들어, 특정 IP 주소 범위에서 오는 특정 포트 번호로의 접속을 허용하거나 차단할 수 있다.
  • 아웃바운드 규칙(Outbound Rules): 인스턴스에서 외부로 나가는 트래픽을 제어한다. 기본적으로 모든 아웃바운드 트래픽을 허용하나, 필요에 따라 제한을 둘 수 있다.
  • 상태 유지(Stateful): 보안 그룹은 상태 유지 기능을 가지고 있어, 인바운드 규칙을 통해 허용된 요청에 대한 응답 트래픽은 아웃바운드 규칙에 관계없이 자동으로 허용된다.
  • 인스턴스와의 관계: 보안 그룹은 인스턴스에 직접 할당된다. 하나의 인스턴스는 여러 보안 그룹에 속할 수 있고, 하나의 보안 그룹은 여러 인스턴스에 적용될 수 있다.
보안 그룹은 최소 권한의 원칙을 따라 필요한 최소한의 트래픽만을 허용하도록 설정하는 것이 좋다. 이를 통해 서버를 보호하고, 불필요한 네트워크 접근을 방지할 수 있다. 보안 그룹 설정은 언제든지 변경할 수 있으며, 변경 사항은 즉시 적용된다.

EC2 설정

ssh 접속

chmod 600 NewsHabit.pem ssh -i NewsHabit.pem ec2-user@{퍼블릭 IPv4 주소} # 업로드 scp -i [pem파일경로] [업로드할 파일 이름] [ec2-user계정명]@[ec2 instance의 public DNS]:~/[경로] # 다운로드 scp -i [pem파일경로] [ec2-user계정명]@[ec2 instance의 public DNS]:[다운로드 받을 곳] [파일 경로]

초기설정

# 호스트네임 변경 sudo hostnamectl set-hostname {변경할 호스트 네임} # 시간대 설정 sudo timedatectl set-timezone Asia/Seoul timedatectl# 시간 확인

mysql 설치

# Amazon Linux 환경 sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm sudo dnf install mysql-community-server # 뭔가 컴플릭트 뭐시기 에러가 난다면... sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
 

RDS 설정

EC2 에서 RDS 접속

mysql -h {RDS 엔드 포인트} -u {user} -p

mysql 유저 권한 부여

# 유저 생성 create user userid@localhost identified by '비밀번호'; create user 'userid'@'%' identified by '비밀번호';// '%' 의 의미는 외부에서의 접근을 허용 create user 'crawl_user'@'%' identified by 'crawl1234'; # 권한 부여 GRANT ALL PRIVILEGES ON DB명.테이블 TO 계정아이디@host IDENTIFIED BY '비밀번호';// 계정이 이미 존재 하는데 'identified by '비밀번호' 부분을 추가하면 비밀번호가 변경된다 GRANT ALL privileges ON DB명.* TO 계정아이디@locahost IDENTIFIED BY '비밀번호'; GRANT ALL privileges ON DB명.* TO 계정아이디@'%' IDENTIFIED BY '비밀번호'; GRANT ALL privileges ON news_habit.* TO crawl_user
 

스프링 환경 분리

💡
java -jar -Dspring.profiles.active=prod *.jar 처럼 빌드

도메인 구매 및 SSL

도메인이 제대로 실행이 안되는것 같다면??

💡
도메인의 네임서버와 호스팅에서의 레코드중 NS의 라우팅 값이 다르면 안된다… 주의하자

Route 53

 
  • 오리진 도메인: CloudFront가 콘텐츠를 검색할 때 접근하는 원본의 위치를 나타냅니다. 여기서는 EC2 인스턴스의 퍼블릭 DNS 이름(예: ec2-xx-xx-xx-xx.compute-1.amazonaws.com)이 오리진 도메인이 됩니다. 이 도메인은 CloudFront가 콘텐츠를 가져오기 위해 요청을 보내는 주소입니다.
  • 대체 도메인(CNAME): 사용자가 CloudFront 배포에 접근할 때 사용할 수 있는 사용자 정의 도메인 이름입니다. 예를 들어, 사용자가 소유한 도메인 이름(www.yourdomain.com)을 CloudFront 배포에 연결하려면, 이 도메인을 대체 도메인으로 설정합니다. 이렇게 설정하면 사용자는 CloudFront가 제공하는 복잡한 도메인 이름(d1234.cloudfront.net) 대신, 자신의 도메인을 통해 콘텐츠에 접근할 수 있습니다.
CloudFront를 사용하여 EC2 인스턴스에서 호스팅되는 웹사이트나 애플리케이션에 접근할 때, 사용자는 www.yourdomain.com 같은 사용자 정의 도메인을 사용하여 콘텐츠에 접근하게 됩니다. 이 도메인은 CloudFront 배포 설정에서 지정한 대체 도메인(CNAME)을 통해 설정되며, CloudFront는 이 요청을 EC2 인스턴스로 라우팅하여 콘텐츠를 검색하고 사용자에게 제공합니다.
이 구성을 통해, 사용자는 AWS의 글로벌 콘텐츠 전송 네트워크의 이점을 활용하면서도 자신의 도메인을 사용하여 브랜드 일관성을 유지할 수 있습니다. CloudFront는 콘텐츠를 캐싱하여 전 세계 어디서든 빠른 콘텐츠 로딩 속도를 제공할 뿐만 아니라, HTTPS를 통한 보안 연결을 쉽게 구현할 수 있게 해줍니다.
 

쿼리 파라미터 사라지는 현상

💡
클라우드 프론트의 동작에서 캐시정책중 모든 쿼리를 허용하는 정책을 선택해야한다.
 

References::

Loading Comments...