버전 비교

  • 이 줄이 추가되었습니다.
  • 이 줄이 삭제되었습니다.
  • 서식이 변경되었습니다.

...

실습 순서는 다음과 같이 Lab1과 Lab2로 구성되어져 있습니다.

Lab1. Cloud9을 이용한 서버리스 웹 애플리케이션 구축

...

  1. Cloud9 IDE 환경 생성

    1. AWS 콘솔 환경에서 Cloud9 서비스로 이동합니다.


    2. Create environment 버튼을 클릭하여 Cloud9 환경을 생성합니다.


    3. Cloud9 이름을 NewsWebApp 이라고 생성합니다. 설명(News Web Application using Serverless Service)은 옵션이기 때문에 넣지 않아도 됩니다. 


    4. Cloud9의 환경설정을 합니다. 개발환경은 EC2 인스턴스로 선택하고 인스턴스 타입은 t2.micro를 선택합니다. 프리티어로 사용할 수 있습니다. Cloud9 IDE를 30분간 사용하지 않으면, 자동으로 EC2 인스턴스가 Stop 되어 비용을 절감할 수 있는 옵션을 기본적으로 제공합니다.


    5. Cloud9 최종 점검을 합니다. 모든 검수가 완료되면 Create environment 버튼을 클릭합니다.


    6. Cloud9 IDE가 준비중인 것을 확인할 수 있습니다. 몇 분이 지나면 IDE가 활성화 됩니다.


    7. Cloud9에서 IDE에 대해서 환경 설정을 할 수 있습니다. 화면과 같이 서비스 배포를 위한 리전을 별도로 지정할 수 있습니다. 여기서는 Singapore 리전을 그대로 사용합니다.
      Image Modified

    8. 개발 환경이 설치되고 서버리스 애플리케이션 개발을 할 준비가 완료되었습니다.
  2. Application 및 "PostNews" Lambda 함수 생성

  3. SAM 기반 서버리스 리소스 추가

  4. "ConvertAudio" Lambda 함수 생성

  5. "GetNews" Lambda 함수 생성

  6. "DeleteNews" Lambda 함수 생성

  7. SAM에서의 Outputs 설정

  8. SAM에서의 CORS 설정

  9. 정적 웹 호스팅을 위한 파일 업로드하기

  10. 서비스 동작 테스트

  11. SAM을 CloudFormation 스택에 직접 반영하기

Lab2. Code* 서비스를 이용한 서버리스 CI/CD 배포 프로세스 구축

  1. 소스 리포지토리를 위해서 CodeCommit 생성

  2. CodeBuiild를 위한  buildspec.yaml 파일 생성

  3. CodePipeline 구축하기

  4. 소스 리포티토리에 코드 체크인하기

  5. 배포 결과 확인 (S3 정적 웹 페이지는 다루지 않습니다.)

  6. API를 이용해서 결과 확인

  7. Canary 배포를 위한 설정하기

  8. CloudFormation에서 CodeDeploy 할 수 있도록 IAM 정책 설정 적용

  9. 코드를 변경하여 배포하고 CodeDeploy 중에 API를 호출하여 적용되는지 확인하기

  10. 기존 배포 버전으로 롤백하기

Lab3. X-ray를 이용한 서버리스 서비스 모니터링 및 디버깅 (9월 예정)

Lab4. LocalStack을 이용한 로컬 테스트 환경 구축 및 테스트 (미정)

Lab5. ElasticSearch를 이용한 검색 서비스 구축 (미정)

