AWS) 기본 사용

나 안해·2023년 2월 28일
0

AWS

목록 보기
2/12
post-thumbnail

리전은 ACM에서만 버지니아 북부를 사용


0. 기본

0.1 객체 종류

객체기능순서비용 부담
RDSDB31(가장 큼)
EC2서버(Rem, Me)22
S3스토리지(SDD)13
다른 개념기능
CFS3와 DNS의 교차지점
DNS도메인

데이터 흐름

후이즈 - CF - Route 53 - S3
R - E - S - CF - DNS

  • R~S : AWS
  • DNS = D + NS(name server)
  • DNS에서 바로 S3로 연결 가능하지만 s3에서 바로 프론트엔드로 연결하는 블로그는 참고하지 마라 CF를 써야돼)
    면접용으로 이해해라

Route53

  • A 레코드 생성

AWS CDP

user → S3 | framework

  • S3의 버킷은 도커의 컨테이너와 같은 개념(html이 들어가는 박스라고 생각해라)

1. AWS 계정 생성 및 설정

순서는 cli를 먼저 실행하고
S3를 실행(버킷없음 오류가 나오면 버킷 생성)
OAC 방식으로 CF 배포

1.1 계정 생성 및 로그인

  • 플랜 선택 시 기본 지원을 선택해야 되는 점만 주의

1.2 CLI(커맨드 라인 인터페이스)

리액트 사용시에는 서버리스 프레임워크를 사용하지만 리액트 같은 프론트 요소가 없는 경우는 CLI를 사용한다

1.2.1 CLI?

AWS 클라우드 리소스를 생성, 편집, 검사하는 방식 중 하나

1) 언제 사용?

리액트 같은 프론트엔드 부문의 작업을 위한 경우는 서버리스 프레임워크를 사용하지만, 프론트엔드부분을 신경쓰지 않는 작업에서는 CLI를 사용

2) 장점

  • 코드(CLI 명령 포함)가 사용자의 변경을 기록
  • 버전 제어(깃 등)하에 코드를 배치하고 변경사항을 효과적으로 관리 => 커밋하면 아마존 내부의 코드도 변경
  • 수동적인 단계의 수행을 줄여서 작업을 빠르게 다시 실행할 수 있다
  • 인적 오류 발생 가능성이 낮다

1.2.2 CLI 설치

 1) 로컬 AWS 환경 설정

  • 액세스 키 만들기
    • 경로 : AWS 사용자 설정 - 보안자격 증명 - 액세스 키 만들기 - 액세스 키, 비밀 액세스 키, .csv 파일 다운로드(!!!이 내용은 절대 커밋 금지)
    • 유닉스계열(맥 등)은 셸 설정에서 환경변수를 추가
    • KMS는 유료 서비스다
  • 설정 확인(아래 코드 차례대로 실행)
    aws --version
    aws s3 li s3://
    aws configure

1.3 S3 버킷 생성

OAC방식

  • OAC 설정시 '웹 사이트 엔드포인트 사용'을 누르면 OAC 설정이 사라지니까 먼저 누르지 말것
  • S3 버킷 액세스
  • 원본 액세스 제어 설정(권장) - 제어설정 생성 : s3로
  • 속성 - 생성한 버킷에서 정적 웹 사이트 호스팅 편집 - 활성화 후 변경사항 저장(CF연결할거니까 테스트목적 아니면 하지 말것)
  • OAC 방식이 아니더라도 ACM(인증서)가 아니면 자신이 사용하는 리전으로 등록해야한다

1.3.1 정책 설정

  • 경로 : 정책 - 버킷 정책 - 새 문 추가 - 아래 코드 입력
    • Action에서는 #CRUD기능을 전부 사용할거면 GetObject 대신 * 입력
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "Statement1",
                "Effect": "Allow",
                "Principal": "*",
                "Action": "s3:GetObject",    
                "Resource": "arn:aws:s3:::버킷명/*"
            }
        ]
    }
  • CORS 코드 추가
    [
        {
            "AllowedHeaders": [
                "*"
            ],
            "AllowedMethods": [
                "HEAD",
                "GET",
                "PUT",
                "POST",
                "DELETE"
            ],
            "AllowedOrigins": [
                "*"
            ],
            "ExposeHeaders": []
        }
    ]
  • CF 사용시 버킷정책
    • "Principal": {"Service":"cloudfront.amazonaws.com"}, - cloudfront.amazonaws.com를 통해서만 권한 부여
    • "Action": "s3:*" :모든 crud를 사용
    • "Condition" : condition == if
    • "StringEquals" : "AWS:SoursArn"의 문자열이 ""과 같다면
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "Statement1",
                "Effect": "Allow",
                "Principal": {"Service":"cloudfront.amazonaws.com"},  
                "Action": "s3:*",                                     
                "Resource": "arn:aws:s3:::seongbae.shop/*",
                "Condition": {                                
                    "StringEquals" : { 
                        "AWS:SoursArn":"클라우드 프론트의 ARN"
                    }
                }
            }
        ]
    }

