졜근 κ³ κ°μ‚¬μ˜ μ‹œκ³„μ—΄ λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯된 2~3λ…„μΉ˜μ˜ 데이터 쀑 일뢀λ₯Ό CSV둜 μΆ”μΆœν•˜κ³  GZIP으둜 μ••μΆ•ν•œ ν›„ S3 버킷에 μ—…λ‘œλ“œν•˜λŠ” μœ μ§€λ³΄μˆ˜ μž‘μ—…μ„ μ§„ν–‰ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. κ·Έλ™μ•ˆ 개발자둜 μΌν•΄μ˜€λ©΄μ„œ AWS CLI λ₯Ό 자주 ν™œμš©ν•˜μ§€λŠ” μ•Šμ•˜λ˜ 것 κ°™μŠ΅λ‹ˆλ‹€. μœ μ§€λ³΄μˆ˜ μž‘μ—… κ³Όμ •μ—μ„œ AWS S3 CLI λ₯Ό μ–΄λ–»κ²Œ ν™œμš©ν–ˆλŠ”μ§€ 남겨보도둝 ν•˜λ €κ³  ν•©λ‹ˆλ‹€. 이미 λ§Žμ€ λΈ”λ‘œκ·Έ κΈ€μ—μ„œ 곡유된 λ‚΄μš©μ΄λΌμ„œ ν₯미둜운 μ •λ³΄λŠ” 아닐 것 κ°™μŠ΅λ‹ˆλ‹€.

κ°œλ³„ CSV νŒŒμΌμ„ GZIP 으둜 μ••μΆ•ν•˜κΈ°

μ‹œκ³„μ—΄ λ°μ΄ν„°λ² μ΄μŠ€λ‘œλΆ€ν„° CSV νŒŒμΌλ“€μ€ /data/main/prepare 폴더 ν•˜μœ„μ—{app_name}/{yyyyMM}/{yyyyMMdd}.csv νŒ¨ν„΄μœΌλ‘œ μ €μž₯λ˜λ„λ‘ μΆ”μΆœλ˜λ„λ‘ 미리 μž‘μ—…ν–ˆλŠ”λ°μš”. μ‰˜ 슀크립트λ₯Ό μž‘μ„±ν•΄μ•Όν•˜λ‚˜ μ‹Άμ—ˆμœΌλ‚˜ ChatGPT의 도움을 λ°›μ•„ μ•„λž˜μ™€ 같이 find λͺ…λ Ήμ–΄λ‘œ 찾은 CSV νŒŒμΌλ“€μ„ gzip λͺ…λ Ήμ–΄λ₯Ό μˆ˜ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

prepare.sh
find /data/main/prepare -type f -name "*.csv" -exec gzip {} + # CPU μ½”μ–΄λ₯Ό ν™œμš©ν•œ 병렬 처리 find /data/main -type f -name "*.csv" | xargs -P "$(nproc)" gzip

압좕을 진행할 λ•Œ -exec gzip {} \; λ₯Ό μ‚¬μš©ν–ˆμ—ˆλŠ”λ°νŒŒμΌμ΄ λ§Žμ€ κ²½μš°μ—λŠ” -exec gzip {} + 둜 μˆ˜ν–‰ν•˜λŠ”κ²ƒμ΄ 더 효율적이라고 ν•©λ‹ˆλ‹€. 이 글을 μž‘μ„±ν•˜κΈ° μœ„ν•΄μ„œ μ •λ¦¬ν•˜λ‹€λ³΄λ‹ˆ Bash μ‰˜μ—μ„œλŠ” CPU μ½”μ–΄λ₯Ό μ΅œλŒ€ν•œ ν™œμš©ν•΄μ„œ μ••μΆ•ν•  수 μžˆλŠ” λ‘λ²ˆμ§Έ 방법도 μžˆμŒμ„ μ•Œκ²Œλ˜μ—ˆλ„€μš”.

μ••μΆ•λœ CSV νŒŒμΌμ„ S3 λ²„ν‚·μœΌλ‘œ 보내기

