2017년 8월 30일 수요일

[AWS] Express에서 동작하는 Swagger UI server 만드는 방법(AWS API Gateway, Lambda 이용)

Express에서 동작하는 Swagger UI server 만드는 방법(AWS API Gateway, Lambda 이용)

[How to make Swagger UI server on Express (with AWS API Gateway and Lambda)]

AWS의 API Gateway와 Lambda를 이용하면 간편하게 REST API를 만들 수 있습니다.
(아래 링크에 제가 예전에 정리했던 REST API 포스팅이 있습니다. 하지만, 해당 방법으로는 GET, POST, PUT, DELETE 메서드를 모두 한번에 ANY 메서드로 처리하므로 Swagger로 표현할 수 없습니다. 그러니, 참고만 하시면 좋을 것 같습니다.
https://walkinpcm.blogspot.kr/2017/05/aws-aws-api-gateway-lambda-rest-api.html )
그런데, 만든 API에 대한 정보를 다른 사람에게 알려야할 때 API Gateway에 접속해서 보라고 하기에는 비효율적이고 한눈에 알아보기도 쉽지 않습니다.
즉, API Gateway로 만든 API도 문서화가 필요합니다. API문서화는 여러 방법이 있는데, 본 포스팅에서는 Swagger UI를 이용해서 API Document Web Page를 만들어보겠습니다.

0. 구조


Swagger UI는 다양한 서버에서 동작할 수 있는데, 여기서는 node 환경에서 express 웹서버로 Swagger UI를 구성하겠습니다.
그리고 해당 express 웹서버를 AWS Lambda에서 구동시키고, API Gateway를 이용해서 접속 URL을 획득해서 브라우저에서 접속할 수 있게 구성할 것입니다.
Swagger UI는 json 또는 yaml로 작성된 API 정의 문서를 보기 좋게 GUI로 보여주는데, 본 포스팅에서는 json 파일을 AWS S3에 업로드해서 이용합니다.

1. 필요한 것들

yarn과 Node js 설치는 일반적인 사항이므로 여기서는 다루지 않겠습니다.
또한, API Gateway + Lambda + Express 로 웹 어플리케이션을 Lambda에서 구동하는 방법은 아래 링크를 참고해주시기 바랍니다. 여기서는 코드만 바로 작성하도록 하겠습니다.
( 링크 : https://walkinpcm.blogspot.kr/2017/08/awsaws-lambda-express-react-application.html )

2. 프로젝트 준비

프로젝트를 진행할 폴더 내에서 아래 작업들을 진행합니다.
우선 yarn 프로젝트를 초기화 합니다.
entry point는 lambda.js로 해주세요. 중요한건 아닌데.. 여기서는 index.js는 만들지도 않을 거에요.
yarn init
프로젝트 초기화가 되면 아래 명령으로 필요한 node 패키지들을 설치합니다.
기본적으로 이렇게 3개만 있으면 됩니다.
yarn add express swagger-ui-express aws-serverless-express

3. 소스파일 작성

2개의 파일이 필요합니다.
  • lambada.js
    • AWS Lambda에 프로젝트를 업로드 했을 때, API Gateway를 통해서 들어온 요청을 받아서 express로 전달할 파일입니다.
  • app.js
    • express가 동작하는 파일입니다.
lambda.js의 코드는 AWS Lambda에서 express 어플리케이션을 구동시키기 위해서 사용하는 일반적인 코드입니다.
// lambda.js
'use strict';

const awsServerlessExpress = require('aws-serverless-express');
const app = require('./app');
const server = awsServerlessExpress.createServer(app);

exports.handler = (event, context) => awsServerlessExpress.proxy(server, event, context);
// app.js
'use strict';

const express = require('express');
const app = express();

const awsServerlessExpressMiddleware = require('aws-serverless-express/middleware');

// swagger-ui-express 미들웨어를 불러옵니다.
const swaggerUi = require('swagger-ui-express');

app.use(awsServerlessExpressMiddleware.eventContext());

// 아래 처럼 작성하면 {API Gateway에서 획득한 주소}/api-docs/v1 으로 Swagger UI web page에 접속 할 수 있습니다.
// Swagger Json 파일은 AWS S3에 업로드 하고 해당 객체에 주어지는 URI를 6번째 인자에 복사해 넣습니다.
app.use('/api-docs/v1', swaggerUi.serve, swaggerUi.setup(null, null, null, null, null
    , '{Swagger Json 파일의 S3 주소}'
));

module.exports = app;

여기까지 진행하면 프로젝트 구조가 아래와 같습니다.
Project Folder
├── node_modules
├── app.js
├── lambda.js
├── package.json
└── yarn.lock

4. Swagger Json 파일을 AWS S3에 업로드

Swagger Json 파일을 AWS S3에 업로드 합니다.
혹시, Json 파일을 직접 작성하시기 전에 예제를 이용해서 테스트 해보고 싶으시다면, S3에 올리는 단계를 건너 뛰시고
Json 파일의 URL을 http://petstore.swagger.io/v2/swagger.json로 사용하시면 좋습니다.
해당 json 파일은 swagger-ui-express에서 제공하는 예제입니다.
S3에 Json 파일을 업로드 하면, 업로드 후에 2가지 작업을 해줘야합니다.
  • 첫번째, json 파일의 접근 권한을 public으로 설정해줘야합니다. 요즘엔 파일을 업로드하고 파일의 '개요'를 보면 '퍼블릭으로 설정' 기능이 있어서 간편하게 public으로 설정이 됩니다.
  • 두번째, json 파일을 업로드한 S3 Bucket의 CORS에 header를 추가합니다. Bucket의 '권한'에서 'CORS 구성'을 아래와 같이 작성합니다. 기본 작성된 것에 딱 한줄 추가됩니다.
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>Authorization</AllowedHeader>
    <AllowedHeader>Content-Type</AllowedHeader>      <!-- <<== 이거 한줄 추가합니다. -->
</CORSRule>
</CORSConfiguration>

5. 프로젝트를 AWS Lambda에 올리고 API Gateway와 연결하기

이 단계는 아래 링크를 참고해주세요.
이 단계만 해도 글이 어마어마하게 길어져서 이전의 포스팅을 안내해드립니다.
제 포스팅 뿐만아니라 제 포스팅을 시작으로 관련 키워드들을 많이 검색해서 자료를 보시길 추천드립니다.
( 링크 : https://walkinpcm.blogspot.kr/2017/08/awsaws-lambda-express-react-application.html )
핵심적인 사항은 아래와 같습니다.
  • Lambda Function을 만들 때, 프로젝트 파일들을 zip으로 압축해서 파일로 Lambda Function에 업로드하고 구성 설정에서 Handler를 lambda.handler로 해야합니다.
  • API Gateway는 아래와 같은 구조로 /{proxy+} 만 만들어주시면 됩니다. CORS도 설정해주시구요.
/
    /{proxy+}
        ANY
        OPTIONS

6. Swagger UI Web Page 접속

제대로 작업이 진행되었다면, 아래와 같이 Swagger UI 화면이 나타납니다.
접속 주소는 API Gateway에서 배포한 후에 생성된 URL에 위에서 설정했던 /api-docs/v1을 붙인 것입니다.



이상으로 Swagger UI Web Page를 만드는 방법을 끝마치겠습니다.
혹시 잘 안되거나 잘못 된 부분이 있다면 댓글 남겨주세요. 최대한 빠르게 확인하고 답변 또는 포스팅 수정/보완 하도록 하겠습니다.
감사합니다~

Tip.
아래 링크에서는 Json 또는 Yaml로 된 Swagger 문서를 바로바로 Swagger UI로 볼 수 있습니다. Swagger 문서를 작성할 때 좋습니다.
(링크 : http://editor.swagger.io )
제 경우에는 AWS API Gateway로 API를 작성했기 때문에 API Gateway의 기능인 '내보내기' 기능으로 Swagger 문서를 획득할 수 있어서 위 링크에 복사해두고 조금 더 다듬는 용도로 사용합니다.

2017년 8월 27일 일요일

[AWS] aws-serverless-express에서 binary(이미지 파일) 지원하는 방법

aws-serverless-express에서 binary(이미지 파일) 지원하는 방법

[How to support binary(image file) in aws-serverless-express]
지난 포스팅에서 AWS Lambda에서 aws-serverless-express를 이용하고 AWS API Gateway와 연결하여 웹 어플리케이션을 서버리스(Serverless)로 서비스하는 방법을 정리해보았습니다.
( 링크 : https://walkinpcm.blogspot.kr/2017/08/awsaws-lambda-express-react-application.html )
그런데, 위 포스팅의 절차대로만 했을때 이미지 파일이 화면에 그려지지 못하는 문제가 있었습니다.
개발자도구를 이용해서 확인해보면 분명 파일을 받아오는 요청은 200 OK 를 받지만 이미지가 그려지지 않았습니다.
알아보니 API Gateway와 Lambda에서는 기본적으로는 binary를 지원하지 않았던게 문제였습니다.
그래서 이번 포스팅에서는 그 문제를 해결하는 방법을 정리합니다.

0. 해결방법

해결방법은 단순합니다.
API Gateway와 Lambda(aws-serverless-express 사용부분)에서 binary를 지원하도록 설정해주면 되었습니다.
단, 두 군데 모두 설정이 되어야 제대로 binary를 지원합니다.

1. API Gateway 이진 지원 설정

API Gateway에서 사용할 API를 선택하면 좌측 하위 메뉴에 '이진 지원' (Binary Support)가 있습니다.
해당 메뉴를 클릭하고 '이진 미디어 형식' (Binary media types)에 아래 세 항목을 각각 추가합니다.
(jpg와 png 파일을 지원하고자 하여 아래 image/jpeg와 image/png를 입력합니다. 필요에 따라 다른 항목을 추가하시면 됩니다.)
image/jpeg
image/png
*/*

2. aws-serverless-express 코드에서 이진 형식 설정

기본적으로 aws-serverless-express를 이용해서 express 어플리케이션을 Lambda에서 구동시킬때는 아래와 같은 코드가 작성됩니다.
(자세한 코드는 맨 위에 링크된 지난 포스팅을 참고해주세요.)
const server = awsServerlessExpress.createServer(app);
binary를 지원하기 위해서는 createServer()를 호출할 때 지원할 binary가 무엇인지 알려줘야합니다.
코드는 아래와 같이 수정됩니다.
const binaryMimeTypes = [
    'image/jpeg',
    'image/png'
];

const server = awsServerlessExpress.createServer(app, null, binaryMimeTypes);


끝났습니다ㅎㅎㅎ
이렇게 간단하게 해결될 것을 저는 이래저래 헤맷네요..
그리고 항상 API Gateway는 배포를 해줘야 적용이 됩니다 ㅎㅎ
이 글을 쓰면서도 배포를 빼먹어서 잠시 또 헤맷네요..ㅎㅎㅎ
이상입니다. 감사합니다.

2017년 8월 20일 일요일

[AWS]AWS Lambda에 Express 위에서 작동하는 React Application 업로드(배포) 하는 방법

AWS Lambda에 Express 위에서 작동하는 React Application 업로드(배포) 하는 방법

[How to upload(deploy) React application on Express to AWS Lambda]
(부제: aws-serverless-express 사용 방법)
주의! 본 글은 AWS Lambda와 API Gateway의 사용법은 구체적으로 다루지 않습니다. 이에 대해서는 사전에 익히고 보셔야 좋습니다.

최근 AWS에서는 Serverless Architecture를 지원해주기 위해 노력하고 있는 것 같습니다.
그 일환으로 aws-serverless-express를 이용해서 AWS Lambda에 Node.js 진영의 웹 프레임워크(Web Framework)인 Express 기반의 Web Application을 배포할 수 있게 했습니다.
또한, Serverless 기반의 App을 개발하고 배포하기 편리하게 하는 serverless application model(SAM) 을 공개했습니다.
SAM은 아직 Beta라서 그런지 안정적이지는 않은 것 같습니다. SAM을 이용하면 로컬에서 Lambda에 배포한 것 같이 테스트 할 수 있고 좋은데.. 조금만 더 기다려봐야할 것 같습니다.

이번 포스팅에서는 aws-serverless-express를 이용해서 React App을 AWS Lambda에 배포하는 방법을 정리해보려 합니다. 


1. 준비

Yarn과 Node.js는 일반적인 사항이라 따로 설치 방법을 정리하지는 않겠습니다.

1-1. React-Starter-Kit

본 포스팅에서는 React App의 뼈대를 잡기 위해서 React-Starter-Kit을 사용합니다. React-Starter-Kit은 Express기반으로 작성되어 있으며, Universal-Router를 이용해서 Server-side rendering을 지원합니다.
Terminal(또는 Powershell 등)에서 아래 명령을 수행하여 공식 Github에서 프로젝트를 내려 받습니다.
아래 명령에서 마지막에 있는 MyApp은 프로젝트 소스를 내려받을 폴더 이름입니다. 그러니 각자가 원하는 이름으로 지정하시면 됩니다.
git clone -o react-starter-kit -b master --single-branch https://github.com/kriasoft/react-starter-kit.git MyApp
프로젝트 폴더 내부로 이동해서 아래 명령으로 package.json에 명시된 dependencies를 설치합니다.
cd MyApp
yarn install

1-2. aws-serverless-express

aws-serverless-express는 lambda에서 express를 작동 시킬 수 있게 해주는 미들웨어 패키지입니다.
아래 명령으로 프로젝트에 모듈을 추가해줍니다.
yarn add aws-serverless-express

이제 준비는 되었습니다. 다음으로 소스코드의 수정 및 작성을 정리하겠습니다. 


2. Lambda에서 작동시키기 위한 소스 코드 수정 및 추가 작성

기존 Express Application은 listen() 함수를 이용해서 포트를 열고 클라이언트의 접속을 대기합니다.
하지만, Lambda에서는 클라이언트의 요청을 listen()으로 받는게 아니라 aws-serverless-express가 받아서 express로 전달합니다.
이를 위해서 코드의 수정이 필요합니다.

2-1. React-Starter-Kit의 소스 코드 수정

위에서 언급했듯이 listen() 함수가 필요가 없고, aws-serverless-express가 클라이언트 요청을 받도록 수정해줘야합니다.
이를 수정하기 위해서, src/server.js 에서 아래 부분을 주석처리하거나 삭제합니다.
const promise = models.sync().catch(err => console.error(err.stack));
if (!module.hot) {
  promise.then(() => {
    app.listen(config.port, () => {
      console.info(`The server is running at http://localhost:${config.port}/`);
    });
  });
}
그리고, aws-serverless-express 패키지를 import 합니다.
다른 패키지들이 import된 곳의 맨 마지막에 import하면 됩니다.
import awsServerlessExpressMiddleware from 'aws-serverless-express/middleware';
그리고 다른 미들웨어들이 작성되어 있는 곳에 aws-serverless-express 미들웨어도 추가해 줍니다.
//
// Register Node.js middleware
// -----------------------------------------------------------------------------
app.use(awsServerlessExpressMiddleware.eventContext());         // <--- 추가 됨.
app.use(express.static(path.resolve(__dirname, 'public')));
app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
아래 수정은 Lambda에서 제대로 작동하지 않아서 internal error를 발생시키는 패키지를 제거하는 것입니다.
아래 부분들을 찾아서 주석처리 해주시면 됩니다.
아래 패키지 들이 무조건 Lambda에서 사용을 못하는지는 아직 깊게 파보지 않아서 모르겠으나, 당장은 필요 없어서 일단 제거합니다.(앞으로 각 패키지들도 사용하는 방법을 연구해볼 예정입니다.)
import expressGraphQL from 'express-graphql';
import passport from './passport';
import models from './data/models';
import schema from './data/schema';

...

app.use(passport.initialize());

...

app.get(
  '/login/facebook',
  passport.authenticate('facebook', {
    scope: ['email', 'user_location'],
    session: false,
  }),
);
app.get(
  '/login/facebook/return',
  passport.authenticate('facebook', {
    failureRedirect: '/login',
    session: false,
  }),
  (req, res) => {
    const expiresIn = 60 * 60 * 24 * 180; // 180 days
    const token = jwt.sign(req.user, config.auth.jwt.secret, { expiresIn });
    res.cookie('id_token', token, { maxAge: 1000 * expiresIn, httpOnly: true });
    res.redirect('/');
  },
);

...

app.use(
  '/graphql',
  expressGraphQL(req => ({
    schema,
    graphiql: __DEV__,
    rootValue: { request: req },
    pretty: __DEV__,
  })),
);

2-2. lambda.js 코드 추가 작성

lambda.js는 React-Starter-Kit에 포함되어 있는 파일이 아닙니다.
Lambda와 프로젝트 파일들을 이어주는 접점이라고 생각하시면 됩니다.
파일은 프로젝트 폴더 최상위 위치에 저장해두면 나중에 계속 복사하면 되서 편합니다.
// lambda.js
'use strict';

const awsServerlessExpress = require('aws-serverless-express');
const app = require('./server');
const server = awsServerlessExpress.createServer(app.default);

exports.handler = (event, context) => awsServerlessExpress.proxy(server, event, context);
여기서 주의할 점은, awsServerlessExpress.createServer()의 인자로 그냥 app이 아니라 app.default가 들어간다는 것입니다.
왜냐하면 빌드 된 server.js는 webpack에 의해서 여러 패키지가 하나로 합쳐져 있어서 export된 모듈이 많은데 그 중에서 원하는 것은 default 로 export된 모듈이기 때문입니다.


3. 프로젝트 빌드

이제 Lambda에 파일들을 배포하기 위해서 프로젝트를 빌드합니다.
가운데 -- 만 있는거 꼭 넣어줘야한다고 합니다.
yarn run build -- --release
빌드 명령을 수행하고 나면 build 폴더가 생성됩니다.
이 build 폴더에 바로 전에 작성한 lambda.js 파일을 복사해서 넣어줍니다.

그러고나서, build폴더 내부에서 yarn 명령으로 dependencies를 설치해줍니다.

cd build
yarn

4. build 폴더 압축(zip)

이제 build 폴더를 zip 파일로 압축해서 Lambda에 배포할 수 있게 준비합니다.
어떤 압축 프로그램을 해도 좋지만 확장자가 .zip으로 되어야하고,
압축 파일을 열었을 때 build 폴더가 보이는게 아니라 build 폴더의 내부 파일들이 최상위에 바로 보이게 압축해야합니다.

5. AWS Lambda에 zip 파일 업로드

AWS Lambda에 Function을 생성하고 코드를 압축 파일 업로드 방식으로 선택해서 방금 압축한 zip 파일을 업로드합니다.
그리고 Configuration(구성)에서 handler(핸들러)를 lambda.handler로 설정해줍니다.

6. API Gateway

API Gateway를 이용해서 Lambda에 올린 React App에 접속합니다.
API 구조는 아래 그림과 같이 구성합니다. 루트(/)에 Any method를 둔 것은 Web Application의 홈 화면을 접근하기 위해서이고, /{proxy+}는 루트 디렉토리 이외의 페이지에 접근하기 위해 필요합니다.


7. 확인

API Gateway 구성을 마쳤으면 할당된 URL을 이용해서 아래 주소로 접속해 봅니다.
https://{할당된 주소}/about
본 글에서 사용한 프로젝트에서는 몇몇 코드를 지워서 그런지 홈화면이 없고 Error 페이지가 나타납니다. 그래서 about 페이지에 접근하여 정상동작을 확인합니다.
about 페이지가 정상적으로 나타나면 성공입니다.

마무리

API Gateway에서 '사용자 지정 도메인 이름'을 사용하면 원하는 도메인으로 Lambda에 올린 Web Application에 접속할 수 있습니다. 어렵지 않으니 금방 하실거에요.
개인적으로 Lambda에 Web Application을 올릴 수 있는게 너무 좋습니다. EC2에서 서비스 한다면 가용성을 높이기 위해 다수의 EC2로 서비스하고 ELB로 로드밸런싱도 걸어줘야 할텐데, Lambda에 올리면 그런 수고가 덜어지니 너무 편합니다.
React Web App을 SSR 지원없이 서비스 한다면 S3에서 웹 호스팅으로 서비스 해도 될 테지만, Application 성격에 따라 SSR이 꼭 지원되야하면 Lambda가 너무 좋은 옵션인 것 같습니다.
앞으로도 Serverless로 새로 알게되는 정보들이 있으면 열심히 정리해보겠습니다.
감사합니다.

참고 링크

2017년 8월 8일 화요일

[AWS] Apex 시작하기

Apex 시작하기

Apex 란?

Apex는 AWS Lambda Function을 로컬PC에서 빌드하고, 배포하고, 관리하는 Tool입니다.
공식 Github Repository
https://github.com/apex/apex
본 글에서는 Apex을 설치하고 이를 이용하여 AWS Lambda에 Function을 배포하는 절차를 정리해보려 합니다.

1. Apex 설치

저는 Windows 환경에서 진행합니다. 그래서 설치가 명령어 한줄 입력하는 게 아니라,
https://github.com/apex/apex/releases 에서 운영체제에 맞는 설치파일을 다운받아야합니다.
저는 apex_windows_amd64.exe를 받았습니다.
근데, exe를 받았는데 이걸로 설치하는 형식이 아닙니다.
단순히 cmd 또는 powershell로 열어서 저 파일명 전체를 명령어로 사용하는 것입니다. 아래 처럼요.
PS C:\{파일경로}> .\apex_windows_amd64.exe version
Apex version 0.15.0
참으로 불편하지요...
다행히 Powershell에서는 명령어 Alias 설정이 가능합니다.
아래와 같이 하면 apex 만 입력해도 apex 명령어 사용이 가능합니다.
절대경로로 입력해야 어떤 디렉토리 위치에서도 apex 명령어를 사용할 수 있습니다.
Set-Alias apex {apex이 설치된 절대경로}\apex_windows_amd64.exe

2. Apex에 AWS credentials 설정

AWS CLI에 AWS credentials 정보만 잘 기입하면 됩니다.
Apex은 단지 AWS CLI를 이용할 뿐인거 같습니다. 그러니 AWS CLI에 credentials 정보를 잘 설정해줘야합니다.

3. 사용자 계정에 필수 권한 부여

AWS CLI에 입력한 사용자 계정은 아래 권한이 필수적으로 있어야 Apex 사용이 가능합니다.
Apex을 사용하기 위한 최소한의 권한입니다.
IAM에서 새로운 Policy를 생성하여 아래 JSON 문서를 넣어주고 해당 Policy를 AWS CLI에 등록한 사용자 계정에게 부여하면 좋습니다.
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "iam:CreateRole",
        "iam:CreatePolicy",
        "iam:AttachRolePolicy",
        "iam:PassRole",
        "lambda:GetFunction",
        "lambda:ListFunctions",
        "lambda:CreateFunction",
        "lambda:DeleteFunction",
        "lambda:InvokeFunction",
        "lambda:GetFunctionConfiguration",
        "lambda:UpdateFunctionConfiguration",
        "lambda:UpdateFunctionCode",
        "lambda:CreateAlias",
        "lambda:UpdateAlias",
        "lambda:GetAlias",
        "lambda:ListAliases",
        "lambda:ListVersionsByFunction",
        "logs:FilterLogEvents",
        "cloudwatch:GetMetricStatistics"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}

4. Apex 프로젝트 생성

Apex을 이용한 프로젝트는 아래 명령어로 시작합니다.
apex init
init 명령을 입력하면 아래와 같은 화면이 출력됩니다.
Project name과 Project description을 입력하면 apex이 자동으로 필요한 role과 policy를 aws에 생성하고, 기본 파일구조를 생성합니다.
이때 생성되는 role과 policy는 CloudWatch에 Log를 남길 수 있는 권한입니다.
PS C:\> apex init


             _    ____  _______  __
            / \  |  _ \| ____\ \/ /
           / _ \ | |_) |  _|  \  /
          / ___ \|  __/| |___ /  \
         /_/   \_\_|   |_____/_/\_\



  Enter the name of your project. It should be machine-friendly, as this
  is used to prefix your functions in Lambda.

    Project name: pcm-tutorial

  Enter an optional description of your project.

    Project description: This is test project.

  [+] creating IAM pcm-tutorial_lambda_function role
  [+] creating IAM pcm-tutorial_lambda_logs policy
  [+] attaching policy to lambda_function role.
  [+] creating ./project.json
  [+] creating ./functions

  Setup complete, deploy those functions!

    $ apex deploy

프로젝트를 생성하면 기본 예제가 함께 생성되는데,
위 출력문의 제일 마지막에 있는 apex deploy를 실행하면, 이 기본 예제가 AWS Lambda에 배포됩니다.
PS C:\> apex deploy
   • creating function         env= function=hello
   • created alias current     env= function=hello version=1
   • function created          env= function=hello name=pcm-tutorial_hello version=1
Apex을 이용하면 AWS Lambda를 호출하는 것도가능합니다. 방금 배포한 예제를 호출해 볼 수 있습니다.
apex invoke hello
아래 결과를 응답 받습니다.
{"hello":"world"}

5. Apex 프로젝트 기본 파일 구조

Apex 프로젝트의 기본 구조는 다음과 같습니다.
project.json
functions
├── bar
│   ├── function.json
│   └── index.js
└── foo
    ├── function.json
    └── index.js
project.json파일에는 프로젝트의 이름과 설명, 그리고 프로젝트 레벨의 설정들이 있습니다.
functions폴더 하위에 여러 Lambda 함수들이 위치합니다.
위 예제 구조에서는 bar 함수와 foo 함수가 있습니다.
각 Lambda 함수에는 함수를 수행하는 index.js파일과 함수의 설정 파일인 function.json이 있습니다.

마무리

Apex에서 기본 예제를 제공해주고, Apex 공식 홈페이지(http://apex.run)을 보면 Apex 설정부터 사용까지 자세하게 잘 나와 있어서 잘 알아두면 Lambda를 편리하게 사용할 수 있을 것 같습니다.

참고 링크