Loading [MathJax]/jax/output/CommonHTML/jax.js
 

[AWS] Lambda 톺아보기

오늘은 세미나에서 학습했던 AWS의 Lambda에 대해 리뷰하고자 한다.

 

Server

 

우선 Lambda 서비스를 이해하기 위해서 Server에 대해 이해해야 할 필요가 있다.

 

Server란 이름 그대로 서비스를 제공하는 주체로, 여기서 서비스란 사용자가 서버에 접속하여 얻고자 하는 것을 의미한다.

  • e.g. 네이버 서버의 경우, https://www.naver.com 를 입력하면 사용자가 원하는 네이버 홈페이지를 보여준다.
    → 사용자는 해당 url을 주소창에 입력하여 네이버 홈페이지를 보길 원하고 네이버 서버는 해당 요청에 홈페이지를 보여주는 것으로 응답한다.
    → 이것이 기초적인 request와 response의 개념이다.

 

IP

 

IP주소란 하나의 컴퓨터에 부여되는 고유한 번호다.

  • 192.168.2.24 (국가코드 192.168 + 보안네트워크 2 + 네트워크에 연결된 컴퓨터 번호 24)
    → 사람은 출생신고를 하면 주민등록번호라는 고유번호를 부여받는다.
    → 하지만 우리가 주민등록번호를 부르지 않고 이름을 부르듯이, 서버 또한 편하게 부를 수 있는 이름이 있다.
    → 우리는 그걸 url주소(도메인주소)라고 부른다. (url주소 = ip주소의 이름)

 

Serverless

 

Server를 받는다는 것은 컴퓨터 한 대를 임대받는 것과 같다고 생각하면된다. 그러나 서버를 임대받게 되면 다양한 프로비저닝을 직접하고 조절해야 해야하는데, 그것을 모두 전문 개발인력이 아닌 일반인이 하기에는 꽤 많은 자원이 소요된다. 때문에 이를 극복하기 위해 Serverless 서비스를 사용한다.

 

Serverless란 서버 공급자(ex. AWS)가 프로비저닝을 하고 요청이나 특정 이벤트가 있을 때, 어플리케이션을 실행시키는 것이다. 특히 사용자 입장에서는 서버의 몇 가지 기능만을 필요로 하는 경우에 가장 최적의 선택이다. Serverless의 대표적인 예시가 오늘 살펴볼 AWS의 Lambda 서비스이다.

 

AWS Lambda

스크린샷 2025-03-02 오후 6.34.27.png
Lambda 대시보드

 

함수 생성하기

 

람다는 함수 기능을 제공한다. 이 말은 즉, 우리가 만들 함수를 24시간 켜져있는 서버에서 돌릴 수 있다는 것을 의미한다.

해당 기능을 사용하기 위해 함수 -> '함수 생성' 버튼을 클릭한다.

스크린샷 2025-03-02 오후 6.51.27.png

2. Layer 붙이기

 

Lambda는 pandas, numpy 등의 라이브러리를 지원하지 않기 때문에, 우리가 직접 Layer에 연결해야 한다.

 

  • 생성한 Lambda 함수의 '함수 개요' 내 'Layers' 클릭 -> 계층의 [Add a layer] 버튼 클릭 -> '새로운 계층을 생성' 클릭

스크린샷 2025-03-02 오후 6.54.15.png

 

  • 이름에 레이어 이름 작성 및 설명에 어떤 레이어인지 작성.
  • '업로드' 버튼 클릭 -> 본인이 만들 함수에 사용할 Library 파일을 .zip파일로 업로드
  • 호환 런타임에는 본인이 사용할 프로그래밍 언어의 버전을 선택한 후, 생성.

스크린샷 2025-03-02 오후 6.56.06.png

 

  • 다시 생성한 Lambda 함수 페이지로 돌아가서 '함수 개요' 내 'Layer' 클릭 후, [Add a layer] 버튼 클릭
  • 계층 소스에서 '사용자 지정 계층' 선택

스크린샷 2025-03-02 오후 6.59.26.png

 

3. 함수 설정

 

Layer를 편집한 후에는 본인이 만든 함수의 코드 입력 및 제한 시간을 설정한다.

 

  • 생성한 Lambda 함수 페이지 구성에서 일반 구성을 선택한 후, 편집 버튼을 눌러 제한 시간을 변경
    • 제한 시간은 람다에서 지정한 함수를 실행할 수 있는 최대 시간을 의미한다.

스크린샷 2025-03-02 오후 7.00.39.png

 

  • 생성한 Lambda 함수 페이지의 '코드'의 lambda_function에 원하는 기능의 함수 넣기

스크린샷 2025-03-02 오후 7.09.36.png

 

Test 하기

 

그 다음 생성한 함수의 기능을 Test한다.

 

  • 위 함수의 코드 부분에서 Test 버튼을 클릭한다.
    • Test 버튼을 클릭하면, 테스트 이벤트 구성이라는 팝업창이 뜨는데, 이 때 이벤트 이름은 임의로 설정한 후 저장한다.

스크린샷 2025-03-02 오후 7.11.27.png

 

  • 그 후, 코드 부분의 Deploy 버튼을 클릭한다.
  • 마지막으로 Test 버튼을 다시 클릭한다.
    • statusCode에 200이 뜨면 Test가 성공한 것이다.
     

스크린샷 2025-03-02 오후 7.13.38.png

 

S3 Bucket 생성

 

