• 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

+ Recent posts