닫기
AWS에서 SAM 서비스를 이용해 파이썬 서버리스 프로젝트를 만드는 방법

AWS에서 SAM 서비스를 이용해 파이썬 서버리스 프로젝트를 만드는 방법

Jeffrey
March 3, 2020
TECH

개요

AWS의 SAM 문서를 살펴보면 다음과 같은 문장이 있다.

AWS SAM templates are an extension of AWS CloudFormation templates. That is, any resource that you can declare in an AWS CloudFormation template you can also declare in an AWS SAM template.

즉, SAM, Serverless Application Model은 AWS의 CloudFormation의 확장 기능인 셈이다. 원래 CloudFormation 서비스가 IaC를 위해 나온 서비스임을 생각하면, SAM은 그 중에서도 서버리스 환경에 집중해서 기능을 간소화한 서비스이다.

이 서비스를 이용하는 방법은 크게 두가지가 있다. 하나는 AWS에서 운영하는 SAR(Serverless Application Repository)라는 서버리스 앱 배포 서버를 이용하는 것이다. 여기에서 다른 사람이 만든 서버리스 앱을 가져와서 쓸 수도 있고, 내가 만든 서버리스 앱을 배포할 수도 있다. 그리고 private application으로 관리하면 접근권한을 조절해서 팀원들간에만 관리하도록 할 수도 있다. 다른 하나는 SAM cli 도구를 이용해서 직접 CloudFormation으로 배포해 스택을 생성하는 것이다. 이 글에서는 두번째 방법인 cli를 이용한 배포에 대해 다룰 것이다.

이 서비스는 서버리스 앱에 대한 기반을 정의하는 문서가 필요하다. yaml, json 두가지 포맷을 지원하며 기본 이름은 template.yaml 혹은 template.json이다.

만약 SAM에 대한 메뉴얼 문서를 보고싶다면, AWS의 공식 문서와 AWS SAM github페이지를 참고하는 것이 좋다.

설치

SAM 서비스를 사용하기 위해서는 Pypi 서버에 aws-sam-cli라는 패키지가 있으니 간단히 pip 도구를 이용해 설치할 수 있다.

pip install --user aws-sam-cli

이렇게 설치하면 터미널 환경에서 다음과 같은 명령어를 이용해 설치된 버전을 확인할 수 있다.

sam --version
SAM CLI, version 0.41.0

그리고 sam --help라는 명령어를 입력하면 사용 가능한 명령어 목록을 볼 수 있다. 또한 각 명령어에 –help 옵션을 붙이면 명령어에 대한 사용법도 확인이 가능하다.

사용 전 준비

SAM을 사용하기 위해서는 배포하려는 사용자의 계정 토큰과 몇가지 IAM 권한이 필요하다. 계정 토큰은 ~/.aws/config에 ini 포맷으로 저장해두면 되고, awscli의 config 명령으로도 넣을 수 있다. 다음은 이 사용자 계정 토큰의 IAM권한들이 필요하다.

  • S3 조작에 대한 권한

    Lambda에 업로드할 코드 파일을 저장할 S3 공간에 대한 파일 업로드 권한이 필요하다.

    “s3:PutObject”

  • CloudFormation 구성에 대한 권한

    CloudFormation에 스택을 구성하고, 변경하기 때문에 필요한 권한이다.

    “cloudformation:DescribeStackEvents” “cloudformation:DescribeStackSet” “cloudformation:CreateStack” “cloudformation:GetTemplate” “cloudformation:UpdateStack” “cloudformation:DescribeChangeSet” “cloudformation:ExecuteChangeSet” “cloudformation:CancelUpdateStack” “cloudformation:CreateChangeSet” “cloudformation:DescribeStacks” “cloudformation:ContinueUpdateRollback”

  • IAM 권한

    각 스택에 필요한 권한을 확인하고, 추가하고, 제거하기 위한 권한이다.

    “iam:ListPolicies”, “iam:DetachRolePolicy”, “iam:DeleteRolePolicy”, “iam:CreateRole”, “iam:DeleteRole”, “iam:AttachRolePolicy”, “iam:PutRolePolicy”