Application 및 "PostNews" Lambda 함수 생성

  1. 새로운 애플리케이션 및 람다 함수 생성합니다. Cloud9 IDE 우측 네비게이션의 AWS Resources 탭을 클릭하고, Lambda 아이콘을 클릭하면 새로운 함수를 생성할 수 있습니다.
    Image Removed
  2. Application name에는 WebApp을 Function name에는 PostNews를 입력하고 Next 버튼을 클릭합니다.
    Image Removed
  3. Runtime은 Python 2.7을 선택하고, Blueprint는 hello-world-python을 선택하고 Next 버튼을 클릭합니다.
    Image Removed
  4. 가나다
    Image Removed
  5. 가나다
    Image Removed
  6. 가나다
    Image Removed
  7. 가나다
    Image Removed
  8. 가나다
    1. 새로운 애플리케이션 및 람다 함수를 생성합니다. Cloud9 IDE 우측 네비게이션의 AWS Resources 탭을 클릭하고, Lambda 아이콘을 클릭하면 새로운 함수를 생성할 수 있습니다. 앞으로 추가할 나머지 3개의 함수도 동일한 방법으로 생성합니다.
      Image Added

    2. 화면 중앙에 팝업 창이 표시됩니다. 하단의 Application name에는 WebApp을 상단의 Function name에는 PostNews를 입력하고, Next 버튼을 클릭합니다. 앞으로 추가할 나머지 3개의 함수도 Application name은 동일하게 WebApp을 사용합니다.
      Image Added

    3. Runtime은 Python 2.7을 선택하고, 하단의 Select blueprint는 hello-world-python을 선택하고, Next 버튼을 클릭합니다.
      Image Added

    4. PostNews 함수를 호출하는 주체는 API Gateway입니다. 따라서, Function trigger는 API Gateway를 선택합니다. API 호출에 사용할 리소스 경로는 /news 를 입력합니다. API 호출을 위한 보안 메커니즘은 NONE으로 선택하고, Next 버튼을 클릭합니다.
      Image Added

    5. PostNews 함수를 실행하는 Memory는 128MB로 지정합니다. Role은 Automatically generate role을 선택하고, Next 버튼을 클릭합니다. Role에 들어갈 정책(Policy)는 SAM 템플릿에서 직접 설정할 예정입니다. 
      Image Added

    6. PostNews 함수 구성을 확인합니다. 별도의 이상이 없을 경우, Finish 버튼을 클릭 합니다.
      Image Added

    7. 다음과 같이 Application과 Function이 세팅되는 것을 확인할 수 있습니다.
      Image Added
      1. 좌측 Environment 탭에 WebApp Application 폴더를 생성합니다. 그리고 PostNews 함수에서 사용하는 폴더를 생성합니다.
      2. SAM 템플릿 파일인 template.yaml 파일이 생성되는것을 확인할 수 있습니다.
      3. Lambda 함수가 blueprint에 의해서 자동으로 만들어집니다. 해당 코드는 아래에서 제공하는 PostNews 함수 코드로 대체합니다.
      4. 우측 AWS Resources 탭에 Local Functions에 현재 작업중인 WebApp 폴더와 Application과 PostNews 함수를 생성하는 것을 확인할 수 있습니다.
      5. 자동으로 template을 기반으로 Lambda 서비스에 배포할 수 있습니다. 배포할 경우, 이름은 Cloud9- 접두사와 Application 이름인 WebApp-이 접두사로 붙는 것을 확인할 수 있습니다.

    8. PostNews 함수는 아래에서 제공하는 코드로 대체하고 Ctrl+S를 눌러서 저장합니다. 코드 설명은 주석을 기반으로 생략합니다.

    가나다
    Image Removed

    코드 블럭languageymltheme
    1. Image Modified

      코드 블럭
      languagepy
      themeRDark
      titlePostNews
      linenumberstrue
      # -*- 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
  9. 가나다
    Image Removed

    1. 이번에는 SAM Template을 변경합니다. 먼저 좌측 소스코드 영역에서 template.yaml 파일을 더블클릭하여 편집 창을 열고, 아래 Template 코드로 대체하고, Ctrl+S를 눌러서 저장합니다.
      Image Added

      코드 블럭
      languageyml
      theme
    1. RDark
      titlePostNewsTemplate_01
      linenumberstrue
      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: '*'

    1. SAM 템플릿 구성은 다음과 같습니다.
      Image Added

      1. Globals는 전역으로 사용합니다. 함수(Function)이나 API에서 반복해서 사용하는 것을 선언할 수 있습니다.

      2. Resources는 AWS 서비스를 정의합니다. 각 서비스에 대해서 이름을 선언하고, Type을 정할 수 있습니다.
      3. Runtime은 Function에서 사용합니다. 4개의 Lambda 함수가 모두 Python 2.7 기반이기 때문에 python2.7을 선언합니다.
      4. Type은 서비스 타입을 의미합니다. Lambda 함수, API Gateway, DynamoDB, SNS, S3 등을 표기할 수 있습니다.
        CodeUri는 Lambda 함수가 위치한 폴더를 의미합니다. template.yaml 파일 기준으로 Lambda 함수가 있는 폴더의 이름을 지정합니다.
      5. Handler는 Lambda 함수가 시작하는 함수의 파일명.함수명 에 대한 구성을 의미 합니다. 모두 lambda_function.py 파일에 선언되어 있는 lambda_handler 함수가 시작 함수가 됩니다. 각각의 함수는 폴더가 서로 다릅니다.
      6. MemorySize128MB로 모두 구성되어 있으며, Lambda 함수의 최대 구동 시간은 Timeout 값을 사용하고 60초로 설정합니다.
      7. Events는 Lambda 함수를 트리거하는 이벤트를 의미합니다. API Gateway일 경우 TypeApi가 됩니다. SNS에 의해서 트리거 될 경우, Type은 Sns가 됩니다.
      8. Policies는 해당 함수가 접근할 수 있는 서비스에 대한 권한을 줄 수 있습니다. 각각의 함수는 최소 권한의 원칙에 의거하여 필요한 정책만을 연결합니다.
        PostNews 함수는 동작 로그를 남기기 위해서 logs:PutLogEvents logs:CreateLogStream을, DynamoDB에 항목을 추가하기 위해서 dynamodb:PutItem을 SNS Topic에 게시하기 위해서 sns:Publish를 설정합니다.


  10. SAM 기반 서버리스 리소스 추가

  11. "ConvertAudio" Lambda 함수 생성

  12. "GetNews" Lambda 함수 생성

  13. "DeleteNews" Lambda 함수 생성

  14. SAM에서의 Outputs 설정

  15. SAM에서의 CORS 설정

  16. 정적 웹 호스팅을 위한 파일 업로드하기

  17. 서비스 동작 테스트

  18. SAM을 CloudFormation 스택에 직접 반영하기

Lab2. Code* 서비스를 이용한 서버리스 CI/CD 배포 프로세스 구축

  1. 소스 리포지토리를 위해서 CodeCommit 생성

  2. CodeBuiild를 위한  buildspec.yaml 파일 생성

  3. CodePipeline 구축하기

  4. 소스 리포티토리에 코드 체크인하기

  5. 배포 결과 확인 (S3 정적 웹 페이지는 다루지 않습니다.)

  6. API를 이용해서 결과 확인

  7. Canary 배포를 위한 설정하기

  8. CloudFormation에서 CodeDeploy 할 수 있도록 IAM 정책 설정 적용

  9. 코드를 변경하여 배포하고 CodeDeploy 중에 API를 호출하여 적용되는지 확인하기

  10. 기존 배포 버전으로 롤백하기

Lab3. X-ray를 이용한 서버리스 서비스 모니터링 및 디버깅 (9월 예정)

Lab4. LocalStack을 이용한 로컬 테스트 환경 구축 및 테스트 (미정)

Lab5. ElasticSearch를 이용한 검색 서비스 구축 (미정)


Application 및 "PostNews" Lambda 함수 생성

  1. 배포하기

필수 리소스를 SAM에 추가하고 리소스 확인

...