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
  • Route 53 호스팅 영역에 레코드 생성

(현재 나는 aws 상에 호스팅 영역이 있다. 구매했었음.)

호스팅 영역에 들어가 레코드 생성을 해보자.

원하는대로 설정해준다..

나는 CloudFront로 해당 도메인을 사용해 정의할 예정이다.(CloudFront 배포를 이미 생성했음.)

 

  • CloudFront 배포 설정

생성해둔 배포 설정으로 들어간다.

대체 도메인 이름에 아까 Route 53에서 생성했던 레코드를 넣어주고 해당 사용자 정의 SSL 인증서도 받아야 한다.

  • AWS ACM 인증서 생성

AWS ACM을 통해 쉽게 생성이 가능하다. ACM을 생성할 땐 해당 인증서로 들어가서 인증서에 맞게 레코드 생성을 또 해줘야 한다.(Route 53 레코드에 해당 인증서에 대한 CNAME 레코드가 생성되어야 함.)

 

변경 사항을 저장하고 조금 더 기다린 뒤에 대체 도메인 이름을 사용해 들어가보자!

+ Recent posts