이외에도 만들려는 각 AWS 서비스의 생성 권한이 필요하다. (예를 들어 람다가 있다면 람다 생성, 람다 람다 권한, 람다 레이어 등등의 관련 권한이 필요하다.)

프로젝트 작성

SAM 프로젝트는 직접 파이썬 프로젝트 폴더를 만들어서 나중에 template.yaml파일을 추가해도 되고, SAM cli의 명령을 이용해도 된다.

sam init --name "PROJECT_NAME" --runtime python3.7 # 파이썬은 2.7, 3.6, 3.7, 3.8 버전을 지원한다.

이 명령어를 입력하면 간단하게 아래 폴더트리가 생성된다.

.
+-- template.yaml # 어플리케이션 구성을 정의하는 문서
+-- event.json # 로컬환경에서 람다를 테스트할 때 event 파라미터로 입력되는 값
+-- hello_world # 프로그램 코드
|   +-- __init__.py
|   +-- app.py # 람다 핸들러 함수가 들어있는 파일
+-- tests
|   +-- unit
|   |   +-- __init__.py
|   |   +-- test_handler.py # 람다 핸들러 함수를 테스트하기위한 유닛테스트 코드

이제 여기에 template.yaml 파일을 수정하면 된다.

template.yaml

템플릿 파일은 AWS에 구축될 서버리스 앱의 구조를 작성하는 문서이다. yaml과 json 포맷을 지원하지만 json보다 작성이 편하기 때문에 yaml로 작성하는것을 추천한다. 구조를 전부 설명하기엔 너무 길어지고 불필요한 내용도 많기 때문에 아래 문서들을 참고하면서 작성하면 그럭저럭 작성할 수 있다.

CloudFormation문서를 함께 봐야 하는 이유는 SAM 서비스가 CloudFormation에서 왔기 때문에 SAM 문서에는 없지만 지원하는 서비스가 있기 때문이다.

동작

SAM 프로젝트는 보통 다음 절차로 배포가 된다

(코드검사) -> 빌드 -> 패키징 -> 배포

여기서 코드검사는 SAM cli의 기능이 아직 완전하지 않아서 template 파일에 있는 오류를 다 잡아주지 못한다. 배포 도중에 에러가 나서 잡아야 하는 경우도 많아지니 현재는 생략해도 관계 없는 단계이다.(0.41.0 기준)

빌드

빌드는 build 명령어로 실행하는데, 아마존 리눅스의 환경에 맞춰서 패키지를 빌드한다. 이 때 패키지 대상 폴더에 있는 requirements.txt 파일에 있는 패키지들을 함께 다운로드하도록 되어있다.

명령어의 여러 옵션이 있지만 대개 이정도 옵션이면 충분하다. 나머지는 AWS의 문서 참고

sam build \
--profile "PROFILE_NAME" \
--template "TEMPLATE_FILE" \
--build-dir "BUILD_PATH" \
--parameter-overrides ParamKey1=ParamValue1,ParamKey2=ParamValue2

패키징

빌드 후 에 빌드폴더에 template.yaml파일이 함께 복사되는데, 그 파일을 CloudFormation에서 사용되는 template 파일 포맷으로 변환된다. 물론 완전히 CloudFormation에서 쓰이는 서비스 코드로 바뀌는 것은 아니다.

이렇게 변환 후에 코드를 압축해서 S3 버킷에 업로드를 한다. 이후에 할 배포 작업은 여기에 업로드한 압축된 코드들을 배포하게된다.

최소한 이정도 옵션은 사용해야 한다. 그 외에 명령어 설명은 AWS의 문서를 참고하면 된다.

sam package \
--profile "PROFILE_NAME" \
--template-file "BUILD_PATH_TEMPLATE" \
--output-template-file "PACKAGED_TEMPLATE_PATH \
--s3-bucket "UPLOAD_S3_BUCKET"

배포

패키징이 끝난 프로젝트를 배포할 때 이 명령어를 사용한다. 여기에서 배포되는 과정은 CloudFormation 대시보드에서도 확인할 수 있으며 터미널에도 과정이 로그형태로 출력된다. 이 작업이 끝나고나면 람다를 포함한 모든 서비스가 만들어진 뒤에 스택이라는 묶음으로 관리된다.

