AWS Lambda

JunMyung Lee·2022년 1월 14일
0

AWS

목록 보기
1/2
post-custom-banner

AWS Lambda?

Lambda는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있게 해주는 컴퓨팅 서비스입니다. Lambda는 고가용성 컴퓨팅 인프라에서 코드를 실행하고 서버와 운영 체제 유지 관리, 용량 프로비저닝 및 자동 조정, 코드 및 보안 패치 배포, 코드 모니터링 및 로깅 등 모든 컴퓨팅 리소스 관리를 수행합니다. Lambda를 사용하면 거의 모든 유형의 애플리케이션 또는 백엔드 서비스에 대한 코드를 실행할 수 있습니다. Lambda가 지원하는 언어 중 하나로 코드를 공급하기만 하면 됩니다.

환경 설정

프로세스 아키텍처

AWS Lambda Layer

Nodejs로 코드를 작성시, 특정 라이브러리들을 import하기 위해서는 다음과 같은 작업이 필요하다

  1. 로컬호스트에 nodejs 14.x 설치

    1. 각각의 npm에서 설치해도 되지만 서로 엮여있는 의존성들로 인하여 작업이 복잡해진다.
    2. nodejs 14버전 인스톨
    brew install node@14
  2. 필요한 라이브러리 다운로드

    1. npm i package
    npm i axios
    npm i date-utils
  3. nodejs.zip으로 압축 후 계층 생성

    1. 계층 스크린샷

  1. 계층 및 버전 적용

    1. 적용 스크린샷

트리거 권한

해당 트리거 및 추가해야하는 트리거는 권한을 부여 받는다

S3 Trigger

{
    "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:::버킷이름/*"
            ]
        }
    ]
}

CloudWatchEvents Trigger

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

샘플 적용 결과

수행 CloudWatch log

S3 Upload 결과

s3 bucket storage

profile
11년차 검색개발자 입니다. 여러 지식과 함께 실제 서비스를 운영 하면서 발생한 이슈에 대해서 정리하고 공유하고자 합니다.
post-custom-banner

0개의 댓글