버전 비교

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

...

  1. PostNews와 같이 Create function 버튼을 클릭해서 UpdateNews 함수를 생성합니다. Runtime과 Role 설정은 기존과 동일합니다.

  2. UpdateNews의 함수 코드를 아래 코드로 대체합니다.

    코드 블럭
    from __future__ import print_function
     
    import boto3
    import os
    import json
    from contextlib import closing
    from boto3.dynamodb.conditions import Key, Attr
    import re
     
    def lambda_handler(event, context):
        polly_message = event["Records"][0]["Sns"]["Message"]
        print (polly_message)
        polly_response = json.loads(polly_message)
     
        # Updating the item in DynamoDB
        dynamodb = boto3.resource('dynamodb')
        table = dynamodb.Table(os.environ['DB_TABLE_NAME'])
      
        response = table.update_item(
            Key={
                'id': polly_response["taskId"]
            },
            UpdateExpression="set pollyStatus = :s",
            ExpressionAttributeValues={
                ':s': polly_response['taskStatus']
            }
        )
         
        print(response)
         
        s3 = boto3.client('s3')
        s3.put_object_acl(
            ACL = 'public-read',
            Bucket = os.environ['BUCKET_NAME'],
            Key = polly_response["taskId"] + ".mp3"
        )
         
        return
  3. 코드 및 환경 변수 설정

Image Removed

Lambda 함수가 기동되는 이벤트 등록

Image Removed

저장하고 나면 NewsTopic에 의해서 트리거가 활성화 된 것을 볼 수 있습니다.

Image Removed

DeleteNews 함수 등록

Image Removed

함수 생성

Image Removed

Image Removed

4개 람다 함수.

Image Removed

API Gateway 생성 및 배포

Image Removed

API Gateway 

Image Removed

생성 화면

Image Removed

Image Removed

Image Removed

Image Removed

Image Removed

Image Removed

Image Removed

Image Removed

Image Removed

Image Removed

Image Removed

Image Removed

Image Removed

Image Removed

Image Removed

Image Removed

Image Removed

...


  1. Environment variables는 DB_TABLE_NAME에 NewsTable 값을 입력하고, BUCKET_NAME에는 S3 버킷 이름(polly-mp3.studydev.com)을 지정합니다. Tags에 Name과 NewsApp을 입력하고, Timeout을 1 min으로 수정합니다.Image Added

  2. UpdateNews Lambda 함수는 SNS Topic에 의해서 트리거 되어 동작이 되어야 합니다.  따라서 Designer 메뉴 좌측에서 SNS를 클릭하여 NewsTopic 을 지정하고 트리거가 발생할 수 있도록 Add 버튼을 클릭합니다.
    Image Added
  3. 우측 상단의 Save 버튼을 클릭하고 나면 NewsTopic에 의해서 트리거가 활성화 된 것을 볼 수 있습니다.
    Image Added


9. DeleteNews Lambda 함수 만들기

  1. DeleteNews 함수를 하나 더 추가하기 위해서 Lambda 서비스의 Function List가 나오는 화면 우측 상단의 Create function 버튼을 클릭합니다.
    Image Added
  2. DeleteNews 함수를 생성합니다. Runtime과 Role 설정은 기존과 동일합니다.
    Image Added
  3. DeleteNews의 함수 코드를 아래 코드로 대체합니다.

    코드 블럭
    from __future__ import print_function
      
    import boto3
    import os
    import json
    from boto3.dynamodb.conditions import Key, Attr
     
    def lambda_handler(event, context):
        if "body" in event:
            params = json.loads(event['body'])
        print (params)
          
        # Bad Request
        if params["postId"] is None or params["postId"] == "":
            response = {
                'statusCode': 400,
                'body': json.dumps({'message': "An unknown error has occurred. Missing required parameters."}),
                'headers': {
                    'Content-Type': 'application/json',
                    'Access-Control-Allow-Origin': '*'
                }
            }
            return response
          
        postId = params["postId"]
        dynamodb = boto3.resource('dynamodb')
        table = dynamodb.Table(os.environ['DB_TABLE_NAME'])
        table.delete_item(Key={"id":postId})
          
        s3 = boto3.client('s3')
        s3.delete_object(Bucket=os.environ['BUCKET_NAME'], Key= postId + ".mp3")
      
        response = {
            'statusCode': 200,
            'body': json.dumps({'message': "item is deleted : " + postId}),
            'headers': {
                'Content-Type': 'application/json',
                'Access-Control-Allow-Origin': '*'
            }
        }
          
        return response


  4. Environment variables는 DB_TABLE_NAME에 NewsTable 값을 입력하고, BUCKET_NAME에는 S3 버킷 이름(polly-mp3.studydev.com)을 지정합니다. Tags에 Name과 NewsApp을 입력하고, Timeout을 1 min으로 수정합니다.
    Image Added

  5. 아래와 같이 4개의 람다 함수가 생성된 것을 확인할 수 있습니다.
    Image Added


10. Lambda 함수를 RESTful 웹 서비스로 만들기