만약 크롤링하는 코드를 Lambda를 이용하여 스케줄링하는 경우, 크롤링된 데이터가 저장될 저장소가 필요하다. 이 때 사용되는 것이 S3 Bucket이다.

 

  • AWS에 S3을 검색한 후, 버킷 만들기 버튼을 클릭한다.

스크린샷 2025-03-02 오후 7.16.17.png

 

  • 적절한 Bucket 이름을 만든 후에 Lambda 함수와 같은 Region을 선택한다.

스크린샷 2025-03-02 오후 7.21.30.png

 

  • 모든 퍼블릭 엑세스 차단 체크를 해제한다.
    • 이 때, '현재 설정으로 인해 이 버킷과 그 안에 포함된 객체가 퍼블릭 상태가 될 수 있음을 알고 있습니다.'는 체크.

스크린샷 2025-03-02 오후 7.23.04.png

 

  • 버킷 만들기를 클릭한다.

 

그 후 S3에 권한을 부여하는 작업이 필요하다.

 

  • 생성한 S3 Bucket을 클릭한 후, 권한을 선택한다.
  • '버킷 정책' 부분에서 '편집' 버튼을 클릭한다.
  • 아래 코드를 본인에게 맞게 수정하고 코드를 붙여넣는다. (필요없는 것은 삭제해도 무방)
{
    "Version": "2012-10-17", // Bucket Policy의 문법이 언제 날짜 기준으로 확정된 문법을 사용하는지 → 2008-10-17 버전 후 2012-10-17 버전이 있는데, 그 뒤로는 업데이트가 안됐음
    "Id": "S3PolicyId1", // Bucket Policy의 고유 아이디, 자동으로 부여되는 경우가 많음
    "Statement": [
        {
            "Sid": "IPAllow", // 각 Statement의 고유 아이디. 무슨 역할을 하는 policy인가
            "Effect": "Allow", // 버킷에 대한 명령을 허락(allow)하거나 거부(deny). 특정 사용자에 대해 명령을 제한하거나, 허용하는 식으로 사용
            "Principal": {"AWS": "arn:aws:iam::spark323:user/spark"}, // Bucket Policy의 적용대상 (spark323 아이디의 유저에 대해서)
            "Action": [ // Bucket Policy에서 허용한 Action
                "s3:GetObject", // 객체 가져오는 행동
                "s3:GetBucketLocation", // 버켓 위치를 확인하는 행동
                "s3:ListBucket", // 버켓 리스트를 확인하는 행동
            ],
            "Resource": "arn:aws:s3:::bucketname/*", // 대상이 대는 Bucket에 대한 명세
            "Condition": { // 어떤 조건 하에
                "NotIpAddress": { // 이 IP비허용
                    "aws:SourceIp": "1.1.1.1/32"
                },
                "IpAddress": { // 이 IP허용
                    "aws:SourceIp": [
                        "192.168.1.1",
                        "192.168.1.2/32",
                    ]
                }
            }
        }
    ]
}
  • 위의 JSON 권한 형식을 해석하자면,
    • 계정 spark323 아이디인 유저에 대해서
    • Resource(해당버킷)에 대해
    • Action(객체를 가져오거나 버켓 위치를 확인하거나)을 Effect(허용) Condition(아이피 192.168.1.1, 192.168.1.2/32 인 하에) 한다는 의미.

 

  • 변경 사항 저장 후, 크롤링 한 결과를 생성한 버킷에 넣기
  • 크롤링 한 결과를 버킷에 넣기 위해서는 Lambda의 함수의 코드 부분에 아래와 같이 S3에 저장하는 코드를 추가로 입력한다.
# s3에 저장하는 코드
#주로 json으로 저장함 (왜냐하면 데이터프레임으로 저장하면 용량이 커졌을 경우에 데이터가 손실될 위험이 있기 때문)
import boto3
    
s3_client = boto3.client('s3')
bucket = '크롤링 할 버킷 이름'
s3_client.upload_file(donor_file_path, bucket, f'{donor_file_name}.json')

 

  • Deploy 후, Test 해보기
    • 버킷에도 json 파일이 생성되면 성공.

 

스케쥴링

 

마지막으로, 해당 함수를 특정 시간마다 실행할 수 있도록 스케쥴링 해주는 작업이 필요할 수 있다.

 

  • 람다 함수의 '트리거 추가' 클릭
  • 트리거 구성에서 'EventBridge'를 선택한 후, 규칙을 생성한다.
  • 규칙 설명에는 원하는 시간을 입력하고 아래 예약 표현식에 rate(원하는 시간)으로 입력한 후, 추가 버튼을 클릭한다.

스크린샷 2025-03-02 오후 7.39.31.png

 

  • 그 후, S3에 해당 시간마다 잘 저장되는지 확인하고 마무리한다.

Reference

https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-S3-%EB%B2%84%ED%82%B7-%EC%83%9D%EC%84%B1-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95

 

[AWS] 📚 S3 개념 & 버킷 · 권한 설정 방법

S3 (Simple Storage Service) 개념 AWS S3는 업계 최고의 확장성과 데이터 가용성 및 보안과 성능을 제공하는 온라인 오브젝트(객체) 스토리지 서비스이다. (참고로 S 앞글자가 3개라서 S3 이라고 한다.) 쉽

inpa.tistory.com

 

'ETC' 카테고리의 다른 글

ML 프로젝트 폴더 구조  (0) 2024.04.11