Amazon Elastic Container Service(ECS)

  • 컨테이너화된 애플리케이션의 손쉬운 배포, 관리 및 조정에 도움이 되는 완전 관리형 컨테이너 오케스트레이션 서비스
  • "ECS Anywhere": 온프레미스 또는 클라우드 모두에서 ECS에서 확인하려는 유사한 클러스터 관리, 워크로드 예약 및 모니터링 이용 가능
  • 오케스트레이터: 컨테이너 배포, 컨테이너 상태 확인, 상태가 좋지 않은 노드 교체, 새 배포 처리를 통해 컨테이너의 수명 주기 관리

https://tech.cloud.nongshim.co.kr/2021/08/30/%EC%86%8C%EA%B0%9C-amazon-ecs%EB%9E%80/

구성 요소

  • Cluster: 클러스터에 배포된 모든 컨테이너를 그룹화하는 논리적 구조
  • Task definition: 컨테이너 이미지 위치, CPU 및 메모리 용량, 로그 구성 등과 같은 속성을 포함
  • Task: 클러스터 내 태스크 정의를 인스턴스화
  • Service: 클러스터에서 원하는 수의 태스크를 동시에 실행하고 유지 가능
  • ECR: Amazon에서 제공하는 컨테이너 이미지 저장소

시작 유형

  • Fargate: 서버리스 컴퓨팅 엔진
  • EC2
  • External: 온프레미스 서버 또는 가상 머신

실습

  • VPC 생성

퍼블릭 서브넷 2 / 프라이빗 서브넷 2

퍼블릭 rtb에 igw 추가

 

  • 보안그룹

(docker 설치 및 dockerfile 만들 ec2 보안그룹) ssh만 열어주자

(로드 밸런서 보안그룹) HTTP 열어주자

(컨테이너 보안그룹) private subnet 배치, alb에서만 받아오자

 

  • docker 환경 구축

ec2 인스턴스 생성

위에서 생성했던 vpc와 sg 적용 시키기, 퍼블릭 ip 활성화

(❗ vpc 적용시킬 때 public인지 확인해라...)

 

이후에 ssh 접속 해서 docker 설치를 해보자!

sudo -s
yum install -y docker
service start docker | systemctl start docker
docker images

docker images 명령어 입력 후 위의 그림과 같은 화면이 나오면 성공적으로 설치된 것.

 

dockerfile 작성

mkdir dockerfile-folder
cd dockerfile-folder/
vi index.html

//index.html
<!doctype html>
<h1>hello ecs!</h1>

vi dockerfile

//dockerfile
FROM nginx:latest
MAINTAINER "kim.jaewook@classmethod.jp"

COPY ./index.html /usr/share/nginx/html/index.html

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

docker build -t ecs-nginx .

docker images 명령어를 입력해보면

위와 같이 업로드를 확인할 수 있다.

ECR로 이미지를 푸시하기 전 현재 생성한 docker image가 정상 작동하는지 테스트 해보자.

(create 명령어로 container 생성)

docker create -i -t --name ecs-nginx-container -p 8000:80 ac167921553f //ecs-nginx image id

컨테이너 아이디를 확인하고 start 명령어로 컨테이너 실행

docker ps -a
docker start 362972fc9628 // container id

ec2 보안그룹에서 8000번 포트 열고 확인!

컨테이너는 필요없으니 삭제 해주자

docker stop 362972fc9628
docekr rm 362972fc9628

 

  • ECR 리포지토리 생성

이름은 docker image와 같게 만들자.

 

  • EC2에서  프로필 설정

 ECR에 이미지를 푸시하기 위해선 EC2에 IAM Role이 연결되어 있어야 한다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecr:Describe*",
                "ecr:Get*",
                "ecr:BatchCheckLayerAvailability",
                "ecr:BatchGetImage"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ecr:PutImage",
                "ecr:InitiateLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:CompleteLayerUpload",
                "ecr:BatchDeleteImage"
            ],
            "Resource": [
                "arn:aws:ecr:REGION:AWS_ACCOUNT_ID:repository/REPOSITORY_NAME"
            ]
        }
    ]
}

