jetalog.net

AWS Lambda는 AWS에서 제공하는 서버리스 컴퓨팅 서비스입니다.

AWS에서는 Lambda를 이렇게 설명합니다.

AWS Lambda는 이벤트에 대한 응답으로 코드를 실행하고 자동으로 기본 컴퓨팅 리소스를 관리하는 서버리스 컴퓨팅 서비스입니다. AWS Lambda를 사용하여 사용자 지정 로직을 통해 다른 AWS 서비스를 확장하거나, AWS 규모, 성능 및 보안으로 작동하는 자체 백엔드 서비스를 만들 수 있습니다. AWS Lambda는 Amazon API Gateway를 통한 HTTP 요청, Amazon S3 버킷에 있는 객체에 대한 변경 사항, Amazon DynamoDB의 테이블 업데이트 또는 AWS Step Functions의 상태 전환과 같은 다양한 이벤트에 대한 응답으로 코드를 자동 실행할 수 있습니다.

AWS Lambda - 제품 기능

조금 더 쉽게 풀어쓰자면, AWS Lambda에 코드 조각을 올려놓고 어떤 조건이 충족되었을 때 자동으로 실행되도록 설정하는겁니다. 예를 들자면 AWS Lambda를 이용하면 이런 일들을 쉽게 할 수 있는거죠.

  • 기자가 기사 이미지를 업로드하면 PC용, Tablet PC용, 모바일용으로 각각 리사이징하여 저장합니다.
  • 매일 새벽 1시에 사용자 통계를 갱신하여 DB로 저장합니다.
  • 사용자가 특정 URL을 호출하면 게시글 목록을 전송해줍니다.

AWS Lambda를 처음 사용해보기에 앞서 연습했던 내용을 정리해서 공유합니다.

 

 

사전 준비

 

AWS IAM 계정 준비

1. AWS IAM에서 아래와 같이 새 계정의 정보를 입력합니다.

IAM 계정명을 입력하고, 프로그래밍 방식 액세스를 선택합니다.

 

2. AdministratorAccess 권한을 부여합니다.
   이 권한은 전체 권한이고, 지금은 테스트를 위해 적용합니다. 실 서비스에서는 보안을 위해 적절한 권한만 부여하는게 좋습니다.

새 계정에 적당한 권한을 부여합니다.

 

3. 나중에 쉽게 계정을 찾을 수 있도록 태그를 추가합니다. 생략해도 무방합니다.

선택 사항입니다.

 

4. 계정에 대한 정보를 확인하고 사용자 만들기 버튼을 선택합니다.

잘못 설정한 것은 없는지 확인합니다.

 

5. 사용자명과 Access Key, Secret Key가 생성됩니다. 창을 닫지 말고 계속 띄워두거나, 정보를 안전한 곳으로 옮겨둡니다.

이 화면에 표시된 값은 가짜입니다.

 

Serverless 설치

 

Serverless는 이름 그대로 Serverless App을 만들기 쉽도록 도와주는 프레임워크입니다.

자세한 내용은 공식 홈페이지에서 확인할 수 있습니다.

이 예제에서는 Serverless를 이용해 API를 만들어서 배포까지 진행합니다.

 

1. 아래 명령어 중 하나를 이용해서 전역에 serverless를 설치합니다.

npm i -g serverless        # NPM을 이용할 때
yarn global add serverless # yarn을 이용할 때

 

2. 아래 명령어를 이용해서 IAM 권한을 연결합니다.

sls config credentials --provider aws --key YOUR_ACCESS_KEY --secret YOUR_SECRET_KEY

 

3. 연습을 진행할 디렉토리를 새로 생성하고 해당 디렉토리로 이동합니다.

 

4. 새 프로젝트를 생성합니다. 아래 명령어는 프로젝트를 생성할 때 Node.js용 탬플릿을 이용하도록 합니다.

sls create -t aws-nodejs

 

 

Hello, World!

1. npm 모듈을 이용할 수 있는지 테스트해보기 위해 아래 명령어로 moment.js 모듈을 설치합니다.

