[AWS] 기초 과정 실습_2

남이섬·2024년 6월 26일
0

Dynamodb Table 생성하기

DynamoDB 는 AWS의 NoSQL 데이터서비스입니다. 기존에 흔히 사용하시는 Oracle이나 Mysql의 경우, 데이터를 보관하는 형태인 스키마를 정의하고, 이 스키마를 이용해서 데이터를 저장하게 됩니다. 하지만 이 DynamoDB 와 같은 NoSQL 데이터베이스를 이용하시면 이런 스키마 없이 데이터를 원하는 형태로 자유롭게 저장할 수 있습니다. 또한, AWS의 완전관리형 서비스인만큼 서버 관리도 신경쓰지 않으셔도 됩니다.

DynamoDB 생성하기

  1. DynamoDB 를 콘솔창에서 검색해서 들어갑니다. 서비스에 연결할 DynamoDB 테이블을 만들게 되면 멤버의 이름과 성격을 저장해 놓을 수 있습니다. hello-member 이름으로 테이블을 생성하려고 합니다.

  1. DynamoDB 콘솔로 들어가서 왼쪽의 create table 버튼을 누릅니다.

  1. Table name 은 hello-member 로, Partition key는 name 으로 작성합니다. 이 이름은 꼭 똑같이 작성해 주셔야 이후 에러가 나지 않습니다. 작성하신 다음에는 오른쪽 아래의 create table 버튼을 눌러서 생성합니다.

  1. 아래처럼 Status 가 Active 가 될 때까지 기다립니다. 시간이 다소 걸립니다.

이렇게 name 이라는 기본키를 가진 hello-member 테이블을 생성하였습니다. 이제 앱서버 기능을 하는 Lambda를 생성하고 코드를 작성해 보겠습니다. 우리는 전체 아키텍처에서 아래 처럼 DynamoDB 테이블을 생성한겁니다.

Lambda로 앱서버 생성하기

Lambda 는 AWS 의 대표적인 서버리스 서비스로, 서버에 대해서 고민을 하지 않고 서비스를 간단하게 만들 수 있도록 도와드립니다.

많은 요청이 발생할 때에도 Lambda는 자동으로 확장되고, 관리되므로 걱정하지 않고 서비스에만 집중할 수 있습니다. 추가하고 싶은 기능이나, 간단한 서비스를 만드실 때 어렵게 생각하지 말고 Lambda 를 이용할 수 있습니다.

Lambda를 통해서 사진 이미지의 썸네일 버젼을 만드는 기능을 만들수도 있고, 간단하게 데이터 분석을 하고 싶을 때에도 이용할 수 있습니다. 좀 더 익숙해 지시면 AWS 의 이벤트 서비스들과 연동해서 이벤트가 발생했을 때 Lambda 의 기능을 이용해서 이벤트를 처리하는 식으로 사용하실 수도 있습니다. 가능성이 무궁무진한 서비스입니다.

Lambda 생성

Lambda 생성하기

  1. Lambda 를 콘솔창에서 검색해서 들어갑니다.

  1. Lambda 를 처음사용한다면 아래와 같은 화면이 나올겁니다.(아래 처럼 안나온다면 3번으로 넘어갑니다. 기존에 이미 사용을 해봤기 때문에, 화면이 다른 겁니다.) Create a function 을 눌러서 Lambda 생성 메뉴로 들어갑니다.

  1. Lambda 를 이미 사용해 보셨다면, 아래와 같은 화면이 나올겁니다. 왼쪽 탐색창의 Functions를 선택하고, Create a function 을 선택합니다. Lambda 생성 메뉴로 들어갑니다.

  1. Author from scratch 를 선택합니다. 이 메뉴는 Lambda의 모든 설정을 처음부터 해서 만드는 겁니다.

  1. Function name 으로는 api-service-create를 입력하고, Runtime으로는 python 3.9 를 선택합니다.

  1. 이번에는 Permissions 을 직접 생성해 보도록 하겠습니다. Permissions 섹션에서 Execution role 의 Create a new role from AWS policy templates 를 선택합니다. Role name으로는 my-lambda-role으로 작성합니다.

  1. 이번 Function을 만든 다음에는 NoSQL 데이터베이스 서비스인 AWS DynamoDB와 연결할 예정입니다. AWS 서비스끼리 서로 연결하거나 이용하거나 호출하거나 할 때에는 권한이 필요합니다. Simple microservice permissions DynamoDB 를 선택합니다. 그리고 오른쪽 아래의 Create function 버튼을 눌러 다음으로 이동합니다.

  1. Lambda 화면에서 Code source 부분에 아래 코드를 복사 붙여넣기 한 다음 Deploy 버튼을 누릅니다.
import json
import boto3
import random
import json