나는 위의 내용을 정책으로 만들고 만든 정책으로 역할을 생성했다.

역할을 업데이트 해준다.

 

  • ECR 로그인
$ aws ecr get-login-password --region REGION | docker login --username AWS --password-stdin AWS_ACCOUNT_ID.dkr.ecr.REGION.amazonaws.com/리포지토리

로그인 성공!

 

  • ECR Push

해당 명령어들을 따라간다..(얘는 ECR 리포지토리 선택 후 '푸시 명령 보기' 클릭하면 나옴..)

2번까진 위에서 테스트 했기 때문에 3번 명령어부터 진행하면 된다.

3번 명령어 까진 실행이 잘 되었다는 것을 알 수 있음.(TAG 명령어)

4번 명령어 실행하면

이와 같은 오류가 뜬다. 아마 aws configure 문제 일듯?

IAM user를 생성한다.

후에 aws configure 작업 진행

ECR 리포지토리의 권한도 설정해준다.(귀찮으니까 모든 사람으로 설정해버림)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowPushPull",
      "Effect": "Allow",
      "Principal": "*",
      "Action": [
        "ecr:BatchCheckLayerAvailability",
        "ecr:BatchGetImage",
        "ecr:CompleteLayerUpload",
        "ecr:GetDownloadUrlForLayer",
        "ecr:InitiateLayerUpload",
        "ecr:PutImage",
        "ecr:UploadLayerPart"
      ]
    }
  ]
}

다시한번 더 4번 명령어(push) 하면 성공이다.

위와 같이 이미지가 잘 올라간 것을 볼 수 있음!

 

❗ 글이 길어지니까 ECS 구축 관련한 내용은 다음 포스팅에 올리자.. ❗

'Cloud > AWS' 카테고리의 다른 글

[AWS] Cloud9 - Github 연동  (0) 2022.09.16
[AWS] ECS 실습 -2(ECS 구축)  (0) 2022.09.15
[AWS] ECS에 HTTP API 구축  (0) 2022.09.13
[AWS] Mobile Backend 구성  (1) 2022.09.08
[AWS] AWS Amplify -1(Amplify Studio)  (0) 2022.09.07

https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/http-api-private-integration.html#http-api-private-integration-create-api

"VPC에서 실행되는 ECS 서비스에 연결하는 서버리스 API 생성"

아무래도 api gateway의 경우 서버리스(lambda, ecs와 같은) 서비스와 함께 사용된다.. 

api gateway + lambda는 저번에 해봤으니까..

이번엔 api gateway + ecs다!(http api 구축이랑 rest api 구축이랑 콘솔 디자인이 다르다.. rest 꾸짐)

VPC link

(그림 아래의 사이트에 들어가 cloudformation 템플릿으로 한번에 올려서 테스트가 가능함..)

나는 차례대로 한 번 따라가 볼 예정!


  • ECS 생성(ALB를 사용하는 ECS 서비스 생성)

문서에서 제공하는 템플릿을 cloudformation에 스택을 올린다.(template.yaml)

관련된 서비스들이 어떻게 올라갔는지 확인해보자.

1. VPC

vpc 안에 public subnet 2개 / private subnet 2개 생성

ngw의 경우 public subnet에 2개 생성(private rtb과 각각 연결) - 이중화를 기본으로 하는 듯

 

2. ECS

클러스터 생성

태스크 정의 생성

태스크 역할: https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/task-iam-roles.html

태스크 실행 역할: https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/task_execution_IAM_role.html

 

태스크 실행 후에 서비스 배포(태스크 정의 카테고리에서 작업 → 태스크 실행 / 서비스 생성 해야 바로 ELB 붙일 수 있음..)

Task: Task definition 대로 배포된 container set(cluster에 속한 container instance에 배포됨)

Service: Task들의 라이프 사이클 관리(Task를 cluster에 몇 개 배포할 건지, ELB 관리, Auto Scaling 관리)

 

3. ALB

alb 생성(스키마: 내부 / 가용영역: private /보안그룹: 인바운드 80포트 - all ipv4)

listener(80포트 - 대상 그룹)

대상 그룹: ecs의 태스크 ip 등록

