...
PostNews와 같이 Create function 버튼을 클릭해서 UpdateNews 함수를 생성합니다. Runtime과 Role 설정은 기존과 동일합니다.
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
코드 및 환경 변수 설정
Lambda 함수가 기동되는 이벤트 등록
저장하고 나면 NewsTopic에 의해서 트리거가 활성화 된 것을 볼 수 있습니다.
DeleteNews 함수 등록
함수 생성
4개 람다 함수.
API Gateway 생성 및 배포
API Gateway
생성 화면
...
Environment variables는 DB_TABLE_NAME에 NewsTable 값을 입력하고, BUCKET_NAME에는 S3 버킷 이름(
polly-mp3.studydev.com)을 지정합니다. Tags에 Name과 NewsApp을 입력하고, Timeout을 1 min으로 수정합니다.- UpdateNews Lambda 함수는 SNS Topic에 의해서 트리거 되어 동작이 되어야 합니다. 따라서 Designer 메뉴 좌측에서 SNS를 클릭하여 NewsTopic 을 지정하고 트리거가 발생할 수 있도록 Add 버튼을 클릭합니다.
- 우측 상단의 Save 버튼을 클릭하고 나면 NewsTopic에 의해서 트리거가 활성화 된 것을 볼 수 있습니다.
9. DeleteNews Lambda 함수 만들기
- DeleteNews 함수를 하나 더 추가하기 위해서 Lambda 서비스의 Function List가 나오는 화면 우측 상단의 Create function 버튼을 클릭합니다.
- DeleteNews 함수를 생성합니다. Runtime과 Role 설정은 기존과 동일합니다.
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
Environment variables는 DB_TABLE_NAME에 NewsTable 값을 입력하고, BUCKET_NAME에는 S3 버킷 이름(
polly-mp3.studydev.com)을 지정합니다. Tags에 Name과 NewsApp을 입력하고, Timeout을 1 min으로 수정합니다.- 아래와 같이 4개의 람다 함수가 생성된 것을 확인할 수 있습니다.
10. Lambda 함수를 RESTful 웹 서비스로 만들기
마지막으로해야 할 일은 애플리케이션 로직을 RESTful 웹 서비스로 노출시켜 표준 HTTP 프로토콜을 사용하여 쉽게 호출 할 수 있도록 합니다. 이를 위해 Amazon API Gateway를 사용합니다.
- API Gateway 서비스로 이동합니다.
- API Gateway 콘솔에서 시작 버튼을 눌러서 API를 생성을 시작합니다.
- 다음과 같이 생성 화면이 나오는 것을 확인할 수 있습니다.
- REST 방식으로 New API 를 선택고 API의 리소스 이름은 newsapi 로 설정하고, Create API 버튼을 클릭합니다. Endpoint Type은 Edge optimized 를 선택합니다.
- API가 생성 된 후, 우리는 3 개의 HTTP 메소드(Actions 버튼을 클릭 후 메서드 생성)를 생성하고 CORS 설정을 합니다.
- / 패스를 선택한 상태에서, Actions 버튼을 클릭하여 Create Method 를 클릭합니다.
- Method 타입을 선택할 수 있습니다.
- GET을 선택하고 같은 방법으로 / 패스를 다시 선택하고 Actions 버튼을 클릭하여 Create Method 를 클릭 합니다.
- 같은 방식으로 POST와 DELETE도 추가 합니다.
- / 패스를 선택한 상태에서, Actions 버튼을 클릭하여 Create Method 를 클릭합니다.
- API Gateway에 대한 각 Method 요청에 대해서 Lambda 함수를 연결합니다.
- GET Method로 요청이 올 경우, GetNews Lambda 함수를 호출하도록 설정합니다. Use Lambda Proxy Integration 체크 박스를 클릭합니다. 우측 하단의 Save 버튼을 클릭하면 저장합니다.
- API Gateway가 GetNews Lambda 함수를 호출(Invoke) 할 수 있도록 권한을 추가 하냐고 물으면 OK 버튼을 클릭합니다.
- POST Method 역시 동일한 방법으로 PostNews Lambda 함수를 호출하도록 지정합니다.
- PostNews 로 접근할 수 있는 권한을 부여합니다.
- DELETE Method 역시 동일한 방법으로 DeleteNews Lambda 함수를 호출하도록 지정합니다.
- 모던 브라우저의 경우 CORS 이슈가 발생할 수 있습니다. 브라우저가 정적 웹 호스팅 중인 S3 버켓에 접속한 상태에서 API Gateway로 배포한 URL로 동적 컨텐츠 호출을 하면 서로 다른 도메인 문제가 발생할 수 있습니다. 이를 해결하기 위해서 / 패스에서 Actions 버튼을 클릭하고 Enable CORS를 클릭합니다.
- Access-Control-Allow-Headers와 Access-Control-Allow-Origin* 값을 모두 '*' 값으로 변경하고 우측 하단의 Enable CORS and replace existing CORS headers 버튼을 클릭합니다.
- 다음과 같이 팝업창이 나오면서 적용을 할 것인지 물어 봅니다. Yes, replace existing values 버튼을 클릭합니다.
- 아래와 같이 CORS 설정이 정상적으로 적용되는 것을 확인 할 수 있습니다.
API 설정이 완료 되었습니다. 이제 배포를 해서 애플리케이션에서 호출할 수 있는 URL을 얻습니다. Actions 에서 Deploy API 를 선택합니다.
이제 API를 state 스테이지로 배포를 합니다. 개발, 테스트, 프로덕션에 이르기까지 다양한 스테이지로 나누어서 배포가 가능합니다. 여기서는 stage 로 넣고 Deploy 합니다.
이제 API 배포까지 완료되었습니다. 해당 API를 호출 할 수 있는 URL이 생성되었음을 확인할 수 있습니다.
정보 아래와 같이 Invoke URL을 미리 메모장에 기록해 둡니다. 해당 URL을 동적 컨텐츠 수집을 위한 URL로 활용할 예정입니다.
https://z57gastxh8.execute-api.ap-northeast-2.amazonaws.com/stage
- GET Method로 요청이 올 경우, GetNews Lambda 함수를 호출하도록 설정합니다. Use Lambda Proxy Integration 체크 박스를 클릭합니다. 우측 하단의 Save 버튼을 클릭하면 저장합니다.
11. 정적 웹 서비스를 위한 S3 버킷 생성 및 배포
Amazon S3는 정적 웹 페이지를 호스팅 할 수 있습니다. 다음의 링크를 통해 정적 웹 호스팅을 하기 위한 패키지를 다운로드 할 수 있습니다: 3개의 파일(html, css, javascript)가 포함되어져 있으며, javascript를 사용하여 동적 컨텐츠 API 호출을 API Gateway로 연결합니다.
다음의 순서로 진행합니다.
- 클라이언트 PC에 패키지 파일을 다운로드 받고 압축을 해제합니다.
- 기존에 생성한 Amazon API Gateway의 URL을 연결하기 위해서 scripts.js 파일을 열어서 API를 배포하고 받은 URL로 수정합니다.
- S3 폴더 만들기
S3 서비스 이동
S3 정적 웹 호스팅용 버킷 만들기
...