Search
🙊

newshabit AWS 배포 재정리

Intro::

AWS에서 배포한 내용 알짜배기만 정리해둔 정리본입니다. 기본적으로 프리티어를 바탕으로 정리해두었습니다.

VPC 생성 및 VPC Peering

VPC Peering을 위해서는 VPC의 CIDR이 서로 겹치면 안되기 때문에 인스턴스를 생성하기 전에 서로 다른 VPC CIDR로 구성을 해주어야 한다.

간략 구성

1.
VPC 생성
2.
서브넷 생성 및 VPC 연결
3.
인터넷 게이트웨이 생성 및 VPC 연결
4.
라우팅 테이블 인터넷 게이트 웨이 연결
5.
인스턴스 생성시 해당 VPC 사용
6.
서로 다른 VPC 끼리 Peering을 통해 통신

EC2 설정

amazon linux 2 사용

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]:[다운로드 받을 곳] [파일 경로]
Bash
복사

초기설정

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

도커 컨테이너 KST 적용

volumes: - /usr/share/zoneinfo/Asia/Seoul:/etc/localtime:ro
Docker
복사

mysql 설치

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

docker 및 docker-compose 설치

sudo yum update -y sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine -y sudo amazon-linux-extras install docker -y sudo systemctl start docker sudo systemctl enable docker sudo usermod -a -G docker ec2-user newgrp docker sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose docker-compose --version
Bash
복사
sudo chmod +x /usr/local/bin/docker-compose

RDS 설정

EC2 에서 RDS 접속

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

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
SQL
복사

CloudFront + ACM + Route 53 을 통한 https 구성

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

도메인의 네임서버와 호스팅에서의 레코드중 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를 통한 보안 연결을 쉽게 구현할 수 있게 해줍니다.

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

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

하위 도메인을 설정하는 경우

route53 에서 하위 도메인에 대한 레코드를 생성해주면된다.
하위도메인 이 메인 도메인으로 라우팅되도록 레코드 작성
위의 구성에서는 cloudfront로 라우팅 되도록 설정해둠
acm에서도 인증서를 생성할때 메인 도메인과 하위도메인에 대해 한번에 발급받으면 된다.

nginx

harbor

생각보다 리소스를 많이 잡아먹어서 추후 배포 하던지 해야 할 듯…

1. CA 인증서 생성

먼저, 자체 CA의 개인키와 CA 인증서를 생성합니다.
# CA 개인키 생성 (4096비트) openssl genrsa -out ca.key 4096 # CA 인증서 생성 (10년 유효, 조직 정보를 본인 환경에 맞게 수정) openssl req -x509 -new -nodes -sha512 -days 3650 \ -subj "/C=KR/ST=Seoul/L=Seoul/O=newshabit/OU=IT/CN=NewshabitRootCA" \ -key ca.key \ -out ca.crt
Shell
복사

2. Harbor 서버 인증서 생성

2.1. Harbor용 개인키 생성

openssl genrsa -out harbor.newshabit.org.key 4096
Shell
복사

2.2. 인증서 서명 요청(CSR) 생성

openssl req -sha512 -new \ -subj "/C=KR/ST=Seoul/L=Seoul/O=newshabit/OU=IT/CN=harbor.newshabit.org" \ -key harbor.newshabit.org.key \ -out harbor.newshabit.org.csr
Shell
복사

3. x509 v3 확장 파일(v3.ext) 생성

이 파일은 SAN(Subject Alternative Name) 항목을 포함하여, 인증서가 여러 도메인을 커버할 수 있도록 합니다.
예를 들어, Harbor에 접속할 때 사용될 도메인이 harbor.newshabit.orgnewshabit.org라면 다음과 같이 구성합니다.
cat > v3.ext <<-EOF authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, keyEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1 = harbor.newshabit.org
Shell
복사

4. Harbor 서버 인증서 서명

생성한 CSR과 v3.ext 파일을 사용해 CA로 서명하여 Harbor 인증서를 생성합니다.
openssl x509 -req -sha512 -days 3650 \ -extfile v3.ext \ -CA ca.crt -CAkey ca.key -CAcreateserial \ -in harbor.newshabit.org.csr \ -out harbor.newshabit.org.crt
Shell
복사

5. 인증서 파일을 Harbor 및 Docker에 제공

5.1. Harbor용 인증서 복사

Harbor 설치 시, 인증서를 사용하도록 설정할 경로(예: /data/cert/)에 복사합니다.
cp harbor.newshabit.org.crt /data/cert/ cp harbor.newshabit.org.key /data/cert/ cp ca.crt /data/cert/
Shell
복사

5.2. Docker 클라이언트용 인증서 생성 및 복사

Docker는 서버 인증서(.crt 파일)를 CA 인증서로 인식하므로, 서버 인증서를 .cert 파일로 변환합니다.
openssl x509 -inform PEM -in harbor.newshabit.org.crt -out harbor.newshabit.org.cert
Shell
복사
그리고 Docker 데몬이 인증서를 인식할 수 있도록, /etc/docker/certs.d/harbor.newshabit.org/ 디렉토리에 다음 파일들을 복사합니다.
mkdir -p /etc/docker/certs.d/harbor.newshabit.org/ cp harbor.newshabit.org.cert /etc/docker/certs.d/harbor.newshabit.org:80/ cp harbor.newshabit.org.key /etc/docker/certs.d/harbor.newshabit.org:80/ cp ca.crt /etc/docker/certs.d/harbor.newshabit.org:80/
Shell
복사
만약 Nginx의 HTTPS 포트가 443이 아닌 다른 포트로 매핑되어 있다면, 해당 포트를 포함한 디렉토리(ex: /etc/docker/certs.d/harbor.newshabit.org:port/)를 사용합니다.

6. Harbor 구성 변경 및 재배포

6.1. Harbor 설치 시 HTTPS 구성

Harbor를 처음 설치하거나 HTTP에서 HTTPS로 전환하려면, harbor.yml 파일에서 HTTPS 관련 항목을 활성화합니다.
예시:
hostname: harbor.newshabit.org # HTTPS 설정 활성화 (내부에서는 CloudFront나 ELB를 사용하여 HTTPS 처리가 가능) https: port: 443 certificate: /data/cert/harbor.newshabit.org.crt private_key: /data/cert/harbor.newshabit.org.key # HTTP 설정은 필요에 따라 주석 처리 가능 # http: # port: 80 harbor_admin_password: Harbor12345 data_volume: /data # 이하 나머지 설정은 이전 예제와 동일...
YAML
복사

6.2. HTTPS 적용 준비 및 Harbor 재시작

Harbor 설치 디렉토리에서 prepare 스크립트를 실행하여 nginx 구성이 변경되도록 합니다.
./prepare
Shell
복사
그리고 Harbor가 실행 중이라면, 기존 컨테이너를 중지하고 새롭게 시작합니다.
docker-compose down -v docker-compose up -d
Shell
복사

pem 키 옮기기

# 암호화 openssl aes-256-cbc -pbkdf2 -in newshabit.pem -out newshabit.pem.enc # 복호화 openssl aes-256-cbc -pbkdf2 -d -in newshabit.pem.enc -out newshabit.pem
Bash
복사

References::