Lambda는 서버를 프로비저닝하거나
관리하지 않고도 코드를 실행
할 수 있게 해주는 컴퓨팅 서비스입니다. Lambda는 고가용성 컴퓨팅 인프라에서 코드를 실행하고 서버와 운영 체제 유지 관리, 용량 프로비저닝 및 자동 조정, 코드 및 보안 패치 배포, 코드 모니터링 및 로깅 등 모든 컴퓨팅 리소스 관리를 수행합니다. Lambda를 사용하면 거의 모든 유형의 애플리케이션 또는 백엔드 서비스에 대한 코드를 실행할 수 있습니다. Lambda가 지원하는 언어 중 하나로 코드를 공급하기만 하면 됩니다.
Nodejs로 코드를 작성시, 특정 라이브러리들을 import하기 위해서는 다음과 같은 작업이 필요하다
로컬호스트에 nodejs 14.x 설치
brew install node@14
필요한 라이브러리 다운로드
package
npm i axios
npm i date-utils
nodejs.zip으로 압축 후 계층 생성
계층 및 버전 적용
해당 트리거 및 추가해야하는 트리거는 권한을 부여 받는다
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListObjectsInBucket",
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::버킷이름"
]
},
{
"Sid": "AllObjectActions",
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::버킷이름/*"
]
}
]
}
crontab으로 시간을 지정하여 람다를 관리할 경우 AmazonCloudWatchEvents
를 요청
requestParameter를 해당 코드에 직접 명시한 이유는, EventBridge에 직접 파라미터값을 명시하는 경우, text형식으로 직접 입력을 해야한다.
가시성이 매우 떨어지며 추후 get방식에서 날짜에 대한 가변값을 정의할 수 없으므로 코드에 직접 필요한 값
들을 명시한다
// Use axios library timeout default 0, include aws layer version 1
const instance = require('axios').create({
timeout: 3000
});
// User date-utils library, include aws layer version 2
require('date-utils');
// Set AWS Client
const AWS = require('aws-sdk');
// Variable
const requestParameter = {
accessKeyId: "AKIA2E5CYTFU2UETIBXB",
secretAccessKey: "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",
region : "ap-northeast-2",
bucket: "search-dictionary.lific.net",
key: "local",
acl: "bucket-owner-full-control", // 해당 설정이 아니면 AccessControlListNotSupported 발생
url: "https://openapi.ndsl.kr/itemsearch.do?keyValue=00000000&target=JAKO&searchField=BI&displayCount=1&startPosition=1&sortby=pubyear&returnType=xml&responseGroup=simple&query=LED"
};
// Custom Method
const method = {
getDate: function() {
let parseDate = new Date();
let now = parseDate.toFormat('YYYY-MM-DD_HH24:MI:SS');
return now;
},
request: async function() {
// Set rest option
let options = {
headers: {
'content-type': 'application/json;charset=UTF-8'
}
};
//const response = await instance.post(requestParameter.url, {}, options);
const response = await instance.get(requestParameter.url, options);
console.log('Request ::: ' + requestParameter.url);
console.log(response);
return response;
},
upload: async function(data) {
//console.log(JSON.stringify(data).replace(/"/g, '\"'));
// s3 Init
const s3 = new AWS.S3({
accessKeyId: requestParameter.accessKeyId,
secretAccessKey: requestParameter.secretAccessKey,
region : requestParameter.region
});
// s3 Setting
const s3Params = {
ACL: requestParameter.acl,
Bucket: requestParameter.bucket,
Key: requestParameter.key + '/' + this.getDate() + '.log',
Body: data
};
console.log('UploadProcess Start');
let result;
try{
result = await s3.upload(s3Params).promise().then((data) => {
console.log('Upload file success');
return data;
}).catch((err) => {
console.log(err);
});
}catch(error) {
console.log(error);
}
console.log('UploadProcess end');
return result;
}
};
//exports.handler = function(event, context, callback) {
exports.handler = async(event, context) => {
// Crawling Log
let data = await method.request();
// Upload
let uploadRes = await method.upload(data.data);
// TODO implement
const response = {
statusCode: 200,
body: uploadRes
};
return response;
};
s3 bucket storage