2. CloudFront

도메인 | CF | S3

  • CF관련 비용 절감 방법
  • CF를 억지로 만들 필요 없이 도메인과 S3를 만들면 알아서 생성된다
    • 그러니까 CF를 먼저 만들지 마라
  • cf의 오리진 = 버킷

2.1 특징

  • 고비용에 더 느리지만 보안에 더 유리
  • S3에서 CF로의 데이터 전송은 요금이 없으나 인터넷으로 전달하는건 비용이 요구된다
  • 같은 리전에서의 전송만 무료니까 설정시 자신이 속한 리전을 설정

2.2 사용

  • 그냥 버킷 생성한것과 달리 퍼블릭 액세스를 차단한 버킷 사용

2.2.1 DNS 연결(아마존은 Route53)

  • route53 - 시작하기 - 호스팅 영역 생성
    • NS(Name Server), SOA가 생겼는지 확인 (NS, SOA에 대한 설명 참고)
  • 값/트래픽 라우팅 대상에 있는 값을 NDS에 등록 (이번에는 가비아에서 도메인을 받음. 상세설명은 여기)
    • 등록 장소 : 가비아 - My가비아 - 도메인 - 관리 - 네임서버 설정
      • 가비아는 NS의 마지막 '.'을 지워야 한다

2.2.2 CNAME 등록

AWS에서

  • AWS Certificate Manager에서 인증상태 확인
    인증이 안된 상태면 route53에 레코드 자동 생성을 눌렀는지 생각해보자
  • 도메인 - CNAME 확인
  • 'Route53에서 레코드 생성' 클릭
    • 한 번 지운 경우는
    • Route53 - 호스팅 영역에서 CNAME이 생기면 된다
      • A 레코드를 추가하면서 'ping 주소'나온 IP입력

가비아에서

  • My가비아 - DNS 관리툴 - DNS설정
    • 호스트 : ~.com은 @ / www.~.com은 www(이때 www를 쓴다면 값도 www가, admin을 쓰는 주소라면 admin.이 포함돼야 한다)
    • 값/위치 : AWS에서 카피한 CNAME 이름 입력
    • TTL:3600

가비아에서 제대로 등록됐는지 확인하는 방법

  • cmd에서 'ping 주소' 입력
  • 후이즈 도메인 검색
  • 결과가 안나올 경우 ping 네임서버 1차 주소를 넣고 나온 값을 사용해서 A레코드를 만든다
  • 후이즈 통과 후 CF로 이동

2.2.3 CF 배포

  • cloundfront 생성에서 원본 도메인 선택하고 여기를 참고
    • 가격 분류는 본인이 사용할 리전이 속해있는 곳에 해야 과한 비용을 막을 수 있다
    • CNAME 추가('www.주소.com'과 '주소.com'을 둘 다 해야한다) -> A 레코드로 연결했으면 CNAME의 값을 도메인 이름으로 해도 괜찮다
    • ACL를 사용하기 위해서는 먼저 아마존에서 사용하는 DNS인 Route53을 먼저 설정해야 한다(2.2 CNAME 등록 참고)
    • SSL은 optional로 되어있지만 보안 요소라 사실상 필수
    • IPv6: off(필수는 아니고 수업에서는 일단 off로 지정함 디폴트는 on)
  • 버킷과 연결
    • Amazon S3 - 버킷 - 권한 - 버킷 정책 편집에서 CF의 ARN추가
    "Condition": {
        "StringEquals": {
            "AWS:SoursArn": "배포하는 CF의 ARN"
        }
    }

2.3 CF 주의사항


3. EC2

3.1 보안그룹 확인

보안그룹 생성은 설정 필기에서 확인

3.2 인스턴스 생성

경로 : EC2 - 인스턴스 - 인스턴스 생성

  • 우분투 선택
  • 인스턴스 시작 후 PuTTY 사용
    • .pem을 .ppk로 하는건 Puttygen사용
  • 퍼블릭 ip를 입력하고 세이브 (먼저 있던 경우는 )
  • Connection - SSH - Credentioal에서 .ppk 연다

3.2.1 install java

참고