자세한 배포 명령어에 대한 AWS 문서

sam deploy \
--profile "PROFILE_NAME" \
--template-file "PACKAGED_TEMPLATE_FILE_PATH" \
--capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND --stack-name "STACK_NAME" \
--parameter-overrides ParamKey1=ParamValue1,ParamKey2=ParamValue2

관리

배포 이후에 프로젝트는 알아서 잘 돌겠지만, 업데이트도 해야하고 다양하게 관리를 해야한다. 코드가 수정되거나 스택 구조가 변경되면 소스코드와 template 파일들을 변경한 뒤에 위에있는 명령어를 동일하게 실행하면 CloudFormation이 알아서 잘 업데이트 해준다. 스택 구조도 깔끔하게 변경되니 손쉽게 기능을 추가하거나 제거할 수 있는데, S3나 DB같은 경우는 잘못하면 데이터가 같이 날라가버릴 수 있으니 조심해야 한다.

코드 최초 배포는 물론이고 업데이트 전에 테스트를 해야 하는데, 이 때 람다 환경에서 동작하는 결과를 확인하고 싶다면 SAM cli 명령어 안에 Docker를 이용해서 로컬에서 테스트를 실행할 수 있다.

sam local invoke \
--profile "PROFILE_NAME" \
--template "TEMPLATE_FILE" \
--event "TEST_INPUT(예: event.json)" \
--env-vars "TEST_ENV_FILE" \
--log-file "TEST_RESULT_LOG" \
--debug \
"${TEST_TARGET}"

여기서 –event에는 json 포맷으로 된 값을 넣으면 lambda handler 함수에서 event 파라미터로 값이 전달된다.

또한 –env_vars도 마찬가지로 json 포맷으로 된 환경변수 값을 넣으면 실행될 때 전달된다.

{
    "LambdaFunction": {
        "ENV1": "VALUE1",
        "ENV2": "VALUE2",
        "ENV3": "VALUE3",
        "ENV4": "VALUE4",
    }
}

이렇게 실행하면 결과가 CloudWatch의 로그 스트림과 같은 포맷으로 결과가 파일로 저장된다.

결론

SAM이 개발되기 전에도 IaC를 위한 도구가 많았다. 거기다 요즘처럼 멀티 클라우드 환경까지도 구축, 운영되는 환경에서는 SAM을 쓸 수 없는 상황도 있다.

그러나 AWS 서비스에서 서버리스 환경을 구축한다면 SAM으로 개발하는게 가장 간편하다고 생각된다. 시스템 스펙을 기술하는 template 파일의 구조도 단순하고 AWS 서비스의 이름을 사용하고있기 때문에 찾기도 쉽기 때문이다. 아직 SAM cli는 정식버전이 없고 계속 업데이트가 되고있으니 사용하기 전에 한번쯤은 릴리즈 노트를 참고해서 어떤 기능이 추가되었는지 확인하는것이 좋을 것 같다.

닫기

개인정보 처리방침

<매드업>은 개인정보보호법에 따라 이용자의 개인정보 보호 및 권익을 보호하고 개인정보와 관련한 이용자의 고충을 원활하게 처리할 수 있도록 다음과 같은 처리방침을 두고 있습니다.

<매드업>은 회사는 개인정보처리방침을 개정하는 경우 웹사이트 공지사항(또는 개별공지)을 통하여 공지할 것입니다.

○ 본 방침은 2020년 1월 15일부터 시행됩니다.

개인정보의 처리 목적 <매드업>은 개인정보를 다음의 목적을 위해 처리합니다. 처리한 개인정보는 다음의 목적 이외의 용도로는 사용되지 않으며 이용 목적이 변경될 시에는 사전동의를 구할 예정입니다.

가. 홈페이지 회원가입 및 관리 회원 가입의사 확인, 회원제 서비스 제공에 따른 본인 식별·인증, 회원자격 유지·관리, 제한적 본인확인제 시행에 따른 본인확인, 서비스 부정이용 방지, 만14세 미만 아동 개인정보 수집 시 법정대리인 동의 여부 확인, 각종 고지·통지, 고충처리, 분쟁 조정을 위한 기록 보존 등을 목적으로 개인정보를 처리합니다.

