안녕하세요.

클라우드기술지원팀 주원 입니다.



이번 글에서는 AWS 에서 지원하는 파이썬 라이브러리인 'Boto3' 와 서버리스 함수 호출 서비스인 Lambda 를 활용하여 사용 중인 EC2의 Public IP 를 설정해보고자 합니다.



고객님의 문의 중 아래와 같은 문의가 들어와 재구성해보았습니다.



Question


외부 API를 서비스 목적 상 다중으로 호출하는 중에 사용량 제한으로 IP가 Block 되어 일시적으로 사용할 수 없게 되었습니다.

지속적인 호출이 필요하여 IP Block 되었을 때, 다른 IP로 설정을 변경하여 지속적으로 호출 가능하고자 합니다.





Solution


우선, 고객님의 문의에 대해 Block 당한 Public IP를 변경해주기 위한 사전 절차가 필요합니다.


1. 연결하기 위한 Elastic IP 를 미리 할당받아 Pool 을 보유하고 있어야 합니다. (이 때 사용할 Elastic IP는 Tag를 설정하여 해당 인스턴스에만 사용할 목적으로 관리합니다.)

2. 이번 예제는 IP만 변경하는 것으로, IP만 변경되어도 API 호출 시 별도 인증절차 진행 없이 가능한 환경이어야 합니다.





1. Lambda 에서 함수 생성


새 함수를 생성하고 이름을 설정합니다.

런타임 환경은 Python 을 사용할 것이며 버전은 3.8 버전을 사용합니다.




2. 해당 함수의 권한 설정


리소스 중 EC2 를 컨트롤 하기 위해 권한에 'AmazonEC2FullAccess' 정책을 부여해줍니다.







3. 코드작성


사용할 boto3 라이브러리와 botocore.exceptions 라이브러리 중 ClientError 를 Import 해줍니다.


코드의 간단한 로직은


1) Tag 로 필터링하여 미리 확보해둔 Elastic IP List를 생성한 후

2) 사용가능한(어떠한 인스턴스와도 연결되지 않은) Elastic IP를 확인하여

3) 인스턴스에 연결해줍니다.



(* Elastic IP 에 Tag 로 "App" : "test-app" 추가)


소스코드)


///////////////////////////////////////////////////////////////////////////////////////////


import json

import boto3

from botocore.exceptions import ClientError


def lambda_handler(event, context):



    ec2 = boto3.client('ec2')

    

    # 1) Tag로 필터링 하여 해당 App을 위한 미리 확보해둔 EIP 가져오기

    filters = [{'Name':'tag:App', 'Values':['test-app']}]

    response = ec2.describe_addresses(Filters=filters)

    

    # 2) Addresses 리스트 중 Instance Id 를 가지고 있지 않은 EIP의 Allocation ID 가져오기

    free_eip_list = []

    address_list = response['Addresses']

    for address in address_list:

        if not 'InstanceId' in address:

            free_eip_list.append(address['AllocationId'])

    

    # 3) 사용가능한 Elastic IP 중 한 개를 해당 인스턴스에 연결하기 (* 인스턴스 ID는 예시로 변경필요)

    if len(free_eip_list) is 0:

        print('There is no free EIP.')

    else:

        try:

            response = ec2.associate_address(AllocationId=free_eip_list[0],InstanceId='i-0119961b38a40019a')

            print(response)

        except ClientError as e:

            print(e)

    

    return {

        'statusCode': 200,

        'body': json.dumps('Hello from Lambda!')

    }


///////////////////////////////////////////////////////////////////////////////////////////





위와 같은 방법으로 Lambda를 구현하여 실행해보면 해당 인스턴스의 Public IP가 변경되는 것을 확인할 수 있습니다.


이 구성과 코드를 참고하여 사용중인 Lambda 및 Application 레벨에서 인스턴스의 IP를 변경하고 싶을 때 활용할 수 있겠습니다.


또한 Lambda는 위 코드에 Trigger 를 추가하여 이벤트가 발생하거나, 특정 시간대에 스케쥴링을 통해 함수를 호출할 수 있습니다.




이상 간단한 Lambda 및 Python 라이브러리를 활용한 예제였습니다.




참고 URL : https://boto3.amazonaws.com/v1/documentation/api/latest/guide/ec2-example-elastic-ip-addresses.html



감사합니다.


클라우드기술지원팀

이주원