์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- ํ ์คํธ๋ถ์
- DFS
- ๋น ๋ฐ์ดํฐ
- ๋ฐ์ดํฐ ๋ถ์
- ์๋ฐ์คํฌ๋ฆฝํธ
- github
- ๋ฅ๋ฌ๋
- ์ฝํ
- nlp
- Git
- ํ๋ธ๋ก
- ์ธ๊ณต์ง๋ฅ
- AI
- ํ์ด์ฌ
- ์์ฐ์ด์ฒ๋ฆฌ
- erp
- sap
- ์ฝ๋ฉํ ์คํธ
- ๋ฐฑ์ค
- AWS
- abap
- react
- ๋ฐ์ดํฐ๋ถ์
- ํ๋ธ๋ฃจ
- ์๋ง์กด์น์๋น์ค
- ๊นํ๋ธ
- ํ ์คํธ๋ง์ด๋
- tableau
- ์๊ณ ๋ฆฌ์ฆ
- ๋ฆฌ์กํธ
- Today
- Total
Hey Tech
AWS Lambda์์ AWS S3 ํ์ผ ์ฝ์ด์ค๋ ๋ฐฉ๋ฒ ๋ณธ๋ฌธ
AWS Lambda์์ AWS S3 ํ์ผ ์ฝ์ด์ค๋ ๋ฐฉ๋ฒ
Tony Park (ํ ๋) 2022. 6. 19. 18:06๐ ๋ชฉ์ฐจ
โ AWS ๊ธฐ๋ณธ ์ธํ
1. S3 ๋ฒํท ์์ฑ
2. IAM Role ์์ฑ
3. Lambda ํจ์ ์์ฑ
4. Lambda ํจ์ ์์ฑ
โ AWS ๊ธฐ๋ณธ ์ธํ
๋ณธ๊ฒฉ์ ์ผ๋ก ํํ ๋ฆฌ์ผ์ ์์ํ๊ธฐ์ ์์, AWS ํ์๊ฐ์ ๋ฐ ๋ฆฌ์ ๋ณ๊ฒฝ๊ณผ ๊ฐ์ ๊ธฐ๋ณธ์ ์ธ ์ธํ ์ด ํ์ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ธ ์ธํ ์ด ๋ฏธ๋น๋ ๋ถ๋ค๊ป์๋ ์๋์ '๋๋ณด๊ธฐ' ๋ฒํผ์ ํด๋ฆญํด ์ฃผ์ธ์.
1) ์๋น์ค ๊ฐ์
๋จผ์ AWS ํํ์ด์ง์ ๋ฐฉ๋ฌธํ์ ์ ํ์๊ฐ์ ์ ํ์ ์ผ ํฉ๋๋ค. ์๋์ ๊ฐ์ด ์ต์ด ๊ฐ์ ํ ์ด๋ฉ์ผ ๊ณ์ ์ผ๋ก 1๋ ๊ฐ ๋ฌด๋ฃ ์ฒดํํ(a.k.a., ํ๋ฆฌ ํฐ์ด)์ ์ ๊ณตํฉ๋๋ค. ๋ฌผ๋ก ๋ฌด๋ฃ์ธ ๋งํผ ์ ์ฌ์ ์๋น์ค ๋ฌด๋ฃ๋ก ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค. ํ์๊ฐ์ ์ ํด์ธ ๊ฒฐ์ ๊ฐ ๊ฐ๋ฅํ ์ ์ฉ์นด๋ ๋ฑ๋ก์ด ํ์์ ๋๋ค. ์ ํจํ ์ ์ฉ์นด๋์ธ์ง 100์์ ๊ฒฐ์ ํ๋ค๊ฐ ๊ณง๋ฐ๋ก ์น์ธ ์ทจ์๋๋ ์ ํจํ ์ ์ฉ์นด๋๋ฅผ ์ค๋นํด ์ฃผ์ธ์.
2) ์๋น์ค ์ง์ญ ๋ณ๊ฒฝ
ํ์๊ฐ์ ๊น์ง ์๋ฃํ์ จ๋ค๋ฉด ํ์ฌ PC๋ฅผ ์ฌ์ฉ ์ค์ธ ์ง์ญ๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฑฐ๋ฆฌ์ ์๋ ์๋น์ค ์ง์ญ(Region)์ ์ ํํ์ ์ผ ํฉ๋๋ค. ์ถํ์ ์๋น์ค ์๊ธ์ ๋ํด ์ดํด๋ณด๊ฒ ์ง๋ง, ์๋น์ค ์ง์ญ๋ง๋ค ๊ณผ๊ธ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์๋์ ๊ฐ์ด, AWS ํํ์ด์ง ์ฐ์ธก ์๋จ์ ์ง์ญ ์ด๋ฆ์ ํด๋ฆญํ๋ฉด ์๋น์ค ์ง์ญ์ ๋ณ๊ฒฝํ์ค ์ ์์ต๋๋ค. ๋ํ๋ฏผ๊ตญ์ ๊ฑฐ์ฃผํ๊ณ ๊ณ์๋ค๋ฉด Seoul์ ์ ํํด ์ฃผ๋ฉด ๋ฉ๋๋ค.
1. S3 ๋ฒํท ์์ฑ
AWS S3 ๊ฐ๋ ์ ์๋์ '๋๋ณด๊ธฐ' ๋ฒํผ์ ํด๋ฆญํด ์ฃผ์ธ์.
AWS S3๋ Simple Storage Service์ ์ฝ์ด์ ๋๋ค. S๊ฐ 3๊ฐ์ฌ์ S3๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. S3๋ ์ด๋ฆ์์๋ถํฐ ์ ์ ์๋ฏ์ด, ํ์ผ ์๋ฒ์ ์ญํ ์ ํ๋ ์๋น์ค์ ๋๋ค. S3๋ ํธ๋ํฝ์ด ๊ธ๊ฒฉํ๊ฒ ์ฆ๊ฐํ๋๋ผ๋ ์ฅ๋น๋ฅผ ์ถ๊ฐ ์ฆ์คํ ํ์ ์์ด๋ ํ์ผ ์๋ฒ๋ฅผ ๋ฌธ์ ์์ด ๋์์ํต๋๋ค. S3๋ ์ ์ฅํ ์ ์๋ ํ์ผ์ ๊ฐ์ ์ ํ์ด ์๊ณ , ์ต์ 1๋ฐ์ดํธ๋ถํฐ ์ต๋ 5 ํ ๋ผ๋ฐ์ดํธ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์๋น์คํ ์ ์์ต๋๋ค.
1) S3 ์ฝ์ ์ ๊ทผ
AWS ๊ฒ์์ฐฝ์ S3๋ฅผ ๊ฒ์ํ๊ณ S3 ์ฝ์์ ์ ๊ทผํฉ๋๋ค(๊ทธ๋ฆผ 1).
2) ๋ฒํท(Bucket) ์์ฑ
๊ทธ๋ฆผ 2์ ์ฐ์ธก์ "๋ฒํท ๋ง๋ค๊ธฐ"๋ฅผ ํด๋ฆญํฉ๋๋ค.
3) ๋ฒํท ์ด๋ฆ ์ค์
์ง๊ด์ ์ผ๋ก ์์๋ณผ ์ ์๋ ์ด๋ฆ์ผ๋ก ๋ค์ด๋ฐํฉ๋๋ค(๊ทธ๋ฆผ 3).
4) ๋ฒ์ ๊ด๋ฆฌ ๋ฐ ์ํธํ ํ์ฑํ
์๋์ ๊ทธ๋ฆผ 4์ฒ๋ผ, ๋ฒํท ๋ฒ์ ๊ด๋ฆฌ ๋ฐ ์๋ฒ ์ธก ์ํธํ๋ฅผ ํ์ฑํํฉ๋๋ค. ์ด์ ๋งจ ์ฐ์ธก ํ๋จ์ "๋ฒํท ๋ง๋ค๊ธฐ"๋ฅผ ํด๋ฆญํฉ๋๋ค.
4) ํ์ผ ์ ๋ก๋
์ ๋ก๋ ๋ฒํผ์ ํด๋ฆญํ์ฌ ํ ์คํธ์ฉ ํ ์คํธ ํ์ผ์ ์ ๋ก๋ํฉ๋๋ค(๊ทธ๋ฆผ 5).
2. IAM Role ์์ฑ
IAM์ Identity and Access Management์ ์ฝ์๋ก, ํน์ ์ฌ์ฉ์๋ ๊ทธ๋ฃน์ ์๋น์ค ํน์ ๋ฆฌ์์ค์ ๋ํ ์ ๊ทผ ๊ถํ์ ๊ด๋ฆฌํ๋ ์๋น์ค์ ๋๋ค. IAM ์๋น์ค์ ๋ํ ์์ธํ ๊ฐ๋ ์ค๋ช ์ ์ด๊ณณ์ ์ฐธ๊ณ ํด ์ฃผ์๊ธธ ๋ฐ๋๋๋ค. ์ฌ๊ธฐ์ IAM Role(์ญํ )์ ํน์ AWS ์๋น์ค์ ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํ๋ ๋ณด์ ์ฆ๋ช ์์ ๋๋ค. ์ฝ๊ฒ ๋งํด, AWS ๋ด ์ด๋ค ์๋น์ค๋ฅผ ์ด์ฉํ ์ ์๋ ์๊ฒฉ์ ์๋ฏธํฉ๋๋ค.
1) IAM ์๋น์ค ์ ๊ทผ
AWS ๊ฒ์์ฐฝ์ IAM์ ์ ๋ ฅํ์ฌ IAM ์ฝ์๋ก ์ด๋ํฉ๋๋ค(๊ทธ๋ฆผ 6).
2) ์ญํ ์์ฑ
์ข์ธก์ "์ญํ " ํ ์คํธ๋ฅผ ํด๋ฆญํ์ ํ, ์ฐ์ธก์ "์ญํ ๋ง๋ค๊ธฐ" ๋ฒํผ์ ๋๋ฌ์ฃผ์ธ์(๊ทธ๋ฆผ 7).
3) Lamda ์ ํ
์๋์ ๊ทธ๋ฆผ 8์ฒ๋ผ, ์ฌ์ฉ ์ฌ๋ก๋ Lambda๋ฅผ ์ฌ์ฉํ ์์ ์ด๋ฏ๋ก Lambda๋ฅผ ์ ํํ ํ, ํ๋จ์ "๋ค์" ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค. AWS Lambda ๊ฐ๋ ์ ๋ํ ์์ธํ ์๊ฐ๋ ์ด๊ณณ์ ์ฐธ๊ณ ํด ์ฃผ์ธ์.
4) s3 ์ก์ธ์ค ๊ถํ ์ถ๊ฐ
๊ถํ ์ ์ฑ ๊ฒ์์ฐฝ์ S3๋ฅผ ์ ๋ ฅํ ํ ์๋์ AmazonS3FullAccess๋ฅผ ์ฒดํฌํฉ๋๋ค(๊ทธ๋ฆผ 9). ์ ๋ก๋ํ ํ์ผ์ ์ ์ฅํ๋ ์๋น์ค(S3)์ ๋ํ ๋ชจ๋ ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํ๋ ๊ฒ์ ๋๋ค.
5) ์ญํ ์ด๋ฆ ์ค์
์๋์ ๊ทธ๋ฆผ 10์ฒ๋ผ, ์ญํ ์ ์ด๋ฆ์ ์ง๊ด์ ์ผ๋ก ์์๋ณผ ์ ์๊ฒ ์์ฑํ์ ํ, ๋งจ ํ๋จ์ "์ญํ ์์ฑ" ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
3. Lambda ํจ์ ์์ฑ
AWS Lambda์ ๋ํ ์์ธํ ๊ฐ๋
์ค๋ช
์ ์๋์ ํฌ์คํ
์ ์ฐธ๊ณ ํด ์ฃผ์ธ์.
https://heytech.tistory.com/397
1) Lambda ์ฝ์ ์ ๊ทผ
AWS ํํ์ด์ง ๊ฒ์์ฐฝ์์ Lambda๋ฅผ ๊ฒ์ํ์ฌ Lambda ์ฝ์๋ก ์ด๋ํฉ๋๋ค(๊ทธ๋ฆผ 11).
2) Lambda ํจ์ ์์ฑ
"ํจ์ ์์ฑ" ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค(๊ทธ๋ฆผ 12).
3) Lambda ํจ์ ์์ฑ ์ต์
์๋์ ๊ทธ๋ฆผ 13์ฒ๋ผ ์๋์ ์ต์ ์ ์ ํํ์ ํ ๋งจ ํ๋จ์ "ํจ์ ์์ฑ" ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
- ํจ์ ์ด๋ฆ: ์ง๊ด์ ์ผ๋ก ์์๋ณผ ์ ์๋๋ก ์์ฑ
- ๋ฐํ์: ์ธ์ด ๋ฐ ๋ฒ์ ์ ํ(e.g., Python)
- ์คํ ์ญํ : "๊ธฐ์กด ์ญํ ์ฌ์ฉ" ์ ํ ํ ์์ ์์ฑํ IAM Role ์ ํ
4. Lambda ํจ์ ์์ฑ
lambda_function.py ์ฝ๋์ ๋๋ค.
import json
import boto3
import botocore
BUCKET_NAME = 'file-upload-system-s3'
DIR_NAME = 'data/'
FILE_NAME = 'test.txt'
KEY = DIR_NAME + FILE_NAME
s3 = boto3.client('s3')
def lambda_handler(event, context):
data = s3.get_object(Bucket = BUCKET_NAME, Key = KEY)
res = data['Body'].read()
print(res)
return {
'statusCode': 200,
'body': json.dumps(res.decode('UTF-8'))
}
- 1~3๋ฒ์งธ ์ค: ํ์ ํจํค์ง import
- 5~8๋ฒ์งธ ์ค: S3 ๋ฒํท ์ด๋ฆ, ํ์ผ ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก, ํ์ผ๋ช ์ ์ธ
- 13๋ฒ์งธ ์ค: get_object() ํจ์๋ฅผ ํตํด ๊ฐ์ฒด ๋ถ๋ฌ์ค๊ธฐ
- 14๋ฒ์งธ ์ค: read() ํจ์๋ Byte ํํ๋ก ๋ฐ์ดํฐ ์ฝ์ด์ด
- 18๋ฒ์งธ ์ค: Byte ๋ฐ์ดํฐ๋ฅผ UTF-8๋ก decode ํ์ฌ ์ถ๋ ฅ
์๋์ ๊ทธ๋ฆผ 14์ ๊ฐ์ด, Deploy ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
5. ๊ฒฐ๊ณผ
์๋์ ๊ทธ๋ฆผ 15์ ๊ฐ์ด, ํ ์คํธ ํญ์ผ๋ก ์ด๋ํ์ฌ ํ ์คํธ์ฉ ์ด๋ฒคํธ๋ฅผ ์์ฑํ๊ณ ์ฐ์ธก์ ํ ์คํธ ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
์๋์ ๊ทธ๋ฆผ 16๊ณผ ๊ฐ์ด, ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ํ ์คํธ ํ์ผ ๋ด ๋ฐ์ดํฐ๊ฐ ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋ ๊ฒ์ ํ์ธํ์ค ์ ์์ต๋๋ค.
๐ ์ฐธ๊ณ ํ ๋งํ ํฌ์คํ
1. ํ์ผ ์ ๋ก๋ ์น ํ์ด์ง ๊ตฌ์ถ: (1) React ๊ธฐ๋ฐ Frontend ๊ฐ๋ฐ
2. ํ์ผ ์ ๋ก๋ ์น ํ์ด์ง ๊ตฌ์ถ: (2) AWS IAM ์ญํ ์์ฑ
3. ํ์ผ ์ ๋ก๋ ์น ํ์ด์ง ๊ตฌ์ถ: (3) AWS Lambda ์์ฑ
4. ํ์ผ ์ ๋ก๋ ์น ํ์ด์ง ๊ตฌ์ถ: (4) AWS S3 ์์ฑ
5. ํ์ผ ์ ๋ก๋ ์น ํ์ด์ง ๊ตฌ์ถ: (5) AWS API Gateway ์์ฑ
6. ํ์ผ ์ ๋ก๋ ์น ํ์ด์ง ๊ตฌ์ถ: (6) AWS Lambda ํจ์ ์์ฑ
7. ํ์ผ ์ ๋ก๋ ์น ํ์ด์ง ๊ตฌ์ถ: (7) Axios ๊ธฐ๋ฐ API Call
8. ํ์ผ ์ ๋ก๋ ์น ํ์ด์ง ๊ตฌ์ถ: (8) ํ์ผ ์ ๋ก๋ ํ ์คํธ
9. ํ์ผ ์ ๋ก๋ ์น ํ์ด์ง ๊ตฌ์ถ: (9) AWS S3 ๊ธฐ๋ฐ ์น ํธ์คํ
ํฌ์คํ
๋ด์ฉ์ ์ค๋ฅ๊ฐ ์๊ฑฐ๋ ๋ณด์ํ ์ ์ด ์๋ค๋ฉด ์๋์ ๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์!
๊ทธ๋ผ ์ค๋๋ ๋ฉ์ง ํ๋ฃจ ๋ง๋์๊ธธ ๋ฐ๋๋๋ค :)
๊ณ ๋ง์ต๋๋ค๐