GZIP 으둜 μ••μΆ•λœ CSV νŒŒμΌλ“€μ„ κ³ κ°μ‚¬μ—μ„œ μ œκ³΅ν•΄μ€€ S3 λ²„ν‚·μœΌλ‘œ μ—…λ‘œλ“œν•΄μ•Όν•˜λŠ” μž‘μ—…μ„ 진행해야 ν•©λ‹ˆλ‹€.μ••μΆ•λœ CSV 파일의 총 ν¬κΈ°λŠ” μ•½ 256GB이며 μ—…λ‘œλ“œν•΄μ•Όν•  파일의 κ°œμˆ˜λŠ” 4800개 μ΄μƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€. μ΄λ•Œ sync λͺ…λ Ήμ–΄λ₯Ό μˆ˜ν–‰ν•  λ•Œ μ—…λ‘œλ“œ μ„±λŠ₯을 μœ„ν•΄max_concurrent_requests 섀정값을 λ³€κ²½ν• μˆ˜λ„ μžˆμœΌλ‚˜ 볡제된 μ„œλ²„μ˜ μΈμŠ€ν„΄μŠ€ μ‚¬μ–‘μ˜ λ„€νŠΈμ›Œν¬ 속도가 μ€€μˆ˜ν•˜μ—¬ ꡳ이 λ³€κ²½ν•˜μ§€ μ•Šμ•„λ„30λΆ„ 이내에 μ—…λ‘œλ“œκ°€ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

upload.sh
aws s3 sync /data/main/ s3://bucket_name/ --exclude "*" --include "*.gz"

고객사 인프라이기 λ•Œλ¬Έμ— AWS μ›Ή μ½˜μ†”μ„ 톡해 μ„œλ²„ μΈμŠ€ν„΄μŠ€μ˜ λͺ¨λ‹ˆν„°λ§ μ§€ν‘œλ₯Ό μ‚΄νŽ΄λ³Ό 수 μ—†μ–΄μ„œ μ•„μ‰¬μš΄ 것 κ°™μŠ΅λ‹ˆλ‹€.

AWS S3 호좜 μ‹œ μΈμ¦μ„œ λ°œκΈ‰μž 이슈 πŸ”₯

고객사 인프라 νŒ€μ—μ„œ μœ μ§€λ³΄μˆ˜ μž‘μ—…μ„ μœ„ν•΄ μ‹œκ³„μ—΄ λ°μ΄ν„°λ² μ΄μŠ€μ— λŒ€ν•œ 볡제 μ„œλ²„λ₯Ό μ œκ³΅ν•΄μ£Όμ—ˆμ§€λ§Œ AWS S3λ₯Ό ν˜ΈμΆœν•  수 μžˆκΈ°κΉŒμ§€ 생각보닀 μ‹œκ°„μ΄ 많이 μ†Œμš”λœ 정보λ₯Ό κ³΅μœ ν•΄λ³ΌκΉŒ ν•©λ‹ˆλ‹€. AWS S3 CLI λͺ…λ Ήμ–΄λ₯Ό μˆ˜ν–‰ν•˜λ €κ³  λ³΄λ‹ˆ μ•„λž˜μ™€ 같이SSL CERTIFICATE_VERIFY_FAILED 였λ₯˜κ°€ λ°œμƒν–ˆμ—ˆλŠ”λ°μš”. openssl λͺ…λ Ήμ–΄λ₯Ό 톡해 μΈμ¦μ„œ 체인을 ν™•μΈν•΄λ³΄λ‹ˆ Troubleshooting errors for the AWS CLI에 λ‚˜μ™€μžˆλŠ” κ²ƒμ²˜λŸΌ μΈμ¦μ„œ 체인이 Fortinet 이라고 ν•˜λŠ” WAF에 μ‚¬μš©λ˜λŠ” λ³΄μ•ˆ μ†”λ£¨μ…˜μ΄ λ°œκΈ‰μžμΈ 것을 μ•Œκ²Œλ˜μ—ˆκ³  이에 λŒ€ν•œ 정보λ₯Ό 고객사 λ‹΄λ‹Ήμžλ₯Ό 톡해 μΈν”„λΌνŒ€μœΌλ‘œ μ „λ‹¬ν–ˆμ§€λ§Œλ³΅μ œλœ μ„œλ²„μ—μ„œ S3 κ°„ 톡신은 WAF λ°©ν™”λ²½μ—μ„œ μ œμ™Έλœλ‹€λŠ” 닡변을 λ°›μ•˜μŠ΅λ‹ˆλ‹€.

