
LAB. Kinesis를 활용한 로그 데이터 수집 파이프라인 구축 : applog1
워크플로우
1. 역할 생성
2. API GateWay 생성
3. Kinesis Data Streams 생성
4. S3 버킷 생성
5. Data Firehose 생성
6. 웹서버 구성
7. TEST
8. Web APP TEST with Streamlit

#set ( $enter = "
")
#set($json = "$input.json('$')$enter")
{
"Data": "$util.base64Encode("$json")",
"PartitionKey": "$input.params('X-Amzn-Trace-Id')",
**"StreamName": "$input.params('stream-name')"**
}stream-name 값을 사용하여 스트림 이름을 설정함[ec2-user@ip-10-0-0-120 ~]$ sudo yum remove awscli
[ec2-user@ip-10-0-0-120 ~]$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
[ec2-user@ip-10-0-0-120 ~]$ unzip awscliv2.zip
[ec2-user@ip-10-0-0-120 ~]$ sudo ./aws/install
[ec2-user@ip-10-0-0-120 ~]$ aws --version
aws-cli/2.17.36 Python/3.11.9 Linux/6.8.0-1012-aws exe/x86_64.ubuntu.24
# 위에 명령어가 실행되지 않는 경우 path를 변경해주어야함
[ec2-user@ip-10-0-0-120 ~]$ /usr/local/bin/aws --version
aws-cli/2.17.60 Python/3.12.6 Linux/6.1.109-118.189.amzn2023.x86_64 exe/x86_64.amzn.2023
[ec2-user@ip-10-0-0-120 ~]$ sudo mv /usr/local/bin/aws /usr/bin/# AWS CLI에서 AWS 서비스에 접근할 수 있는 자격 증명을 설정
[ec2-user@ip-10-0-0-126 ~]$ aws configure
AWS Access Key ID [None]: AROA4MTW...
AWS Secret Access Key [None]: U6/kl2L7Zni5CM4LU1...
Default region name [None]: 리젼
Default output format [None]: json
# 인증된 자격 증명 불러오기
[ec2-user@ip-10-0-0-126 ~]$ aws sts get-caller-identity
{
"UserId": "AROA4MTW...",
"Account": "851725267032",
"Arn": "arn:aws:sts::851...:assumed-role/manage-role/i-0c3ea16fa09b2404b"
}
# 버킷 확인
[ec2-user@ip-10-0-0-126 ~]$ aws s3 ls
2024-10-10 02:46:58 api-data-stream-bucket
[ec2-user@ip-10-0-0-126 ~]$ sudo yum search java-11
[ec2-user@ip-10-0-0-126 ~]$ sudo yum install -y java-11-amazon-corretto
[ec2-user@ip-10-0-0-126 ~]$ java --versionPOST URL : https://k6fdj18hji.execute-api.ap-northeast-2.amazonaws.com/dev/v1/{stream-name}
# Post json
[ec2-user@ip-10-0-0-126 ~]$
curl -d "{\"value\":\"30\",\"type\":\"Tip 3\"}" \
-H "Content-Type: application/json" \
-X POST \
https://nc5ay6eyhd.execute-api.ap-northeast-2.amazonaws.com/dev/v1/applog1
# shell 에서 shard의 값을 확인
{"SequenceNumber":"49656616735127373407378311837199279454763322191160279042","ShardId":"shardId-000000000000"}
# 스트림 이름 변경
[ec2-user@ip-10-0-0-179 ~]$ SHARD_ITERATOR=$(aws kinesis get-shard-iterator --shard-id shardId-000000000000 --shard-iterator-type TRIM_HORIZON --stream-name applog1 --query 'ShardIterator')
#
[ec2-user@ip-10-0-0-179 ~]$ aws kinesis get-records --shard-iterator $SHARD_ITERATOR
{
"Records": [],
"NextShardIterator": "AAAAAAAAAAHnbzk8aRRtM0PHrBwbXwAQdNdBHTMjP6cYs+V3pgP6F2IOZUFWlDLvC5tf987Yje2wrfvBC50kMDz7fffsw/cVsXpxrl1WU78D7TH+QKDb6/n47j59UoWndURSejfKVTozqBt1r/Mw95FTu94Qf73byiGf3NjbAOVBXP2q4sPIeITPRX6p330qmI/uU6KmWWQ57sOd1g2rE03mbl9wOR1PyNaIpdOHnoK03xYBU2LvrQ==",
"MillisBehindLatest": 0
}
streamlit 설치
[ec2-user@ip-10-0-0-179 ~]$ python3 --version
[ec2-user@ip-10-0-0-179 ~]$ sudo yum install pip -y
[ec2-user@ip-10-0-0-179 ~]$ pip install streamlit
# 샘플 데모 앱 실행
[ec2-user@ip-10-0-0-179 ~]$ streamlit hello
인바운드 추가
접속 확인
실습을 위한 Streamlit 프로그램 작성 : event_click_log.py
[ec2-user@ip-10-0-0-179 ~]$ cat > event_click_log.py
import streamlit as st
import requests
import datetime
import json
button_style = """
padding: 10px 20px; /* Adjust padding to change button size */
font-size: 16px; /* Adjust font size */
width: 80%;
"""
st.markdown(f'<style>{button_style}</style>', unsafe_allow_html=True)
# Function to send a POST request based on the button clicked
# 이곳의 URL을 API URL로 수정
def send_post_request(event_params):
**# 여기 수정**
url = "https://nc5ay6eyhd.execute-api.ap-northeast-2.amazonaws.com/dev/v1/applog1"
json_data = json.dumps(event_params)
response = requests.post(url, data=json_data, headers={'Content-Type': 'application/json'})
# 현재 날짜 및 시간을 얻습니다.
current_time = datetime.datetime.now()
# 현재 날짜 및 시간을 long 값으로 변환 (Unix 시간의 밀리초 버전)
long_timestamp = int(current_time.timestamp() * 1000)
print("Long 값:", long_timestamp)
# 현재 시간을 원하는 형식으로 출력
formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S")
print("현재 시간 (형식화):", formatted_time)
# Define your event data
event_data = [
{'event_name':'zb_app_install','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10310425','screen_name':'권한 요청','FALSE':'phone_id'} ,
{'event_name':'view_item','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10442413','screen_name':'내정보','':'phone_id'} ,
{'event_name':'zb_dialog_show','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10493118','screen_name':'내정보 번호변경','':'phone_id'} ,
{'event_name':'zb_screen_list_click','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10465756','screen_name':'내정보 비밀번호변경','':'phone_id'} ,
{'event_name':'oneroom_filter_results','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10420590','screen_name':'내정보 이름변경','':'phone_id'} ,
{'event_name':'zb_app_install','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10238586','screen_name':'로그인','':'phone_id'} ,
{'event_name':'screen_view','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10432617','screen_name':'로그인 비밀번호찾기','':'phone_id'} ,
{'event_name':'zb_vr_loading','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10435194','screen_name':'로그인 이메일','':'phone_id'} ,
{'event_name':'zb_view_contents','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10456187','screen_name':'로그인 이메일찾기','':'phone_id'} ,
{'event_name':'user_engagement','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10440393','screen_name':'로그인 이메일확인','':'phone_id'} ,
{'event_name':'zb_screen_click','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10478202','screen_name':'로그인 인증','':'phone_id'} ,
{'event_name':'sign_up','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10446125','screen_name':'메인','':'phone_id'} ,
{'event_name':'apt_filter_results','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10469918','screen_name':'문의하기','':'phone_id'} ,
{'event_name':'session_start','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10171775','screen_name':'문자보내기','':'phone_id'} ,
{'event_name':'view_item','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10450963','screen_name':'스플래시','':'phone_id'} ,
{'event_name':'ecommerce_purchase','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10393346','screen_name':'아파트 검색','':'phone_id'} ,
{'event_name':'add_to_wishlist','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10454369','screen_name':'아파트 교통정보상세','':'phone_id'} ,
{'event_name':'first_open','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10281808','screen_name':'아파트 단지목록','':'phone_id'} ,
{'event_name':'zb_screen_view','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10473864','screen_name':'아파트 리뷰등록','':'phone_id'} ,
{'event_name':'zb_way_searching','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10455493','screen_name':'아파트 리뷰목록','':'phone_id'} ,
{'event_name':'zb_vr_moving','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10409337','screen_name':'아파트 매물','':'phone_id'} ,
{'event_name':'_exp_set','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10408885','screen_name':'아파트 매물내놓기','':'phone_id'} ,
{'event_name':'gtm.load','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'9581516','screen_name':'아파트 매물목록','':'phone_id'} ,
{'event_name':'add_to_cart','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10374993','screen_name':'아파트 매물상세','':'phone_id'} ,
{'event_name':'view_search_results','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10341308','screen_name':'아파트 매물필터','':'phone_id'} ,
{'event_name':'zb_screen_list_state','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10338845','screen_name':'아파트 면적유형상세','':'phone_id'} ,
{'event_name':'zb_screen_map_click','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10273273','screen_name':'아파트 문의한매물','':'phone_id'} ,
{'event_name':'zb_way_searching','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10310425','screen_name':'아파트 상세','':'phone_id'} ,
{'event_name':'zb_vr_moving','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10442413','screen_name':'아파트 수정요청등록','':'phone_id'} ,
{'event_name':'_exp_set','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10493118','screen_name':'아파트 시세변동필터','':'phone_id'} ,
{'event_name':'gtm.load','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10465756','screen_name':'아파트 시세정보상세','':'phone_id'} ,
{'event_name':'add_to_cart','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10420590','screen_name':'아파트 시세지도','':'phone_id'} ,
{'event_name':'view_search_results','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10238586','screen_name':'아파트 시세필터','':'phone_id'} ,
{'event_name':'zb_screen_list_state','gtmLongTime':long_timestamp,'base_dt':formatted_time,'item_id':'10432617','screen_name':'아파트 실거래이력','':'phone_id'}
]
# Number of columns in the grid
num_columns = 4
# Streamlit app title
st.title("Event Data \n Post Request Button Grid")
# Create a button grid
for i in range(0, len(event_data), num_columns):
button_row = event_data[i:i+num_columns]
# col1, col2, col3, col4,col5,col6,col7,col8 = st.columns(num_columns)
col1, col2, col3, col4 = st.columns(num_columns)
for j, event_params in enumerate(button_row):
with globals()[f"col{j+1}"]:
if st.button(event_params['screen_name'], key=event_params['screen_name']):
send_post_request(event_params)
프로그램 실행
[ec2-user@ip-10-0-0-179 ~]$ streamlit run event_click_log.py
****Collecting usage statistics. To deactivate, set browser.gatherUsageStats to false.
You can now view your Streamlit app in your browser.
Local URL: http://localhost:8501
Network URL: http://10.0.0.179:8501
External URL: http://43.203.206.143:8501

데이터 파이프 라인 확인