def lambda_handler(event, context):
    
    member_name = ['Ama','Jone','Zon','Penny','Jessie']
    member_status = ['Happy','Sad','Serious','Satisfied','Free']
    
    dynamodb = boto3.resource('dynamodb',endpoint_url='http://dynamodb.ap-northeast-2.amazonaws.com')
    member_table = dynamodb.Table('hello-member')
    
    name = member_name[random.randint(0,4)]
    status = member_status[random.randint(0, 4)]
    
    member_table.put_item(
       Item={
            'name': name,
            'status': status,
        }
    )
    
    documents = {'name':name,'status':status}
    
    print(documents)
    
    return {
        'statusCode': 200,
        'headers': {'Access-Control-Allow-Origin': '*'},
        'body': json.dumps(documents)
    }

  1. 이제 Test 버튼을 누릅니다.

  1. Configure test event 에는 다음과 같이 입력합니다. Event name 으로는 my-api-test 를 입력하고, Template은 hello-world를 선택합니다. 그리고 Save 버튼을 누릅니다.

  1. 이제 Test 버튼을 누르면 테스트가 진행됩니다. 앞에서 DynamoDB Table을 만들었기 때문에, 오류 없이 아래와 비슷한 결과가 나와야 합니다. 아래 출력된 값들은 랜덤하게 선택된것이기 때문에 다 다오르게 나올겁니다. 하지만 아래 형식으로 나오면 성공한겁니다.

  1. 이제 값이 DynamoDB에 잘 기록이 되었는지 확인 하기위해, DynamoDB 를 콘솔창에서 검색해서 들어갑니다.

  1. 왼쪽 탐색창에서 Tables를 선택하고, 기존에 만들었던 hello-member 테이블을 이름을 누릅니다.

  1. 아래와 같은 테이블 관리 메뉴를 확인 하실수 있습니다. 테이블에 입력된 Item들을 확인하기 위해, Explore table items 버튼을 누릅니다.

  1. 화면의 아래쪽에, Lambda를 실행해서 얻은 값이 입력되있는걸 확인 하실수 있습니다.

  1. 여기까지 됐으면, DynamoDB와 Lambda은 잘 만들어 졌고, 제대로 동작하는걸 확인 했습니다. 이제 인터넷을 통해 람다를 실행할수 있도록 인터넷 주소를 만들어 람다와 연결해 줄겁니다. 그러기 위해서 API Gateway을 배웁니다.

우리는 전체 아키텍처에서 아래 처럼 Lambda와 Dynamodb 테이블을 생성하고 연결한 겁니다.

API Gateway 구성하기

API Gateway 는 AWS의 API 관리 서비스입니다. API 란 외부에서 기업의 서비스를 이용하려고 할때 규격을 정해주는 것을 의미합니다. 일종의 형식을 정해놓고, 이 형식대로 기업의 서비스를 호출하면 기업은 서비스를 제공해 주는 약속이라고 생각하시면 됩니다. API Gateway는 이런 API 를 관리해주고 API 를 통해 외부에서의 호출이 왔을때 대문 역할을 하는 AWS 서비스입니다.

이번 세션에서는 API Gateway 서비스를 생성하고 lambda 와 연결해서 좀 더 완성도 높은 서비스를 만들어 보겠습니다.

API Gateway 생성하기

  1. 앞에서 만든 Lambda를 실행하기 위해 API Gateway 를 구성하여 호출 통로를 만들어보겠습니다. API Gateway 를 콘솔창에서 검색해서 들어갑니다.

  1. 왼쪽의 APIs 메뉴로 들어갑니다.

  1. 어떤 방식의 API를 만들지를 결정해야 하는데 이번에는 HTTP API 보다 API 관리 기능이 더 추가되어 있는 REST API 로 생성해 보겠습니다. REST API 에서 Build 버튼을 누릅니다.

  1. API Details에서 New API, Setting 에서는 API name 을 my-api로 지정합니다. 그 다음 create API 버튼을 누릅니다.

  1. 들어간 화면 오른쪽 아래에 있는 Method Panel에서 Create Method 를 누릅니다.

  1. Create Method 화면이 나오고 여기서 API를 구성할 수 있습니다. Method Type으로 GET을 선택합니다. Integration type은 Lambda Function 을 선택하고, Lambda Proxy integration Toggle 버튼을 클릭하여 활성화해 줍니다. Lambda Function 에는 api-service-create 로 이름을 작성합니다. 다 작성했으면 맨 밑의 Create method 버튼을 누릅니다. 아까 lambda의 이름을 다른 걸로 저장하셨다면 그 lambda 를 찾아서 넣어주시면 됩니다.

  1. 생성한 API의 Resources 메뉴에서 방금 생성한 GET Method를 누르면 이제는 오른쪽에 해당 Method에 관련된 정보가 보이게 됩니다. TEST Tab을 선택하여 테스트를 준비합니다.

  1. 들어간 Tab에서 Test 버튼을 다시 눌러줍니다. 서비스가 더 복잡해지면 여기에서 Request Body 에 값을 추가하고 Headers 에도 추가할 수도 있지만, 지금은 아무 값도 넣지 않아도 됩니다.

  1. Test 가 성공하였다면, Status가 200으로 나오며, Response Body에 랜덤한 값이 나오게 됩니다. 그림과 다른 값이 나오실 수 있습니다.