npm i --save moment moment-timezone # NPM을 이용할 때
yarn add moment moment-timezone     # yarn을 이용할 때


2. handler.js 파일이 Hello, World!를 전달할 수 있도록 아래와 같이 수정합니다.

const moment = require('moment-timezone');

module.exports.hello = async (event) => {
    return {
        statusCode: 200,
        body: JSON.stringify({
            currentTime: moment(),
            message: `Hello, World at ${moment().tz('Asia/Seoul').format('YYYY-MM-DD HH:mm:ss')}!`,
            input: event,
        }, null, 2),
    };
};


3. serverless.yml 파일을 아래와 같이 수정합니다.

service: YOUR_SERVICE_NAME # 서비스 이름

provider:
  name: aws # AWS에 배포합니다.
  runtime: nodejs10.x # Node.js 10 버전으로 배포합니다.
  stage: dev # 배포 상태를 지정합니다.
  region: ap-northeast-2 # AWS Region을 지정합니다.

functions:
  hello: # 함수명
    handler: handler.hello # 실행할 함수
    events: # 함수와 연결되는 이벤트를 명시합니다.
      - http:
          path: hello
          method: get


4. 다음 명령어로 실행 결과를 확인합니다: sls invoke local --function hello

$ sls invoke local --function hello
{
    "statusCode": 200,
    "body": "{\n  \"currentTime\": \"2019-09-05T07:35:17.517Z\",\n  \"message\": \"Hello, World at 2019-09-05 16:35:17!\",\n  \"input\": \"\"\n}"
}

 

 

배포

1. 다음 명령어로 배포를 진행합니다: sls deploy

$ sls deploy
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Creating Stack...
Serverless: Checking Stack create progress...
.....
Serverless: Stack create finished...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service ex-serverless.zip file to S3 (389 B)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
................................
Serverless: Stack update finished...
Service Information
service: YOUR_SERVICE_NAME
stage: dev
region: ap-northeast-2
stack: YOUR_SERVICE_NAME-dev
resources: 10
api keys:
  None
endpoints:
  GET - https://APIGATEWAYID.execute-api.ap-northeast-2.amazonaws.com/dev/hello
functions:
  hello: YOUR_SERVICE_NAME-dev-hello
layers:
  None
Serverless: Run the "serverless" command to setup monitoring, troubleshooting and testing.


2. AWS Lambda 함수 목록에 함수가 생성된 것을 확인할 수 있습니다.

'ex-serverless-dev-hello'가 생성되었습니다.


3. 1.의 로그에 있는 endpoint를 클릭하면 정상적으로 실행됨을 확인할 수 있습니다.

브라우저 대신 Postman을 사용하는 것도 방법입니다.

 

결론

AWS Lambda를 사용하면 아주 간단하게 API 서버를 생성할 수 있다는 것만으로도 굉장히 매력적인 서비스입니다. 하지만 장점만 있는 것은 아닙니다.

 

실서비스를 Serverless로 구성하기 위해 조사하는 과정에서 몇 가지 고려할 점들도 확인되었습니다. 만약 실서비스 적용을 준비 중이거나 새 서비스를 AWS Lambda로 구성하려는 분들은 아래 사항도 함께 확인하시면 좋겠습니다.

 

  • 더 비싼 요금을 지불해야 할 수 있습니다. AWS Lambda는 컴퓨팅 시간 만큼 요금이 청구되는 종량제입니다. 24시간 실행되는 서버에 경우 더 비싼 요금을 지불해야 할 수 있습니다. 하지만 특정 시간에만 사용자가 몰리는 스팟성 서비스는 요금 측면에서 EC2보다 유리합니다.
  • 함수 실행 시간에 제한이 있습니다. 한 함수는 최대 15분까지만 실행되어야 합니다. 만약 15분을 초과하면 함수는 종료됩니다.
  • 각 함수는 독립적으로 실행됩니다. 함수가 종료되면 관련 데이터도 사라지기 때문에 메모리 캐싱 등을 할 수 없습니다. 따라서 Redis 등 별도의 캐시 메모리를 구성하거나, AWS Step Functions를 고려해야 할 수 있습니다.

 

 

참고 문서