(얘는 서비스 생성 전에 만들어야 위의 서비스 생성 과정에서 ALB 붙일 수 있을듯?)

❗ 위의 내용은 나중에 따로 혼자서 해보는걸로... 현재는 그냥 cloudformation 템플릿 사용해서 올렸을 뿐 ❗

 

  • VPC link

api gateway → vpc link 클릭

서브넷의 경우 private들 선택

보안그룹 없어도 됨

 

  • HTTP API

api gateway → http api build

경로는 나중에 생성할 예정

  • 경로 생성

  • 통합 생성

경로 선택 → 통합 대상(프라이빗 리소스) → 수동 선택 → ALB/NLB(ALB 선택) → 리스너(HTTP 80) → VPC link 선택

 

  • API Test

api url에 들어가면 아래와 같은 화면을 얻을 수 있음.

새로 고침 여러번 누르고 ecs 서비스 상태를 확인해보면

다음과 같이 잘 동작하고 있는 것을 확인할 수 있다...

 

 

❗ 아직 ecs의 개념이 확실치 않으니 다음에는 ecs 정리편으로 돌아오겠다.. ❗

'Cloud > AWS' 카테고리의 다른 글

[AWS] ECS 실습 -2(ECS 구축)  (0) 2022.09.15
[AWS] ECS 개념 + 실습 -1(Docker image push)  (1) 2022.09.14
[AWS] Mobile Backend 구성  (1) 2022.09.08
[AWS] AWS Amplify -1(Amplify Studio)  (0) 2022.09.07
[AWS] Lambda와 RDS 연동(+ API Gateway)  (0) 2022.09.06

앱 백엔드 구성 관련한 내용으로 진행하면서 고민했던 내용들이다.


웹 / 앱 백엔드를 구성할 때 차이점이 있나?

  • 제일 헷갈렸던 부분. 웹 백엔드 같은 경우는 직접 해봐서 어떤 느낌인지 아는데 앱 개발 관련해선 해본적이 없다..
  • 사실 상 크게 다른 건 없는 것 같다.
  • 단, 모바일(앱)의 경우 프론트 자체에서 많은 기능을 수행한다. 백엔드가 사용되는 경우는 주로 미디어 업로드, 데이터 전송 및 동기화 등 인데 이는 API 기반 동작이 대부분이다.
  • 이번에 다룰 내용은 그래서 모바일 백엔드 구성이지만, API 서버 구축 느낌에 가까울 것 같다.

기본적인 백엔드 서버

  • ELB + EC2 / ECS / EKS 의 경우, 더 많은 제어가 필요할 때(서버가 있는 완전 기본적인 백엔드)
  • API Gateway + Lambda의 경우, 서버리스 백엔드로 운영 포인트를 최대한 줄일 수 있음
  • 위는 진짜 간단하게 사용하는 느낌이고, 사실상 저기에 서비스들을 더 추가하면서 만들어 나가야함..

서버리스 백엔드

  • 각 기능마다 AWS 서비스를 매칭 해보자.

  • AWS에서 제공하는 아키텍처

https://docs.aws.amazon.com/ko_kr/whitepapers/latest/serverless-multi-tier-architectures-api-gateway-lambda/mobile-backend.html

  • 이런 식으로 사용하게 되는데, 보통 데이터를 가져오는 api가 주가 될 것이다. 이를 "api gateway + lambda + rds / dynamoDB" 가 한다고 생각하면 된다.
  • 여기서 의문점이 든건 Cognito의 역할이다. 왜 API Gateway에 연결되서 User Pool로 보호를 시킬까?

Cognito + API Gateway

  • Cognito: AWS에서 제공하는 모바일 인증 및 보안을 위한 서비스
  • API Gateway: API를 관리할 수 있음

https://mydeveloperplanet.com/2022/01/25/how-to-secure-aws-api-gateway-with-cognito-user-pool/

1. client가 cognito를 통해 로그인

2. 로그인에 성공하면 cognito가 id_token을 가지고 client로 돌아감

3. client는 id_token을 가지고 API Gateway에 요청 보냄