API Gateway 추가 설정하기

  1. API gateway 를 만들었지만, 바로 호출하면 CORS 관련 에러가 나게 될 것입니다. 따라서 호출이 정상적으로 이루어지기 위한 추가 설정을 하겠습니다. 생성한 API의 Resources 메뉴에서 Enable CORS 를 클릭합니다.

  1. Enable CORS화면의 Access-Control-Allow-Methods 중 방금 생성한 GET Method를 선택한 후 Save 버튼을 클릭합니다.

  1. api 가 정상적으로 작동된다는 것을 확인하고, 추가 설정을 마쳤으니 이제 이 api 를 실제 사용할 수 있게 준비하겠습니다. Resources 화면에서 Deploy API 를 누릅니다.

  1. 누르면 팝업 창이 뜨게 되는데, 여기에서 Stage 에서는 New Stage 를 선택하고 Stage name 에서는 dev 를 입력합니다.

  1. 완료되면 Invoke URL 이 나오게 됩니다. 이 URL 은 사람마다 모두 다릅니다. 이 URL 은 반드시 복사해서 메모장에 붙어넣으시기 바랍니다. 바로 다음 단계에서 활용합니다.

  2. 이 URL을 브라우저에 붙여넣어 접속해 봅니다. 이 작업을 URL을 통해 Lambda를 호출한겁니다. 아래처럼 나오면 성공한겁니다. 문구는 랜덤으로 만들어지는 거라서 아래와 다를 수 있습니다. 이 URL을 다음장에서 html파일에 붙여 넣을겁니다.

이제 다 왔습니다. 마지막으로 S3의 정적 웹사이트 호스팅 기능을 사용하여 Web 서버를 대체할겁니다. S3 bucket에 index.html 파일을 배포하고 권한을 부여하여, 전세계 사용자들이 제가 만든 웹애플리케이션에 접근하여 사용할수 있도록 할겁니다.

우리는 전체 아키텍처에서 아래 처럼 Lambda와 Dynamodb 테이블을 생성하고 API Gateway를 연결한 겁니다.

S3로 웹서버 기능 사용하기

S3는 어디서나 원하는 양의 데이터를 검색할 수 있도록 구축된 객체 스토리지 입니다. Amazon Simple Storage Service(Amazon S3)는 업계 최고 수준의 확장성, 데이터 가용성, 보안 및 성능을 제공하는 객체 스토리지 서비스입니다. 고객은 규모와 업종에 관계없이 원히는 양의 데이터를 저장하고 보호하여 데이터 레이크, 클라우드 네이티브 애플리케이션 및 모바일 앱과 같은 거의 모든 사용 사례를 지원할 수 있습니다. 비용 효율적인 스토리지 클래스와 사용이 쉬운 관리 기능을 통해 비용을 최적화하고, 데이터를 정리하고, 세분화된 액세스 제어를 구성하여 특정 비즈니스, 조직 및 규정 준수 요구 사항을 충족할 수 있습니다.

이번 세션에서는 S3의 정적 웹사이트 호스팅 기능을 활성화하여 S3의 웹서버 기능을 사용해 보겠습니다.

S3 Bucket 생성하기

  1. 이번에는 S3로 정적 웹사이트 호스팅 기능을 사용하기 위해, 먼저 S3 Bucket을 만들어 보겠습니다. S3 를 콘솔창에서 검색해서 들어갑니다.

  1. 아래 화면 처럼 나오다면, 처음 S3를 사용하는 겁니다. Create bucekt 버튼을 누릅니다. 아래화면과 다르게 나온다면 다음으로 넘어 갑니다.

  1. 위와 다르게 아래 화면 처럼 나온다면, 여기서도 마찬가지로 Create bucekt 버튼을 누릅니다.

  1. Bucket name에 my-bucket-[random number] 를 입력합니다. 여기서 [random number]는 무작위 숫자 입니다. 대괄호를 빼야합니다. (Bucket name은 전세계에서 유일해야 합니다.)

  1. 아래쪽으로 내리다보면 Block all public access 선택을 해제 합니다. 그리고 I acknowledge that the current settings might result in this bucket and the objects within becoming public. 은 선택합니다.

  1. 제일 아래로 내려 Create bucket 버튼을 눌러서 Bucket을 생성합니다.

  1. 아래처럼 Bucket이 만들어 졌다면, Bucket 이름을 눌러서 들어 갑니다.

  1. 다음 html 파일 내용을 복사하여, 본인이 많이 사용하는 텍스트 에디터에 붙여 넣고 index.html 파일로 저장합니다. 그리고 50번째 줄의 URL을입력하세요 부분을 앞장에서 만든 API Gateway의 URL로 대체 합니다. 그리고 다시 저장합니다.
