본문 바로가기
AWS 기술/Computing

Lambda를 이용한 Spot Fleet 요청 2/2 편

by 콤텍시스템

Lambda를 이용한 Spot Fleet 요청 1/2 편 다시보기

 

3.    Lambda 생성 및 함수 작성

지금 생성하는 Lambda가 실질적으로 Spot Fleet을 요청하는 함수를 실행합니다. Lambda 함수는 다양한 언어로 작성이 가능하여 본 가이드에서는 Python을 기반으로 한AWS SDKboto3로 작성하였습니다.  Spot Fleet Request의 옵션은 매우 다양하며, 본 가이드에서는 가장 기본적인 옵션들만 사용하였습니다. 좀 더 상세한 옵션 조정이 필요하신 경우 가이드 마지막 참조란에 첨부된 링크에서 추가적인 옵션을 확인해주세요.

-       Lambda 서비스에서 함수를 선택, 함수 생성을 클릭합니다.

-       함수의 언어는 Python 3.8을 선택합니다. 기본 실행 역할 변경란에서 기존 역할 사용을 선택, 앞서 생성한 두번째 역할Lambda의 역할로 지정합니다.

-       함수 코드에 Spot Fleet Request 함수를 작성합니다. 함수의 샘플은 아래의 boto3 SpotFleetRequest Sample Code’를 참조해주세요. 샘플로 제공된 코드는 SpotPrice(스팟의 가격), TargetCapacity(목표량), IamFleetRole(함수를 실행하기 위한 IAM 역할), Type(Spot Fleet 요청의 종류), AllocationStrategy(할당전략), LaunchSpecifications(실행 세부사항) 등이 있습니다. LaunchSpecifications의 경우 추가하는 복수의 인스턴스 유형에 따라 추가로 작성해야 합니다.

(boto3 SpotFleetRequest Sample Code)

import boto3

 

region = 'ap-northeast-2'

 

def lambda_handler(eventcontext):

    # Create Session

    client_ec2 = boto3.client('ec2'region_name = region)

    request = client_ec2.request_spot_fleet(

            SpotFleetRequestConfig={

                #"SpotPrice": "0.04",

                "TargetCapacity"1,

                "IamFleetRole""your-spot-fleet-role",

                "Type":"request"# "maintain"

                "AllocationStrategy""lowestPrice"# "diversified" | "capacityOptimized"

                "LaunchSpecifications": [

                    {

                        "ImageId""your-ami-id",

                        "KeyName""your-keyname,

                        "SecurityGroups": [

                            {

                                "GroupId""your-sg-group-id"

                            }

                        ],

                        "InstanceType""c5.24xlarge",

                        "SubnetId""your-subnet-id-1your-subnet-id-2",

                        #"IamInstanceProfile": {

                        #    "Arn": "arn:aws:iam::123456789012:instance-profile/my-iam-role"

                        #}

                    },

                    {

                        "ImageId""your-ami-id",

                        "KeyName""your-keyname,

                        "SecurityGroups": [

                            {

                                "GroupId""your-sg-group-id"

                            }

                        ],

                        "InstanceType""m5.24xlarge",

                        "SubnetId""your-subnet-id-1your-subnet-id-2",

                        #"IamInstanceProfile": {

                        #    "Arn": "arn:aws:iam::123456789012:instance-profile/my-iam-role"

                        #}

                    }

                ]

            }

        )

 

4.    Spot Fleet Request Lambda 테스트

함수코드 작성 후 ‘Deploy’로 배포합니다. 배포가 완료되고 난 뒤, Lambda가 제대로 실행되는지 확인하기 위해 테스트를 진행합니다.

-      오른쪽 상단에 테스트를 클릭합니다. 임의의 테스트 값들이 기본으로 제공됩니다. 현재 테스트는 값을 조정할 필요가 없기 때문에 그대로 이벤트 이름을 기입하고 생성을 클릭합니다. 테스트 값들을 생성하고 난 뒤 다시 한번 테스트버튼을 클릭합니다. Lambda가 제대로 실행된다면 실행결과: 성공(로그)’ 라는 초록색 박스를 확인할 수 있습니다. (대부분의 Lambda 함수 오류는 소스코드를 잘못 작성했거나, IAM 역할이 잘못되었기 때문입니다. 자세한 내용은 실패 로그에서 확인할 수 있습니다.)

‘EC2’ 서비스에서 스팟 요청을 확인합니다. 방금 테스트를 통해 실행된 Spot Fleet Request로 인해 스팟 요청이 적용된 것을 확인할 수 있습니다. 본 가이드의 경우 Spot Fleet에서 c524.xlarge, m5.24xlarge 2개의 인스턴스 유형중, 더 저렴한 가격(lowest price)으로 생성되도록 설정했기 때문에 c5.24xlarge가 우선적으로 적용되어 Spot Instance 요청이 적용된 것을 확인할 수 있습니다. ‘인스턴스란에서 Spot 요청에 의해 인스턴스가 생성된 것을 확인할 수 있습니다.

5.    EventBridge를 이용한 Lambda Trigger

Lambda에는 다양한 Trigger 옵션이 있습니다. 본 가이드에서는 AWS에서 지원하는 서버리스 이벤트 버스인 EventBridge의 규칙(cron 표현식)Lambda의 트리거로 사용합니다.

-      ‘EventBridge’ 서비스에서 규칙 생성을 클릭, 패턴 정의를 일정으로 선택하고 Cron 식을 입력합니다. 예시는 ’50 6,18 ? * * *’으로 UTC기준 매일 오전, 오후650분이란 뜻입니다. KST 기준(UTC +9:00)으로는 매일 오전, 오후 350분이라는 뜻이 됩니다.

-      대상은 ‘Lambda 함수로 선택하고, 함수는 사전에 생성한(3. Lambda 생성 및 함수 작성에서) Lambda 함수를 선택합니다.

-       생성이 완료되고 나면 EventBridge 규칙 리스트에서 해당 규칙이 Enabled 된 것을 확인할 수 있습니다. 또한 대상으로 지정한 Lambda에서 Trigger로 설정된 EventBridge를 확인할 수 있습니다.

-       EventBridge 규칙의 Cron식으로 지정한 시간이 되면 Lambda함수가 자동으로 실행되어 Spot Fleet 요청에 의해 Spot 인스턴스가 생성된 것을 확인할 수 있습니다.

[참조]

(Spot Fleet 옵션과 boto3 작성 예제)

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/request-spot-fleet.html

(Spot Fleet 역할 생성하기)

https://docs.aws.amazon.com/batch/latest/userguide/spot_fleet_IAM_role.html

댓글