Oops - IT

Lambda 사용 해보기 본문

AWS

Lambda 사용 해보기

김모우 2025. 1. 15. 22:59
반응형

 

Lambda란?


  • 서버 프로비저닝 또는 관리, 워크로드 인식 클러스터 확장 로직 생성, 이벤트 통합 유지 또는 런타임 관리 없이 코드를 실행합니다. 

 

  • 사실상 모든 유형의 애플리케이션이나 백엔드 서비스에 대한 코드를 실행합니다. 코드를 ZIP 파일 또는 컨테이너 이미지로 업로드하기만 하면 Lambda는 자동으로 컴퓨팅 실행 능력을 할당하고, 모든 트래픽 규모에 대하여 수신 요청 또는 이벤트를 기반으로 코드를 실행합니다.

 

  • Lambda 기능을 선호하는 언어(Node.js, Python, Go, Java 등)로 작성하고 서버리스 및 컨테이너 도구(AWS SAM 또는 Docker CLI)를 사용하여 기능을 구축, 테스트 및 배포합니다.

 

 

서버리스 형태로 원하는 코드를 실행가능하도록 도와주는 AWS 서비스이며, 위의 내용과 같이 큰 장점은 트래픽 규모에 따라, 적절한 사이즈의 백엔드를 구성하여 코드를 실행시켜준다는 장점이 있습니다.

 

Lambda 구성


  • 오늘, 여기서 Lambda의 특장점인 트래픽 규모에 따른 사이징에 대한 테스트는 해보지 못하지만, 서비리스 기반으로 코드를 실행하여 AWS 내부 리소스에 대해서 제어하는 부분을 테스트 해보도록 하겠습니다.

 

  • AWS 리소스 목록에서 "Lambda"를 검색 후에 함수 생성 화면으로 들어오게 되면, 아래와 같은 화면이 출력됩니다.

  • 이번 포스팅에서는 간단한 코드 형태로 Lambda 함수를 생성해 볼 것이므로, 새로 작성이라는 옵션으로 선택하고 진행해보겠습니다.

 

  • Lambda 에서는 크게, 함수 이름과 런타임 정보, 권한 등에 대한 입력이 필요합니다. 
    • 여기서, 런타임 정보는 실행을 시키실 코드 언어를 선택해주시면됩니다.
    • 권한은, Lambda 함수가 동작할 때 가지게 되는 권한을 넣어주시면 됩니다.
    • 기본적으로, "기본 Lambda 권한을 가진 새 역할 생성" 옵션을 Default로 가지며, 아래와 같이 Lambda 함수에서 사용할 수 있는 Role에 정책이 할당되어 권한이 부여됩니다.

 

  • 위의 기본 역할 이외에 Lambda 함수에서 추가 권한을 필요로 한다면, 벌써 커스터마이징 롤을 생성하여 Lambda 함수에 할당해주는 방식으로 구성이 가능합니다.

 

EC2 시작, 중지 구성


  • 그러면, Lambda 함수를 통해서 EC2를 시작, 중지하는 작업을 실행하기 위해 Lambda 함수 생성 및 실제 동작 코드를 작성해보도록 하겠습니다.

 

  • 이번 포스팅에서는 Python을 사용할 예정이며, boto3라는 라이브러리를 통해 AWS API 기반으로 리소스 제어를 진행해보도록 하겠습니다.

 

  • Lambda 함수에서 사용되는 코드는 기존 코드 작성하시는 것과 동일하게 작성하시면 되지만, 실제 호출 하는 부분은 핸들러라는 함수를 통해서 이루어 지므로 아래와 같은 형태로 변경이 필요합니다.

 

  • EC2 중지 코드를 기반으로 비교해보겠습니다. (EC2 리소스는 태그 기반으로 동작할 수 있게끔 구성하였습니다.)
    • 태그 정보
      • Key - 'auto-schedule' / Value - 'True' (테스트 EC2에 위 정보로 태그 설정!!)
## 기본 코드
import boto3

def ec2_stop(ec2, instances):
    
    ec2.stop_instances(InstanceIds=instances)
    print('stopped your instances: ' + str(instances))