나. 민원사무 처리 민원인의 신원 확인, 민원사항 확인, 사실조사를 위한 연락·통지, 처리결과 통보 등을 목적으로 개인정보를 처리합니다.

다. 재화 또는 서비스 제공 물품배송, 서비스 제공, 청구서 발송, 콘텐츠 제공, 맞춤 서비스 제공, 본인인증, 연령인증, 요금결제·정산 등을 목적으로 개인정보를 처리합니다.

라. 마케팅 및 광고에의 활용 신규 서비스(제품) 개발 및 맞춤 서비스 제공, 이벤트 및 광고성 정보 제공 및 참여기회 제공 , 인구통계학적 특성에 따른 서비스 제공 및 광고 게재 , 서비스의 유효성 확인, 접속빈도 파악 또는 회원의 서비스 이용에 대한 통계 등을 목적으로 개인정보를 처리합니다.

 

 

개인정보 파일 현황

가. 개인정보 파일명 : 개인정보 처리방침

개인정보 항목 : 이메일, 휴대전화번호, 비밀번호, 이름, 업체명, 제목, 광고 예산, 내용, 사업자 등록 번호, 신용카드정보, 은행계좌정보, 예금주, 생년월일, 서비스 이용 기록, 접속 로그, 쿠키, 접속 IP 정보, 결제기록

수집방법 : 홈페이지, 계약서

보유근거 : 홈페이지 회원정보 수집 등에 관한 기록

보유기간 : 5년

관련법령 : 대금결제 및 재화 등의 공급에 관한 기록 : 5년

개인정보의 처리 및 보유 기간 ① <매드업>은 법령에 따른 개인정보 보유·이용기간 또는 정보주체로부터 개인정보를 수집 시에 동의 받은 개인정보 보유,이용기간 내에서 개인정보를 처리,보유합니다. ② 각각의 개인정보 처리 및 보유 기간은 다음과 같습니다.

 

가. <홈페이지 회원가입 및 관리> <홈페이지 회원가입 및 관리>와 관련한 개인정보는 수집.이용에 관한 동의일로부터<5년>까지 위 이용목적을 위하여 보유.이용됩니다.

보유근거 : 홈페이지 회원정보 수집 등에 관한 기록

관련법령 : 대금결제 및 재화 등의 공급에 관한 기록 : 5년

예외사유 :

 

나. <재화 또는 서비스 제공> <재화 또는 서비스 제공>와 관련한 개인정보는 수집.이용에 관한 동의일로부터<5년>까지 위 이용목적을 위하여 보유.이용됩니다.

보유근거 : 계약 또는 청약철회 등에 관한 기록

관련법령 : 계약 또는 청약철회 등에 관한 기록 : 5년

예외사유 :

 

다. <마케팅 및 광고에의 활용> <마케팅 및 광고에의 활용>와 관련한 개인정보는 수집.이용에 관한 동의일로부터<3년>까지 위 이용목적을 위하여 보유.이용됩니다.

보유근거 : 전자상거래등에서의 소비자보호에 관한 법률

관련법령 : 소비자의 불만 또는 분쟁처리에 관한 기록 : 3년

예외사유 :

 

 

정보 주체와 법정대리인의 권리·의무 및 그 행사방법 이용자는 개인정보주체로써 다음과 같은 권리를 행사할 수 있습니다.

① 정보주체는 매드업에 대해 언제든지 개인정보 열람,정정,삭제,처리 정지 요구 등의 권리를 행사할 수 있습니다.

② 제1항에 따른 권리 행사는 매드업에 대해 개인정보 보호법 시행령 제41조제1항에 따라 서면, 전자우편, 모사전송(FAX) 등을 통하여 하실 수 있으며 매드업은 이에 대해 지체 없이 조치하겠습니다.

③ 제1항에 따른 권리 행사는 정보주체의 법정대리인이나 위임을 받은 자 등 대리인을 통하여 하실 수 있습니다. 이 경우 개인정보 보호법 시행규칙 별지 제11호 서식에 따른 위임장을 제출하셔야 합니다.