4. API Gateway는 cognito에서 id_token이 유효한지 확인

5. cognito는 id_token이 유효하면 API Gateway에게 허락으로 응답

6. API Gateway는 요청을 Lambda에 전달

7. Lambda 함수는 실행 후 API Gateway에게 응답

8. API Gateway는 Client에게 응답

  • 위와 같은 절차를 밟게 된다. 꼭 Cognito를 사용하지 않아도, IAM 역할 및 정책, Lambda 권한 부여자(사용자 지정 권한 부여자)를 사용해도 괜찮다..
  • 하지만 Cognito를 사용하는 추세인듯? 결국, API Gateway를 보호하고자 하는 느낌이다.
  • API Gateway 보안: IAM Permissions / Lambda Authorizer / Cognito User Pools

 

 

'Cloud > AWS' 카테고리의 다른 글

[AWS] ECS 개념 + 실습 -1(Docker image push)  (1) 2022.09.14
[AWS] ECS에 HTTP API 구축  (0) 2022.09.13
[AWS] AWS Amplify -1(Amplify Studio)  (0) 2022.09.07
[AWS] Lambda와 RDS 연동(+ API Gateway)  (0) 2022.09.06
[AWS] CloudFront 사용 이유  (0) 2022.08.29

오늘은  Amplify 다! iOS 앱 구축을 AWS에서 하는 방법을 찾아보다가.. Amplify 만 주구장창 나오길래 일단 조져본다.

(현재 mac이 없는 관계로 다른 언어로 먼저 테스트 해보고 나중에 mac OS 클라우드로 해봐야지!)


AWS Amplify?

확장 가능한 풀 스택 웹 및 모바일 앱을 더 빠르게 구축 한다.
  • 도구: Amplify Studio / Amplify Hosting / Amplify Library / Amplify CLI
  • 기능: https://aws.amazon.com/ko/amplify/features/?nc=sn&loc=3&dn=5 

도구 하나씩 알아보자~!

 

Amplify Studio

  • 풀스택 웹 및 모바일 앱을 구축하기 위한 시각적 개발 환경 제공
  • 기존의 Amplify의 백엔드 구축 기능을 기반으로 UI 개발 까지 빠르게 가능

관련한 간단한 실습

https://sandbox.amplifyapp.com/getting-started : 실습 링크

  • Sandbox 버전(결국 배포하려면 AWS 계정 필요함)

나는 To-do list를 React로 만들어 볼거다.

먼저 Data modeling 과정 진행한다.

이와 같은 화면을 볼 수 있는데 차례로 명령어 수행하면 된다..(난 Windows cmd에서 진행할 예정)

그냥 자기 환경에서 잘 실행하면 될 듯...?

2단계 Install Amplify Library and initialize Amplify 에서 index.js 고치라고 되어있는데 이는 myapp/src 폴더 안에 있다.

이와 같이 상단에 추가해주면 됨! (최상단에 넣으면 오류나니까 react import 뒤 쪽으로 넣어주자!)

❗이것도 맞게 한건지 모르겠음...ㅋㅋㅋㅋㅋ

Amplify DataStore CRUD APIs 테스트 해보라는데... 뭐라는거지? (얘는 잘 모르겠다..)

 

일단 배포부터 해보자.

위는 amplify console 상의 내가 배포한 앱이다. Studio 시작을 눌러보자.

위와 같이 Studio를 확인할 수 있다.. 그럼 이어서 일단 진행해보자!

나는 코드 잘 모르니까.. 콘솔에서 진행하련다!

자동 생성으로 5개 정도 집어넣었다.(귀찮)

유저 관리 느낌인데, 원하는대로 설정해보자!(종류 보면 기존의 Cognito도 가져올 수 있는듯?)

가입 구성도 마음대로 정할 수 있다.

배포를 누르면 진행되는데,

이 과정은 "authentication → amplify → cognito(user pool) → cognito(identity pool) → deploy" 순이다.

배포가 완료되면 해당 명령어를 수행하고 본인 환경대로 선택해서 진행하면 된다.(Visual Studio Code → javascript react)