<html>

<head>
    <meta charset="utf-8" name="viewport"
        content="width=device-width, height=device-height, minimum-scale=1.0, maximum-scale=1.0, initial-scale=1.0">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <title>Hello World!</title>
    <style>
        #title {
            font-family: arial;
            font-size: 2em;
            color: #eb971a;
            margin-top: 50px;
            text-align: center;
        }

        button {
            background-color: #eb971a;
            border: none;
            color: white;
            border-radius: 5px;
            width: 40%;
            height: 35px;
            font-size: 13pt;
            margin-top: 30px;
            text-align: center;
        }

        #sentence {
            font-size: 17pt;
            margin-top: 30px;
            font-weight: bold;
            color: #eb971a;
        }
    </style>
</head>

<body>
    <p id="title">Hello World From <b>Lambda</b></p>
    <hr id="lambda-line" width="800px" align="center" color="#eb971a;">
    <center><button onclick="checkEvent();">Who are you?</button></center>
    <center>
        <div id="sentence"></div>
    </center>
</body>
<script type="text/javascript">
    function checkEvent() {
        $.ajax({
            type: "GET",
            url: "URL을입력하세요",
            dataType: 'json',
            success: function (data) {
                document.getElementById('sentence').innerHTML = data.status + "&nbsp;&nbsp;" + data.name
            },
            error: function (error) {
                alert('ERROR::');
                console.log(error)
            }
        });
    }
</script>

</html>
  1. 다시 관리 콘솔로 돌아와 Upload 버튼을 누릅니다.

  1. Add files 버튼을 누릅니다. 위에서 저장한 index.html 파일을 선택하고, 제일아래 Upload 버튼을 눌러서 업로드합니다.

  1. 업로드가 성공적으로 된것을 확인하고, Close 버튼을 누릅니다.

  1. 업로드가 잘됐다면, 아래처럼 index.html 파일이 보일겁니다.

  1. 이제 다음장에서 정적 웹사이트 기능을 활성화하고, 권한을 부여해 보겠습니다.

S3 정적 웹사이트 호스팅 기능 활성화하기

  1. S3의 정적 웹사이트 호스팅 기능을 활성화하여 웹서버 기능을 사용해 보기 위해, 아래와 같이 Properties탭을 선택합니다.

  1. 화면 제일 아래쪽으로 스크롤해보면 Static website hosting 섹션을 확인 할수 있습니다. Edit 버튼을 누릅니다.

  1. 설정하는 부분입니다. index document 입력란에 index.html을 입력합니다. 처음 주소로 접속할때 읽어 들일 html파일을 지정해 주는 부분입니다. Save changes 버튼을 눌러서 저장합니다.

  1. 위 설정이 잘되었다면, 정적 웹사이트 기능을 활성화되고, 아래와 같이 주소가 생성됩니다. 우리는 이따가 이 주소로 접속할겁니다.

  1. 아직 외부에서 접근할수 있는 권한이 없어서 정적 웹사이트가 차단되어 있습니다. 외부에서 파일을 읽어 들일수 있도록 권한을 부여할 겁니다. 아래와 같이 Permissions 탭으로 이동합니다. Bucket policy 섹션에 Edit 버튼을 눌러서 수정합니다.

  1. 다음 내용을 복사하여, Bucket policy 편집창에 붙여 넣습니다. 그리고 11,12번째 줄의 [본인버킷번호] 부분을 본인의 Bucket 랜덤 넘버로 변경합니다. 그리고 Save changes 버튼을 눌러서 저장합니다.
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1709405011428",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::my-bucket-[본인버킷번호]",
        "arn:aws:s3:::my-bucket-[본인버킷번호]/*"
      ],
      "Principal": "*"
    }
  ]
}
  1. 정적 웹사이트 호스팅 주소를 브라우저에 붙여 넣어 봅니다. 아래 화면 처럼 나오면 Who are you? 버튼을 눌러줍니다. 람다가 실행되고 Dynamodb에 기록이 잘되었는지 확인합니다.

  2. 이렇게 우리는 아래와 같이 서버리스 아키텍처를 다 완성하였습니다.

profile
즐겁게 살자

0개의 댓글