if __name__ == '__main__':

    region = 'ap-northeast-2'
    instances = []
    ec2_r = boto3.resource('ec2')
    ec2 = boto3.client('ec2', region_name=region)

    for instance in ec2_r.instances.all():
        for tag in instance.tags:
            if tag['Key'] == 'auto-schedule':
                if tag['Value'] == 'True':
                    instances.append(instance.id)
                    
    ec2_stop(ec2, instances)
    
## Lambda 코드
import boto3

region = 'ap-northeast-2'
instances = []
ec2_r = boto3.resource('ec2')
ec2 = boto3.client('ec2', region_name=region)

for instance in ec2_r.instances.all():
    for tag in instance.tags:
        if tag['Key'] == 'auto-schedule':
            if tag['Value'] == 'True':
                instances.append(instance.id)

def lambda_handler(event, context):
    ec2.stop_instances(InstanceIds=instances)
    print('stopped your instances: ' + str(instances))

 

 

  • 위처럼, 실제 코드 대비 Lambda 함수로 코드 실행 시 handler에 실제 작업을 명시해주면 됩니다.

 

  • handler에서 event, context에 대한 정리는 아래 블로그에 굉장히 잘 정리가 되어 있어 같이 공유 드립니다.

 

  • Lambda 함수에서는 추가적으로, 코드 실행 시 Lambda 함수 자체에서도 변수를 넘겨 줄수도 있습니다.

 

  • 위의 Lambda에서 기본 제공하는 역할을 살펴보면, 로그 스트림을 생성하고, 로그를 저장하는 권한만 들어 있지만, 여기서는 EC2에 대한 태그를 확인하고, 실제 EC2에 대한 시작, 중지 작업을 Lambda 인스턴스에서 수행해야되므로, 추가적인 권한이 필요하여, 커스텀 롤을 별도 생성하도록 하겠습니다.
    • IAM -> 정책 ->  "EC2-AutoStop-Policy" 생성 -> Json 항목 선택 후 해당 내용 입력 후 정책 생성
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:Start*",
                "ec2:Stop*",
                "ec2:Describe*"
            ],
            "Resource": "*"
        }
    ]
}

 

  • IAM -> 역할 -> "EC2-AutoStop-Role" 생성 -> 위에서 생성한 "EC2-AutoStop-Policy" 할당

 

  • 그러면, 위의 코드를 바탕으로 EC2 시작, 중지하는 Lambda 함수를 2개 생성해주겠습니다.
 

GitHub - usheep91/aws-handson

Contribute to usheep91/aws-handson development by creating an account on GitHub.

github.com

 

  • 기 생성된 "EC2-AutoStop-Role" 롤을 연결하여, 함수 생성
    • StopEC2Instance
    • StartEC2Instnace
  • 생성된 함수의 코드 부분에 기능에 맞춰 위 URL에 있는 코드 업로드 후 저장

StopEC2Instance Sample

 

 

EventBridge 연동


  • 위에서 생성된 Lambda 함수를 통해서 미 사용 시간에는 테스트용 인스턴스 들은 종료처리 하기 위해서 EventBridge에 일정 기반 특정 규칙 생성하여 특정 시간에 자동 중지, 시작되는 형태로 구성해보겠습니다.

 

  • EventBridge -> 규칙 선택 후 아래와 같이 정보 입력 (EC2-AutoStart-Rule)

 

  • 일정 세부 정보 설정 (Cron 표현식에 맞춰서 표현식을 정의 합니다. - 참조: https://crontab.guru/) // 인스턴스 시작은 평일에만 진행합니다.

 

  • 대상 선택
    • Lambda 선택, 생성 되어 있는 "StartEC2Instnace" 함수 선택

  • 일정 검토 후 규칙 생성

 

 

  • 위와 동일한 구조로 "EC2-AutoStop-Rule" 도 생성해 줍니다.

 

  • 정상적으로, 규칙이 생성되었다면, 시간에 맞춰서 인스턴스가 시작, 중지 되는 것을 확인하실 수 있습니다.

 

  • EventBridge + Lambda 함수를 통해서 정상적으로 인스턴스가 시작되고 종료된 로그 캡처 같이 첨부드립니다.
반응형

'AWS' 카테고리의 다른 글

AMI with Packer  (0) 2025.01.20
GameLift 알아보기  (0) 2025.01.16
EKS 생성하기 - LB를 통한 서비스 외부 노출  (0) 2025.01.14
EKS 생성하기  (0) 2025.01.14
AWS 면접 후기 (에필로그)  (0) 2025.01.08