로컬 폴더에 알아서 추가가 되긴 하는데.. 일단 이런 느낌이다만 오늘 알고 가는걸로 하려고 한다.

(사실 주어진 코드를 어디에 집어 넣어야할지 모르겠... 더 찾아보고 다시 해봐야지!)

이와 같이 할 수 있는 기능도 다양하다.. 언젠간 하나씩 다 보는걸로ㅠㅠ

 

❗ 오늘 시간 관계상 Amplify Hosting은 다음에 알아보자.. 2에서 만나요~ ❗

'Cloud > AWS' 카테고리의 다른 글

[AWS] ECS에 HTTP API 구축  (0) 2022.09.13
[AWS] Mobile Backend 구성  (1) 2022.09.08
[AWS] Lambda와 RDS 연동(+ API Gateway)  (0) 2022.09.06
[AWS] CloudFront 사용 이유  (0) 2022.08.29
[AWS] CloudFront와 Route 53 연결  (0) 2022.08.29
  • IAM 역할 생성(AWS 서비스 - Lambda에 연결할 예정)

위처럼 해당 정책들을 연결해준 역할을 생성한다. (나중에 Lambda에 연결할 것..)


  • Lambda 함수 생성

위에서 생성했던 역할을 연결해준 후 함수 생성!


  • Lambda에 MySQL 종속성 지원

로컬 상에서 작업하면 된다.(Window의 경우 cmd에서 작업)

나는 로컬 C에 test 폴더를 생성해주고 그 안에서 작업했다.

cd C:\test
# 초기화 설정은 원하는대로 (나는 default로 진행함)
npm init
npm install --save mysql

해당 명령어들을 차례로 입력하면 아래와 같이 생성된다.

파일들을 zip으로 묶어준다.(test.zip)

생성했던 lambda 함수에 zip파일을 올려준다.

위와 같이 올리면 완료!


  • RDS 생성

해당 설정들 중 마스터 사용자 이름, 마스터 암호는 잘 기억을 해두자!

나머지 설정들은 원하는대로 설정한 뒤 생성하면 된다.

(나의 경우: 인스턴스 클래스는 t3.micro / 스토리지 gp2, 자동 조정 비활성화 / 대기 인스턴스 생성 안하게 / 기본 vpc / 데이터베이스 암호 인증 / 자동 백업 비활성화 등..)

아! 지금은 간단하게 테스트 용 DB라 퍼블릭 액세스는 허용으로 진행했다.(뒤에 Workbench랑 쉽게 연결하려고...)

해당 RDS 생성에는 시간이 걸린다. 여유롭게 기다리자! (참고로 RDS 생성 뒤 엔드포인트가 필요하다.. 복사해두자!)


  • Lambda와 RDS Connection Test

먼저 lambda에 index.js 파일을 생성해줄 차례다.

//index.js
const mysql = require('mysql'); 
const connection = mysql.createConnection({ 
//following param coming from aws lambda env variable 

  host: process.env.RDS_LAMBDA_HOSTNAME,  
  user: process.env.RDS_LAMBDA_USERNAME, 
  password: process.env.RDS_LAMBDA_PASSWORD, 
  port: process.env.RDS_LAMBDA_PORT, 
  // calling direct inside code  
  connectionLimit: 10,   
  multipleStatements: true,
 // Prevent nested sql statements 
  connectionLimit: 1000,   
connectTimeout: 60 * 60 * 1000, 
  acquireTimeout: 60 * 60 * 1000, 
  timeout: 60 * 60 * 1000, 
  debug: true 
});

exports.handler = async (event) => { 
  try {    
 const data = await new Promise((resolve, reject) => {
       connection.connect(function (err) {   
      if (err) {      
     reject(err);     
    }        
 connection.query('CREATE DATABASE testdb', function (err, result) {  
         if (err) {  
           console.log("Error->" + err);     
        reject(err);        
   }         
  resolve(result);  
       });     
  })  
   }); 
    return { 
      statusCode: 200,  
     body: JSON.stringify(data)   
  } 
  } catch (err) {    
 return {   
    statusCode: 400,   
    body: err.message 
    } 
  }
 };