Terminal
ubuntu@hostname:/data$ aws s3 ls s3://[bucketname] SSL validation failed for https://[bucketname].s3.ap-northeast-2.amazonaws.com/?list-type=2&prefix=&delimiter=%2F&encoding-type=url [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1125) # S3 버킷 μ£Όμ†Œμ— λŒ€ν•œ μΈμ¦μ„œ 체인을 ν™•μΈν•˜λŠ” 방법 ubuntu@hostname:/data$ openssl s_client -showcerts -connect [bucketname].s3.ap-northeast-2.amazonaws.com:443 depth=1 C = US, ST = California, L = Sunnyvale, O = Fortinet, OU = Certificate Authority, CN = FGVM4VTM23003261, emailAddress = support@fortinet.com verify error:num=19;self signed certificate in certificate chain verify return:1 depth=0 CN = *.s3.ap-northeast-2.amazonaws.com verify return:1

AWS S3 CLI λͺ…λ Ήμ–΄ μˆ˜ν–‰ μ‹œβ€“no-verify-ssl μ˜΅μ…˜μ„ 톡해 μΈμ¦μ„œ 검증을 λ¬΄μ‹œν•΄λ³Έ κ²°κ³Ό μ „λ‹¬λ°›μ€μ•‘μ„ΈμŠ€ ν‚€κ°€ S3 버킷에 λŒ€ν•œ κΆŒν•œ(ListObject, GetObject, PutObject)이 μ—†λŠ” κ²ƒμœΌλ‘œ ν™•μΈλ˜μ—ˆμœΌλ©°, 고객사 μΈν”„λΌνŒ€μœΌλ‘œλΆ€ν„° ν•΄κ²°λ˜μ—ˆλ‹€λŠ” 닡변을 λ°›μ•˜μ„ λ•Œ μ •ν™•ν•œ 원인은 κ³΅μœ λ˜μ§€ μ•Šμ•˜κΈ°μ— μ–΄λ– ν•œ μ‚¬μœ λ‘œ ν¬ν‹°λ„·μ˜ μΈμ¦μ„œκ°€ μ „λ‹¬λ˜μ—ˆλŠ”μ§€λŠ” μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€.

S3 버킷 동기화 κ²°κ³Ό ν™•μΈν•˜κΈ°

AWS S3 CLI의 sync λͺ…λ Ήμ–΄λ₯Ό 톡해 μ—…λ‘œλ“œλœ CSV μ••μΆ• 파일의 μ΅œμ’… μ—…λ‘œλ“œ κ²°κ³Όλ₯Ό 톡해 μ œλŒ€λ‘œ μ „λ‹¬λ˜μ—ˆλŠ”μ§€λ₯Ό κ²€μ¦ν•΄μ•Όν•©λ‹ˆλ‹€. 이 방법에 λŒ€ν•΄μ„œλ„ μ°Ύμ•„λ³΄λ‹ˆ –summarize κ³Ό –human-readable μ˜΅μ…˜μ„ 톡해 S3 버킷에 λŒ€ν•œ μŠ€ν† λ¦¬μ§€ μ§€ν‘œλ₯Ό 계산할 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

Terminal
aws s3 ls s3://[bucketname] --recursive --summarize --human-readable Total Objects: 4895 Total Size: 295.0 GiB

이번 μœ μ§€λ³΄μˆ˜ μž‘μ—… μ‹œ λ¦¬λˆ…μŠ€ λͺ…령와 μ‰˜ 슀크립트 μž‘μ„± μ‹œ ChatGPT와 같은 μƒμ„±ν˜• AIλ₯Ό μ΅œλŒ€ν•œ ν™œμš©ν•˜μ—¬ 생각보닀 μ‰½κ²Œ 진행할 수 μžˆμ—ˆλ˜ 것 κ°™μŠ΅λ‹ˆλ‹€. κ³ κ°μ‚¬μ—μ„œ μš”κ΅¬ν•œ μœ μ§€λ³΄μˆ˜ μž‘μ—…μ€ 아직 λ‚¨μ•„μžˆμœΌλ‚˜ AI μ—μ΄μ „νŠΈ 도움을 톡해 μ˜ˆμƒλ³΄λ‹€ 더 λΉ λ₯΄κ²Œ μ™„λ£Œλ  κ²ƒμœΌλ‘œ μƒκ°λ©λ‹ˆλ‹€.