...
실습 순서는 다음과 같이 Lab1과 Lab2로 구성되어져 있습니다.
Lab1. Cloud9을 이용한 서버리스 웹 애플리케이션 구축
...
Cloud9 IDE 환경 생성
- AWS 콘솔 환경에서 Cloud9 서비스로 이동합니다.
- Create environment 버튼을 클릭하여 Cloud9 환경을 생성합니다.
- Cloud9 이름을 NewsWebApp 이라고 생성합니다. 설명(News Web Application using Serverless Service)은 옵션이기 때문에 넣지 않아도 됩니다.
- Cloud9의 환경설정을 합니다. 개발환경은 EC2 인스턴스로 선택하고 인스턴스 타입은 t2.micro를 선택합니다. 프리티어로 사용할 수 있습니다. Cloud9 IDE를 30분간 사용하지 않으면, 자동으로 EC2 인스턴스가 Stop 되어 비용을 절감할 수 있는 옵션을 기본적으로 제공합니다.
- Cloud9 최종 점검을 합니다. 모든 검수가 완료되면 Create environment 버튼을 클릭합니다.
- Cloud9 IDE가 준비중인 것을 확인할 수 있습니다. 몇 분이 지나면 IDE가 활성화 됩니다.
- Cloud9에서 IDE에 대해서 환경 설정을 할 수 있습니다. 화면과 같이 서비스 배포를 위한 리전을 별도로 지정할 수 있습니다. 여기서는 Singapore 리전을 그대로 사용합니다.
- 개발 환경이 설치되고 서버리스 애플리케이션 개발을 할 준비가 완료되었습니다.
- AWS 콘솔 환경에서 Cloud9 서비스로 이동합니다.
Application 및 "PostNews" Lambda 함수 생성
SAM 기반 서버리스 리소스 추가
"ConvertAudio" Lambda 함수 생성
"GetNews" Lambda 함수 생성
"DeleteNews" Lambda 함수 생성
SAM에서의 Outputs 설정
SAM에서의 CORS 설정
정적 웹 호스팅을 위한 파일 업로드하기
서비스 동작 테스트
SAM을 CloudFormation 스택에 직접 반영하기
Lab2. Code* 서비스를 이용한 서버리스 CI/CD 배포 프로세스 구축
소스 리포지토리를 위해서 CodeCommit 생성
CodeBuiild를 위한 buildspec.yaml 파일 생성
CodePipeline 구축하기
소스 리포티토리에 코드 체크인하기
배포 결과 확인 (S3 정적 웹 페이지는 다루지 않습니다.)
API를 이용해서 결과 확인
Canary 배포를 위한 설정하기
CloudFormation에서 CodeDeploy 할 수 있도록 IAM 정책 설정 적용
코드를 변경하여 배포하고 CodeDeploy 중에 API를 호출하여 적용되는지 확인하기
기존 배포 버전으로 롤백하기
Lab3. X-ray를 이용한 서버리스 서비스 모니터링 및 디버깅 (9월 예정)
Lab4. LocalStack을 이용한 로컬 테스트 환경 구축 및 테스트 (미정)
Lab5. ElasticSearch를 이용한 검색 서비스 구축 (미정)
Application 및 "PostNews" Lambda 함수 생성
- 새로운 애플리케이션 및 람다 함수 생성합니다. Cloud9 IDE 우측 네비게이션의 AWS Resources 탭을 클릭하고, Lambda 아이콘을 클릭하면 새로운 함수를 생성할 수 있습니다.
- Application name에는 WebApp을 Function name에는 PostNews를 입력하고 Next 버튼을 클릭합니다.
- Runtime은 Python 2.7을 선택하고, Blueprint는 hello-world-python을 선택하고 Next 버튼을 클릭합니다.
- 가나다
- 가나다
- 가나다
- 가나다
- 가나다
새로운 애플리케이션 및 람다 함수를 생성합니다. Cloud9 IDE 우측 네비게이션의 AWS Resources 탭을 클릭하고, Lambda 아이콘을 클릭하면 새로운 함수를 생성할 수 있습니다. 앞으로 추가할 나머지 3개의 함수도 동일한 방법으로 생성합니다.
- 화면 중앙에 팝업 창이 표시됩니다. 하단의 Application name에는 WebApp을 상단의 Function name에는 PostNews를 입력하고, Next 버튼을 클릭합니다. 앞으로 추가할 나머지 3개의 함수도 Application name은 동일하게 WebApp을 사용합니다.
- Runtime은 Python 2.7을 선택하고, 하단의 Select blueprint는 hello-world-python을 선택하고, Next 버튼을 클릭합니다.
- PostNews 함수를 호출하는 주체는 API Gateway입니다. 따라서, Function trigger는 API Gateway를 선택합니다. API 호출에 사용할 리소스 경로는 /news 를 입력합니다. API 호출을 위한 보안 메커니즘은 NONE으로 선택하고, Next 버튼을 클릭합니다.
- PostNews 함수를 실행하는 Memory는 128MB로 지정합니다. Role은 Automatically generate role을 선택하고, Next 버튼을 클릭합니다. Role에 들어갈 정책(Policy)는 SAM 템플릿에서 직접 설정할 예정입니다.
- PostNews 함수 구성을 확인합니다. 별도의 이상이 없을 경우, Finish 버튼을 클릭 합니다.
- 다음과 같이 Application과 Function이 세팅되는 것을 확인할 수 있습니다.
- 좌측 Environment 탭에 WebApp Application 폴더를 생성합니다. 그리고 PostNews 함수에서 사용하는 폴더를 생성합니다.
- SAM 템플릿 파일인 template.yaml 파일이 생성되는것을 확인할 수 있습니다.
- Lambda 함수가 blueprint에 의해서 자동으로 만들어집니다. 해당 코드는 아래에서 제공하는 PostNews 함수 코드로 대체합니다.
- 우측 AWS Resources 탭에 Local Functions에 현재 작업중인 WebApp 폴더와 Application과 PostNews 함수를 생성하는 것을 확인할 수 있습니다.
- 자동으로 template을 기반으로 Lambda 서비스에 배포할 수 있습니다. 배포할 경우, 이름은 Cloud9- 접두사와 Application 이름인 WebApp-이 접두사로 붙는 것을 확인할 수 있습니다.
PostNews 함수는 아래에서 제공하는 코드로 대체하고 Ctrl+S를 눌러서 저장합니다. 코드 설명은 주석을 기반으로 생략합니다.
가나다
코드 블럭 language yml theme 코드 블럭 language py theme RDark title PostNews linenumbers true # -*- coding: utf-8 -*- from __future__ import print_function import boto3 import os import json import uuid import datetime def lambda_handler(event, context): if "body" in event: event = json.loads(event['body']) print (event) recordId = str(uuid.uuid4()) voice = event["voice"] originText = event["text"] timbre = event["timbre"] pitch = event["pitch"] updateDate = datetime.datetime.now().strftime("%Y%m%d") print('Generating new DynamoDB record, with ID: ' + recordId) # Create the item in DynamoDB table dynamodb = boto3.resource('dynamodb') table = dynamodb.Table(os.environ['DB_TABLE_NAME']) table.put_item( Item={ 'id' : recordId, 'originText': originText, 'postDate': int(updateDate), 'pollyVoice' : voice, 'pollyStatus' : "PROCESSING", 'pollyTimbre': timbre, 'pollyPitch': pitch } ) # Sending notification about new post to SNS client = boto3.client('sns') client.publish( TopicArn = os.environ['SNS_TOPIC'], Message = recordId ) response = { 'statusCode': 200, 'body': json.dumps({'recordId': recordId}), 'headers': { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' } } return response
- 가나다
이번에는 SAM Template을 변경합니다. 먼저 좌측 소스코드 영역에서 template.yaml 파일을 더블클릭하여 편집 창을 열고, 아래 Template 코드로 대체하고, Ctrl+S를 눌러서 저장합니다.
코드 블럭 language yml theme
RDark title PostNewsTemplate_01 linenumbers true AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Description: >- Building Serverless development environment and CI/CD process for DevOps based on Cloud9 Globals: Function: Runtime: python2.7 Handler: lambda_function.lambda_handler MemorySize: 128 Timeout: 60 Resources: PostNews: Type: 'AWS::Serverless::Function' Properties: CodeUri: PostNews Description: Post news text to convert from text to speech Events: PostNewsApi: Type: Api Properties: Path: /news Method: POST Policies: - Version: '2012-10-17' Statement: - Effect: Allow Action: - 'logs:PutLogEvents' - 'logs:CreateLogStream' - 'dynamodb:PutItem' - 'sns:Publish' Resource: '*'
SAM 템플릿 구성은 다음과 같습니다.
Globals는 전역으로 사용합니다. 함수(Function)이나 API에서 반복해서 사용하는 것을 선언할 수 있습니다.
- Resources는 AWS 서비스를 정의합니다. 각 서비스에 대해서 이름을 선언하고, Type을 정할 수 있습니다.
- Runtime은 Function에서 사용합니다. 4개의 Lambda 함수가 모두 Python 2.7 기반이기 때문에 python2.7을 선언합니다.
- Type은 서비스 타입을 의미합니다. Lambda 함수, API Gateway, DynamoDB, SNS, S3 등을 표기할 수 있습니다.
CodeUri는 Lambda 함수가 위치한 폴더를 의미합니다. template.yaml 파일 기준으로 Lambda 함수가 있는 폴더의 이름을 지정합니다. - Handler는 Lambda 함수가 시작하는 함수의 파일명.함수명 에 대한 구성을 의미 합니다. 모두 lambda_function.py 파일에 선언되어 있는 lambda_handler 함수가 시작 함수가 됩니다. 각각의 함수는 폴더가 서로 다릅니다.
- MemorySize는 128MB로 모두 구성되어 있으며, Lambda 함수의 최대 구동 시간은 Timeout 값을 사용하고 60초로 설정합니다.
- Events는 Lambda 함수를 트리거하는 이벤트를 의미합니다. API Gateway일 경우 Type은 Api가 됩니다. SNS에 의해서 트리거 될 경우, Type은 Sns가 됩니다.
- Policies는 해당 함수가 접근할 수 있는 서비스에 대한 권한을 줄 수 있습니다. 각각의 함수는 최소 권한의 원칙에 의거하여 필요한 정책만을 연결합니다.
PostNews 함수는 동작 로그를 남기기 위해서 logs:PutLogEvents와 logs:CreateLogStream을, DynamoDB에 항목을 추가하기 위해서 dynamodb:PutItem을 SNS Topic에 게시하기 위해서 sns:Publish를 설정합니다.
SAM 기반 서버리스 리소스 추가
"ConvertAudio" Lambda 함수 생성
"GetNews" Lambda 함수 생성
"DeleteNews" Lambda 함수 생성
SAM에서의 Outputs 설정
SAM에서의 CORS 설정
정적 웹 호스팅을 위한 파일 업로드하기
서비스 동작 테스트
SAM을 CloudFormation 스택에 직접 반영하기
Lab2. Code* 서비스를 이용한 서버리스 CI/CD 배포 프로세스 구축
소스 리포지토리를 위해서 CodeCommit 생성
CodeBuiild를 위한 buildspec.yaml 파일 생성
CodePipeline 구축하기
소스 리포티토리에 코드 체크인하기
배포 결과 확인 (S3 정적 웹 페이지는 다루지 않습니다.)
API를 이용해서 결과 확인
Canary 배포를 위한 설정하기
CloudFormation에서 CodeDeploy 할 수 있도록 IAM 정책 설정 적용
코드를 변경하여 배포하고 CodeDeploy 중에 API를 호출하여 적용되는지 확인하기
기존 배포 버전으로 롤백하기
Lab3. X-ray를 이용한 서버리스 서비스 모니터링 및 디버깅 (9월 예정)
Lab4. LocalStack을 이용한 로컬 테스트 환경 구축 및 테스트 (미정)
Lab5. ElasticSearch를 이용한 검색 서비스 구축 (미정)
Application 및 "PostNews" Lambda 함수 생성
- 배포하기
필수 리소스를 SAM에 추가하고 리소스 확인
...