AWS 람다 함수 관리 툴 – Apex (1)

apex

APEX는 AWS의 람다 함수의 빌드와 배포를 도와주는 툴입니다. AWS CLI로도 가능하지만 훨씬 간편하게 이용할 수 있습니다.

Github Repository
Homepage

설치

맥, 리눅스, OpenBSD에서는

curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sh

윈도우에서는 바이너리 설치 파일을 받아서 설치할 수 있습니다.

AWS Credential

여타의 AWS 관련 툴과 마찬가지로 Credentail은 ~/.aws 폴더에 설정된 내용을 참고합니다.

설정되어 있지 않다면 aws configure 명령어로 설정할 수 있습니다.

Profile flag

--profile 역시 사용할 수 있습니다.

$ apex --profile my-profile deploy

Project configuration

프로젝트 실행 환경에 대한 설정을 project.json 파일을 통해서 할 수 있는데 이 파일에 Credential에 대한 profile을 지정할 수 있습니다.

아래는 제가 사용하는 설정입니다. Lambda 함수를 만들 때 사용되는 설정값들을 확인할 수 있습니다.

{
  "name": "aws-utils",
  "description": "AWS Utils",
  "memory": 128,
  "timeout": 5,
  "role": "arn:aws:iam::....",
  "environment": {},
  "runtime": "python3.6"
}

IAM Role

IAM Role에 대한 설정도 profile과 같이 --iamrole 옵션 혹은 project.json 파일을 통해서 설정할 있습니다.

Credential 참조 순서

AWS Credential 정보를 로딩하는 우선 순위는 다음과 같습니다.

  1. 플래그로 설정된 프로파일
  2. JSON 설정 파일(project.json)에 설정된 profile
  3. 환경 변수에 설정된 프로파일
  4. default 라는 이름의 프로파일

IAM 정책

Apex는 람다 함수의 배포 및 관리를 위해서 다음과 같은 IAM 권한이 필요합니다.

{
  "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": "*"
    }
  ]
}

또한 apex init 과정에서 AWSLambdaVPCAccessExecutionRole이라는 정책이 자동으로 생성됩니다.

Getting started

Apex를 사용하기 위해서는 초기화 과정이 필요합니다.

$ export AWS_PROFILE=xxx
$ apex init

아래와 같은 화면을 볼 수 있으며 초기화 과정 중에 위에서 언급한 Apex가 사용할 IAM 역할 및 정책이 생성되고 project.json 파일과 functions라는 폴더도 생성됩니다.

functions 폴더에는 테스트용 람다 함수(functions/hello/index.js)도 만들어집니다.

console.log('starting function')
exports.handle = function(e, ctx, cb) {
  console.log('processing event: %j', e)
  cb(null, { hello: 'world' })
}

이 테스트용 함수를 바로 디플로이해볼 수 있습니다.

# project.json 파일이 있는 폴더에서 실행
$ apex deploy
$ apex invoke hello
{"hello": "world"}