코로나 데이터웨어하우스 구축 연습 (2)

KeonWoo Kim·2021년 6월 14일
0

aws

목록 보기
2/8

목표

클라우드 상에서 데이터를 자동으로 수집하기 위한 환경을 구축해본다
aws s3을 생성한다.
aws lambda를 자동으로 실행시킨다.


aws lambda layer 추가

https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/configuration-layers.html

lambda를 사용하다보면 기본 제공 패키지 외에도 새로운 패키지를 설치해 사용해야 할 때가 있다.
위 문서를 참고해서 알집 파일을 만든 후에 layer를 생성한다.

1) 추가 리소스의 계층에서 계층 생성을 누른다.

2) 계층 이름을 작성하고 알집 파일을 업로드 한 다음에 호환 런타임을 선택하고 생성 버튼을 누른다.

3) 정상적으로 생성되었다면 뒤로 돌아가서 Layers를 클릭하고 Add a layer를 누른다.

4) 사용자 지정 계층을 누르고 만들었던 layer를 선택한 다음에 추가 버튼을 누른다.

5) 다음과 같이 layer가 추가된 것을 볼 수 있다.


aws s3 생성하기

aws lambda를 실행시킬 환경을 다 구성하였다.
코드를 작성하기 전에 결과물을 저장할 s3 저장소를 생성한다.

1) s3을 검색한 다음에 버킷 만들기를 누른다.

2) 버킷 이름을 작성하고 퍼블릭 액세스 차단 설정을 해제한다.
S3에 업로드 된 객체를 어디서든 접근 가능하게 하려면 퍼블릭 액세스 설정을 해제해야 한다.
설정 없이 위의 업로드 한 객체 url을 통해 접근할 경우에는 에러가 발생하며 Access Denied 에러 코드가 발생한다.
실무에서 사용할때는 용도에 따라 차단을 해줘야 하지만 지금은 연습용으로 사용하는 것이므로 차단 설정을 해제해준다.

3) 버킷 만들기 버튼을 클릭하면 다음과 같은 s3 저장소가 생성되었다.


aws lambda 코드 작성하기

1) 실행시킬 코드를 작성한다.

import requests
import datetime
import json
import boto3
import os
from collections import OrderedDict

s3 = boto3.client("s3")

