- 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 |