sudo apt-get update
sudo apt-get install -y --no-install-recommends tzdata g++ git curl
sudo apt-get update
sudo apt-get install openjdk-11-jdk
java -version
javac -version
vim ~/.bashrc

  • i 입력으로 insert로 두고 가장 아랫줄에
    export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
    export PATH=$PATH:$JAVA_HOME/bin 추가
  • Esc 누르고 :wq!
    source ~/.bashrc 설정 적용
    echo $JAVA_HOME

3.2.2 intall python

sudo apt update
sudo apt-get install -y python3-pip python3-dev
sudo apt install software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa

3.2.3 pip3 pip로 변경

cd /usr/local/bin
sudo ln -s /usr/bin/pip3 pip
pip3 install --upgrade pip

3.2.4 sudo apt-get clean

3.2.5 install nginx

  • 설치
    sudo apt-get update
    sudo apt-get install nginx
    sudo systemctl start nginx
  • /etc/nginx/sites-available 내 file에 쓰기 권한이 없으므로 chmod를 쓰기 권한을 추가해준다.
    sudo chmod 775 /etc/nginx/sites-available
  • nginx config 추가:
    cd /etc/nginx/sites-available && vim <서버이름>

퍼미션 에러 나오면 앞에 sudo를 붙혀준다.

AWS route53에서 도메인을 추가한다. A record를 생성하기 위해서는 고정된 IP 주소가 필요하다. lightsail 인스턴스에서 고정된 public IP를 생성해 A record에 연결한다. 생성한 도메인은 nginx conf에 추가한다.

server{
       server_name <your-site-domain>;
       location / {
           include proxy_params;
           proxy_pass http://사용할 IP:8000;
       }
}
  • symlink: sites-available/ → sites-enabled
sudo ln -s /etc/nginx/sites-available/<your-server-name> /etc/nginx/sites-enabled/  

3.2.6 run app

git clone <your-server-repo>
cd /var/www
git clone <server-repo>
cd <server-repo>

  • nginx 확인 :
    sudo nginx -t
  • restart nginx:
    sudo systemctl restart nginx.service
    - 안되면 sudo systemctl restart nginx

    failed가 나올 경우 putty에서 /etc/nginx/sites-available과 /etc/nginx/sites-enabled/에 둘 다 같은 vim 파일이 있는지 확인한다.

  • gunicorn으로 ASGI 서버 실행 :
    python3 -m gunicorn -k uvicorn.workers.UvicornWorker main:app

연결 확인

  • route 53에 레코드를 CNAME으로 들어간 놈을 A로 바꾸고 그 레코드에 고정 IP(탄력적 ip)로 입력했는지 확인
  • putty의 vim 파일이 아래 같은 모양인지 확인
  server{
	server_name 사용할 도메인 이름;
	location /{
		include proxy_params;
		proxy_pass http://사용할 IP:8000;
	}
}  

! 사용할 IP자리에 사용하기 위해 받은 탄력적 IP를 넣었을 때 실패

  • 사용할 IP에 127.0.0.1(로컬호스트)을 주로 사용하는 이유는 EC2 자체가 하나의 PC이기 때문에 로컬로 돌리는 것이기 때문에다

3.3 EC2와 서브 도메인 연결

루트 도메인을 이미 사용했으므로 새 인증서를 요청
참고

인증이 완료돼서 CNAME을 얻으면 가비아로 가서 등록

3.3.1 탄력적 IP를 사용

  • 할당

  • 확인

  • EC2 연결

3.? putty 사용

EC2의 인스턴스에서 사용할 인스턴스 재시작

Putty에서 .ppk 실행

  • 푸티의 ip는 'EC2- 인스턴스'에서 우클릭 후 연결을 선택해서 여기에 있는 퍼블릭 IP 입력

error

도메인 주소로 접속시 주소 앞에 '주의 요함'이 나오는 경우

원인

  1. 배포한 CF에 인증서인 SSL이 없는 경우

해결

s3은 되는데 CF가 안되면?

원인

route53 문제

해결

  • 호스팅 영역 삭제 후 다시 만들어라 (영역 삭제가 안되면 A, CNAME 레코드를 삭제 후 영역 삭제를 진행하면 된다)
  • A 레코드의 값을 ip가 아니라 CF의 배포 도메인 이름으로 바꿔준다(별칭 활성 - CF 엔드포인트 선택 배포 도메인 이름 입력)

!!! 동적 ip를 사용하는 경우는 퍼블릭 엑세스 차단 활성화 + CORS 코드 삭제

  • 자동으로 안들어오는 경우 대체 CF에서 도메인 이름을 설정하면 해결된다

Errors

504 Gateway Time-out


기타

  • AWS CDP

  • 아마존에 넣고 서버 구축이 정석이지만 깡통으로 서버 만들고 하는게 안전하다

  • 누르지마

    • AR & VR
    • 블록체인

참고한 기록

0개의 댓글