해당 환경변수를 알맞게 설정한다.(HOSTNAME은 RDS의 엔드포인트)

해당 코드를 Deploy한 뒤에 Test를 진행한다.

저장 후에 Test 버튼을 누르면 다음과 같은 결과를 얻을 수 있다.(DB 정보에 대한 내용..)

MySQL Workbench에 rds를 연결해 확인해보면 아래와 같이 테이블이 생성되어있음을 볼 수 있다. (위의 코드단에 DB 테이블 생성 관련 코드 있음.)


  • api test (event 생성)

아래의 코드를 Workbench를 통해 DB에 적용시켜라.

use testdb; 

CREATE TABLE `Employee` ( 
  `emp_id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
  `emp_name` varchar(100) DEFAULT NULL,      PRIMARY KEY (`emp_id`)    ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
insert into Employee values(1,'Vaquar khan'); 
insert into Employee values(2,'Zidan khan');

위와 같이 테이블 생성과 데이터 삽입이 잘 이루어진 것을 확인하자.

다음으로 다시 Lambda로 돌아와 index.js에 코드를 변경해주자.

const mysql = require('mysql'); 
const connection = mysql.createConnection({ 
//following param coming from aws lambda env variable 

  host: process.env.RDS_LAMBDA_HOSTNAME,  
  user: process.env.RDS_LAMBDA_USERNAME, 
  password: process.env.RDS_LAMBDA_PASSWORD, 
  port: process.env.RDS_LAMBDA_PORT, 
  // calling direct inside code  
  connectionLimit: 10,   
  multipleStatements: true,
 // Prevent nested sql statements 
  connectionLimit: 1000,   
connectTimeout: 60 * 60 * 1000, 
  acquireTimeout: 60 * 60 * 1000, 
  timeout: 60 * 60 * 1000, 
  debug: true,
  database:'testdb'
});

exports.handler = async (event) => { 
  try {    
 const data = await new Promise((resolve, reject) => {
       connection.connect(function (err) {   
      if (err) {      
     reject(err);     
    }        
 connection.query('use testdb', function (err, result) {  
         if (err) {  
           console.log("Error->" + err);     
        reject(err);        
   }         
  resolve(result);  
       });     
  })  
   }); 
    return { 
      statusCode: 200,  
     body: JSON.stringify(data)   
  } 
  } catch (err) {    
 return {   
    statusCode: 400,   
    body: err.message 
    } 
  }
 }; 

 exports.handler = (event, context, callback) => {  
   console.log('inside lambda...'+event.emp_id) 
  // allows for using callbacks as finish/error-handlers 
  context.callbackWaitsForEmptyEventLoop = false; 
  const sql = "select * from Employee where emp_id = " + event.emp_id;  
  connection.query(sql, function (err, result) {   
  if (err) throw err; 
    callback(null, result)
   }); 
};

새로운 테스트 이벤트를 만들어준다.

{ "emp_id":1, "emp_name":"xyz" }

코드를 테스트 해보면

이와 같은 결과를 얻을 수 있다.

 

밑작업은 끝났고 API Gateway를 생성하자.

나는 REST API를 생성할 것이다.

API 생성 후에 메서드 GET도 생성해준다.

GET을 선택하고 체크 표시를 선택하면 다음과 같은 화면을 볼 수 있다. 아까 생성한 Lambda 함수 이름을 넣고 저장하자.

권한 부여도 한다고 해주자.. 그 뒤에 다시 작업에서 API 배포를 해주자!

함수를 다시 테스트 해보면

이와 같은 트리거가 추가된 것을 볼 수 있다.

 

❗ 확인이 필요...ㅠ ❗

근데, API URL로 확인(Postman)해보면 에러 뜨네...? 왜그럴까?

→ 위의 코드단에서 수정이 필요할 듯.. const sql = " 쿼리문 " 이 부분을 인식을 못하는 것 같다...?

'Cloud > AWS' 카테고리의 다른 글

[AWS] Mobile Backend 구성  (1) 2022.09.08
[AWS] AWS Amplify -1(Amplify Studio)  (0) 2022.09.07
[AWS] CloudFront 사용 이유  (0) 2022.08.29
[AWS] CloudFront와 Route 53 연결  (0) 2022.08.29
[AWS] CloudFront 배포  (0) 2022.08.29

보통 CloudFront는 S3와 같이 다니는 짝꿍이라고 생각하면 된다.

S3 안의 content를 캐시를 해주는 CDN 서비스 느낌?

어쨌든, 장점을 정리해보자!


  • Static Content Delivery

아마 이게 제일 잘 알려진 장점일 것 같다.

위에서도 언급했듯 캐시를 활용해 빠르고 안전하게 정적 콘텐츠를 전송한다.

 

  • Dynamic Content Delivery

이 경우는 아직까지도 잘 모르겠다.. 동적으로 사용되는 콘텐츠라 캐시가 의미가 없다.(TTL=0)

보통 전송 성능 향상된다고 하는데.. 

(전체 응답 시간: DNS Lookup + TCP Connection + Time To First Byte + Contents Download)

사용자와 Edge 간 연결 시 최적의 루트이고 Origin과의 지속적인 연결 유지, Gzip 압축 사용 등이 있다고 하긴 한다.

사실 나에겐 잘 와닿진 않는다! 😑

그래도 비용적인 측면에서 많은 도움이 된다. aws 리소스들과 cloudfront 연결 까지의 비용은 들지 않고 cloudfront와 사용자 간의 비용이 들기 때문에 비용 절감엔 도움이 될 듯...?

 

  • Origin Selection

단일 배포에서 여러 Origin의 Contents를 경로 패턴으로 처리 가능하다.

멀티 오리진 사용할 때 비용 절감에 도움을 많이 줄 것 같다!(보통 alb(웹) + S3(이미지/동영상) 이렇게 많이들 사용하는듯?)

 

  • Cross-Origin Resource Sharing(CORS)

원본 리소스 쉐어링을 통해 같은 도메인에서 서비스가 가능하다.

웹 브라우저에서 보안상의 이유로 도입되었다.

(사용자가 접속한 웹 애플리케이션이 다른 오리진에서 리소스를 불러올 때 해당 헤더를 보내주지 않으면 브라우저가 그 리소스를 거부하는 보안 정책)

참고로, Origin에도 CORS 설정 해주고, CloudFront에도 CORS 설정이 필요함.

 

  • HTTPS Support

SSL 인증서를 활용해 HTTPS를 지원해준다.

사용자 입장에선 CloudFront 뒷단에서 어떻게 통신하는지 몰라도 되는 그런 느낌..

Browser - (HTTPS) - CloudFront - (HTTP) - Origin(ELB - EC2) 이런 느낌..!

 

  • Signed URL, Signed Cookie

배포되는 Contents에 대한 보호 및 세부 제어 가능

유료 콘텐츠를 제공할 때 사용하면 괜찮음(인증된 사용자에게만 콘텐츠를 주는 느낌~, 유튜브 팬가입에 활용 가능)

 

  • Origin 보호

사용자가 직접 오리진으로 접근하지 못하게 막아줌(CloudFront만 접근 가능)

S3의 경우 OAI(Origin Access Identify)를 사용해 접근을 막는다.

(OAI: S3 버킷에서 프라이빗 객체를 가져올 수 있는 CloudFront 배포 권한을 부여하는 데 사용되는 가상 사용자 ID, 퍼블릭 액세스를 막을 수 있음. 정적 웹 호스팅으로 하게 되면 퍼블릭으로 버킷이 열림.)

 

  • WAF(Web Application Firewall)

해당 서비스와 통합되어 L7 의 공격으로부터 사이트 보호가 가능하다.

웹 ACL 연결해서 방어하는 느낌!

'Cloud > AWS' 카테고리의 다른 글

[AWS] AWS Amplify -1(Amplify Studio)  (0) 2022.09.07
[AWS] Lambda와 RDS 연동(+ API Gateway)  (0) 2022.09.06
[AWS] CloudFront와 Route 53 연결  (0) 2022.08.29
[AWS] CloudFront 배포  (0) 2022.08.29
[AWS] AWS로 구축하는 3 Tier Architecture  (0) 2022.02.23

+ Recent posts