④ 개인정보 열람 및 처리 정지 요구는 개인정보보호법 제35조 제5항, 제37조 제2항에 의하여 정보주체의 권리가 제한 될 수 있습니다.

⑤ 개인정보의 정정 및 삭제 요구는 다른 법령에서 그 개인정보가 수집 대상으로 명시되어 있는 경우에는 그 삭제를 요구할 수 없습니다.

⑥ 매드업은 정보주체 권리에 따른 열람의 요구, 정정·삭제의 요구, 처리 정지의 요구 시 열람 등 요구를 한 자가 본인이거나 정당한 대리인인지를 확인합니다.

 

 

처리하는 개인정보의 항목 작성

① <매드업>은 다음의 개인정보 항목을 처리하고 있습니다.

 

가. <홈페이지 문의 및 관리>

필수항목 : 업체명, 이메일, 제목, 연락처, 광고 예산, 내용, 휴대전화번호, 비밀번호, 이름, 서비스 이용 기록, 접속 로그, 쿠키, 접속 IP 정보

선택항목 : 프로필 사진

 

나. <재화 또는 서비스 제공>

필수항목 : 업체명, 이메일, 제목, 연락처, 광고 예산, 내용, 비밀번호, 이름, 회사명, 사업자 등록 번호, 신용카드정보, 은행계좌정보, 예금주, 생년월일, 서비스 이용 기록, 접속 로그, 쿠키, 접속 IP 정보, 결제기록

선택항목 :

 

다. <마케팅 및 광고에의 활용>

필수항목 : 업체명, 이메일, 제목, 연락처, 광고 예산, 내용, 휴대전화번호, 이름, 서비스 이용 기록, 접속 로그, 쿠키, 접속 IP 정보

선택항목 :

 

개인정보의 파기<매드업>은 원칙적으로 개인정보 처리 목적이 달성된 경우에는 지체없이 해당 개인정보를 파기합니다. 파기의 절차, 기한 및 방법은 다음과 같습니다.

 

 

파기절차

이용자가 입력한 정보는 목적 달성 후 별도의 DB에 옮겨져(종이의 경우 별도의 서류) 내부 방침 및 기타 관련 법령에 따라 일정기간 저장된 후 혹은 즉시 파기됩니다. 이 때, DB로 옮겨진 개인정보는 법률에 의한 경우가 아니고서는 다른 목적으로 이용되지 않습니다.

 

파기기한

이용자의 개인정보는 개인정보의 보유기간이 경과된 경우에는 보유기간의 종료일로부터 5일 이내에, 개인정보의 처리 목적 달성, 해당 서비스의 폐지, 사업의 종료 등 그 개인정보가 불필요하게 되었을 때에는 개인정보의 처리가 불필요한 것으로 인정되는 날로부터 5일 이내에 그 개인정보를 파기합니다.

파기방법

전자적 파일 형태의 정보는 기록을 재생할 수 없는 기술적 방법을 사용합니다. 종이에 출력된 개인정보는 분쇄기로 분쇄하거나 소각을 통하여 파기합니다.

 

개인정보 자동 수집 장치의 설치•운영 및 거부에 관한 사항

① 매드업은 개별적인 맞춤서비스를 제공하기 위해 이용 정보를 저장하고 수시로 불러오는 ‘쿠키(cookie)’를 사용합니다.

② 쿠키는 웹사이트를 운영하는데 이용되는 서버(http)가 이용자의 컴퓨터 브라우저에게 보내는 소량의 정보이며 이용자들의 PC 컴퓨터 내의 하드디스크에 저장되기도 합니다.

가. 쿠키의 사용 목적 : 이용자가 방문한 각 서비스와 웹 사이트들에 대한 방문 및 이용형태, 인기 검색어, 보안접속 여부, 등을 파악하여 이용자에게 최적화된 정보 제공을 위해 사용됩니다.

나. 쿠키의 설치•운영 및 거부 : 웹브라우저 상단의 도구>인터넷 옵션>개인정보 메뉴의 옵션 설정을 통해 쿠키 저장을 거부 할 수 있습니다.