def lambda_handler(event, context):
    
    nowDate = datetime.datetime.now()

    korea = "http://api.corona-19.kr/korea?serviceKey="
    country = "https://api.corona-19.kr/korea/country/new/?serviceKey="
    key = os.environ['KEY']

    response = requests.get(korea + key)
    text = response.text
    data = json.loads(text)
    
    response2 = requests.get(country + key)
    text2 = response2.text
    data2 = json.loads(text2)
    
    code = response.status_code
    code2 = response2.status_code
        
    if code == 200:  # API 응답 헤더 코드가 정상(200)일 경우 데이터 제공
        if code2 == 200:
            # print(data)
            # print(data2)
            
            # year
            year = str(int(nowDate.strftime("%Y")) - 2000)
    
            # day
            st = data["updateTime"]
            firstDot = st.find('.')
            secondDot = st.find('.', firstDot + 1)
            day = str(int(st[firstDot + 1:secondDot]) - 1)
            
            lambda_path1 = "/tmp/total_" + year + nowDate.strftime("%m") + day.zfill(2) + ".json"
            lambda_path2 = "/tmp/city_" + year + nowDate.strftime("%m") + day.zfill(2) + ".json"
            
            key_name1 = "total/total_" + year + nowDate.strftime("%m") + day.zfill(2) + ".json"
            key_name2 = "city/city_" + year + nowDate.strftime("%m") + day.zfill(2) + ".json"
            
            with open(lambda_path1, 'w') as outfile:
                json.dump(data, outfile, ensure_ascii=False, indent="\t")
             
            with open(lambda_path2, 'w') as outfile:
                json.dump(data2, outfile, ensure_ascii=False, indent="\t")
            
            bucket = "testkkw"

            s3.upload_file(lambda_path1, bucket, key_name1) 
            s3.upload_file(lambda_path2, bucket, key_name2) 
    
        else:  # API 응답 헤더 코드가 정상(200)이 아닐 경우, Response Code와 Response Message 노출
            print('=== [ ERROR REPORTING ] ===')
            print("\n")
            print("API 키가 입력되지 않으면 401 Unauthorized 오류가 발생할 수 있습니다. 주석에 있는 설명을 읽어주세요.")
            print("\n")
            print('API Response Code(KOREA):', data["resultCode"])
            print('API Response Message(KOREA):', data["resultMessage"])
            print("\n")
            print('API Response Code(COUNTRY):', data2["resultCode"])
            print('API Response Message(COUNTRY):', data2["resultMessage"])
            print("\n")
            print('API Service by Goodbye-Corona(https://api.corona-19.kr)')
            print('============================')
    else:  # API 응답 헤더 코드가 정상(200)이 아닐 경우, Response Code와 Response Message 노출
        print('=== [ ERROR REPORTING ] ===')
        print("\n")
        print("API 키가 입력되지 않으면 401 Unauthorized 오류가 발생할 수 있습니다. 주석에 있는 설명을 읽어주세요.")
        print("\n")
        print('API Response Code(KOREA):', data["resultCode"])
        print('API Response Message(KOREA):', data["resultMessage"])
        print("\n")
        print('API Response Code(COUNTRY):', data2["resultCode"])
        print('API Response Message(COUNTRY):', data2["resultMessage"])
        print("\n")
        print('API Service by Goodbye-Corona(https://api.corona-19.kr)')
        print('============================')
        
    return {
        'statusCode': 200,
        'body': json.dumps("Success")
    }

2) API key는 외부에 공개되면 안되는 값으로 이러한 값들은 환경 변수로 만들어서 보안을 높여준다.

3) Deloy 버튼을 누른다.

4) Test 버튼을 누르고 이벤트 이름을 작성한 다음에 생성을 누른다.

5) Test 버튼을 한번더 누르면 다음과 같이 에러 없이 정상적으로 실행된 것을 알 수 있다.

6) aws s3에 파일이 정상적으로 업로드 되었다.




cron 표현식을 통해 자동으로 업로드 해보기

aws lambda를 통해 aws s3에 파일을 업로드 하였다.
그러나 위 과정이 자동화되지 않는다면 로컬환경에서 진행하는것과 다를바가 없다.
따라서 aws lambda의 트리거를 이용해서 위 과정을 자동으로 수행해보겠다.

1) 트리거 추가 버튼을 누르고 EventBridge(CloudWatch Events)를 선택한다.

2) 규칙 이름을 작성하고 특정 시간에 자동으로 실행시키기 위해 cron 표현식을 사용한다.
UTC 기준이므로 9시간의 차이가 존재한다. cron 표현식을 작성하고 추가 버튼을 누른다.

3) 다음과 같이 aws lambda 함수에 트리거가 추가된 것을 볼 수 있다.

4) CloudWatch에서 로그 확인을 통해 aws lambda 함수가 정상적으로 12시에 실행된 것을 볼 수 있다.

에러 없이 정상적으로 실행되었다.

5) aws s3에도 정상적으로 업로드 되었다.


소감

간단하지만 파이프라인은 다음과 같다.
openapi를 이용해서 데이터를 가져오며 코드는 lambda를 통해 실행시킨다.
결과물은 aws s3에 자동으로 저장된다.

  1. aws 서비스 종류에 대해 알 수 있었으며 aws 서비스를 사용해보았다.
  2. 클라우드 환경에 대해 공부할 수 있었다.
  3. aws 서비스를 사용해봤단 점에서 큰 의의가 있었다.
profile
안녕하세요

0개의 댓글