마지막으로해야 할 일은 애플리케이션 로직을 RESTful 웹 서비스로 노출시켜 표준 HTTP 프로토콜을 사용하여 쉽게 호출 할 수 있도록 합니다. 이를 위해 Amazon API Gateway를 사용합니다.

  1. API Gateway 서비스로 이동합니다.
    Image Added
  2. API Gateway 콘솔에서 시작 버튼을 눌러서 API를 생성을 시작합니다.
    Image Added
  3. 다음과 같이 생성 화면이 나오는 것을 확인할 수 있습니다.
    Image Added
  4. REST 방식으로 New API 를 선택고 API의 리소스 이름은 newsapi 로 설정하고, Create API 버튼을 클릭합니다. Endpoint Type은 Edge optimized 를 선택합니다.
    Image Added
  5. API가 생성 된 후, 우리는 3 개의 HTTP 메소드(Actions 버튼을 클릭 후 메서드 생성)를 생성하고 CORS 설정을 합니다.
    1. / 패스를 선택한 상태에서, Actions 버튼을 클릭하여 Create Method 를 클릭합니다.
      Image Added
    2. Method 타입을 선택할 수 있습니다.
      Image Added
    3. GET을 선택하고 같은 방법으로 / 패스를 다시 선택하고 Actions 버튼을 클릭하여 Create Method 를 클릭 합니다.
      Image Added
    4. 같은 방식으로 POST와 DELETE도 추가 합니다.
      Image Added
  6. API Gateway에 대한 각 Method 요청에 대해서 Lambda 함수를 연결합니다.
    1. GET Method로 요청이 올 경우, GetNews Lambda 함수를 호출하도록 설정합니다. Use Lambda Proxy Integration 체크 박스를 클릭합니다. 우측 하단의 Save 버튼을 클릭하면 저장합니다.
      Image Added
    2. API Gateway가 GetNews Lambda 함수를 호출(Invoke) 할 수 있도록 권한을 추가 하냐고 물으면 OK 버튼을 클릭합니다.
      Image Added
    3. POST Method 역시 동일한 방법으로 PostNews Lambda 함수를 호출하도록 지정합니다.
      Image Added
    4. PostNews 로 접근할 수 있는 권한을 부여합니다.
      Image Added
    5. DELETE Method 역시 동일한 방법으로 DeleteNews Lambda 함수를 호출하도록 지정합니다.
      Image Added
    6. 모던 브라우저의 경우 CORS 이슈가 발생할 수 있습니다. 브라우저가 정적 웹 호스팅 중인 S3 버켓에 접속한 상태에서 API Gateway로 배포한 URL로 동적 컨텐츠 호출을 하면 서로 다른 도메인 문제가 발생할 수 있습니다. 이를 해결하기 위해서 / 패스에서 Actions 버튼을 클릭하고 Enable CORS를 클릭합니다.
      Image Added
    7. Access-Control-Allow-Headers와 Access-Control-Allow-Origin* 값을 모두 '*' 값으로 변경하고 우측 하단의 Enable CORS and replace existing CORS headers 버튼을 클릭합니다.
      Image Added
    8. 다음과 같이 팝업창이 나오면서 적용을 할 것인지 물어 봅니다. Yes, replace existing values 버튼을 클릭합니다.
      Image Added
    9. 아래와 같이 CORS 설정이 정상적으로 적용되는 것을 확인 할 수 있습니다.
      Image Added
    10. API 설정이 완료 되었습니다. 이제 배포를 해서 애플리케이션에서 호출할 수 있는 URL을 얻습니다. Actions 에서 Deploy API 를 선택합니다.
      Image Added

    11. 이제 API를 state 스테이지로 배포를 합니다. 개발, 테스트, 프로덕션에 이르기까지 다양한 스테이지로 나누어서 배포가 가능합니다. 여기서는 stage 로 넣고 Deploy 합니다.
      Image Added

    12. 이제 API 배포까지 완료되었습니다. 해당 API를 호출 할 수 있는 URL이 생성되었음을 확인할 수 있습니다.

      정보

      아래와 같이 Invoke URL을 미리 메모장에 기록해 둡니다. 해당 URL을 동적 컨텐츠 수집을 위한 URL로 활용할 예정입니다.

      https://z57gastxh8.execute-api.ap-northeast-2.amazonaws.com/stage


      Image Added


11. 정적 웹 서비스를 위한 S3 버킷 생성 및 배포

Amazon S3는 정적 웹 페이지를 호스팅 할 수 있습니다. 다음의 링크를 통해 정적 웹 호스팅을 하기 위한 패키지를 다운로드 할 수 있습니다: 3개의 파일(html, css, javascript)가 포함되어져 있으며, javascript를 사용하여 동적 컨텐츠 API 호출을 API Gateway로 연결합니다.

다음의 순서로 진행합니다.

  1. 클라이언트 PC에 패키지 파일을 다운로드 받고 압축을 해제합니다.
  2. 기존에 생성한 Amazon API Gateway의 URL을 연결하기 위해서 scripts.js  파일을 열어서 API를 배포하고 받은 URL로 수정합니다.
  1. S3 폴더 만들기

S3 서비스 이동

S3 정적 웹 호스팅용 버킷 만들기

...