다. 쿠키 저장을 거부할 경우 맞춤형 서비스 이용에 어려움이 발생할 수 있습니다.

 

 

개인정보 보호책임자 작성

① 매드업은 개인정보 처리에 관한 업무를 총괄해서 책임지고, 개인정보 처리와 관련한 정보주체의 불만처리 및 피해구제 등을 위하여 아래와 같이 개인정보 보호책임자를 지정하고 있습니다.

 

▶ 개인정보 보호책임자

성명 : 강남석

직책 : CFO

직급 : CFO

연락처 : 02-1522-1060, contact@madup.com

※ 개인정보 보호 담당부서로 연결됩니다.

 

▶ 개인정보 보호 담당부서

부서명 : General Affairs Team

담당자 : 민상준

연락처 : 02-1522-1060, contact@madup.com

 

② 정보 주체께서는 매드업의 서비스(또는 사업)을 이용하시면서 발생한 모든 개인정보 보호 관련 문의, 불만처리, 피해구제 등에 관한 사항을 개인정보 보호책임자 및 담당부서로 문의하실 수 있습니다. 매드업은 정보주체의 문의에 대해 지체 없이 답변 및 처리해드릴 것입니다.

 

 

개인정보 처리방침 변경

① 이 개인정보처리방침은 시행일로부터 적용되며, 법령 및 방침에 따른 변경 내용의 추가, 삭제 및 정정이 있는 경우에는 변경사항의 시행 7일 전부터 공지사항을 통하여 고지할 것입니다.

 

 

개인정보의 안전성 확보 조치 <매드업>은 개인정보보호법 제29조에 따라 다음과 같이 안전성 확보에 필요한 기술적/관리적 및 물리적 조치를 하고 있습니다.

가. 정기적인 자체 감사 실시 개인정보 취급 관련 안정성 확보를 위해 정기적(분기 1회)으로 자체 감사를 실시하고 있습니다.

나. 개인정보 취급 직원의 최소화 및 교육 개인정보를 취급하는 직원을 지정하고 담당자에 한정시켜 최소화 하여 개인정보를 관리하는 대책을 시행하고 있습니다.

다. 내부관리계획의 수립 및 시행 개인정보의 안전한 처리를 위하여 내부관리계획을 수립하고 시행하고 있습니다.

라. 해킹 등에 대비한 기술적 대책 <매드업>은 해킹이나 컴퓨터 바이러스 등에 의한 개인정보 유출 및 훼손을 막기 위하여 보안프로그램을 설치하고 주기적인 갱신·점검을 하며 외부로부터 접근이 통제된 구역에 시스템을 설치하고 기술적/물리적으로 감시 및 차단하고 있습니다.

마. 개인정보의 암호화 이용자의 개인정보는 비밀번호는 암호화 되어 저장 및 관리되고 있어, 본인만이 알 수 있으며 중요한 데이터는 파일 및 전송 데이터를 암호화 하거나 파일 잠금 기능을 사용하는 등의 별도 보안기능을 사용하고 있습니다.

바. 접속 기록의 보관 및 위변조 방지 개인정보처리시스템에 접속한 기록을 최소 6개월 이상 보관, 관리하고 있으며, 접속 기록이 위변조 및 도난, 분실되지 않도록 보안기능 사용하고 있습니다.

사. 개인정보에 대한 접근 제한 개인정보를 처리하는 데이터베이스시스템에 대한 접근 권한의 부여,변경,말소를 통하여 개인정보에 대한 접근통제를 위하여 필요한 조치를 하고 있으며 침입차단시스템을 이용하여 외부로부터의 무단 접근을 통제하고 있습니다.

아. 문서 보안을 위한 잠금 장치 사용 개인정보가 포함된 서류, 보조저장매체 등을 잠금 장치가 있는 안전한 장소에 보관하고 있습니다.

자. 비인가자에 대한 출입 통제 개인정보를 보관하고 있는 물리적 보관 장소를 별도로 두고 이에 대해 출입통제 절차를 수립, 운영하고 있습니다.