boto3를 활용하여 AWS ECR에서 Lambda로 배포하기

Beginner IT (IT Beginner)·2023년 2월 10일
0

aws

목록 보기
2/4

앞서서 AWS ECR에 이미지를 배포하는 방법에 대해서 공유드렸습니다.

https://velog.io/@cjswo9207/AWS-Lambda%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-Autogluon-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0

AWS ECR

AWS ECR은 Amazon Elastic Container Registry(Amazon ECR)는 개발자가 Docker 컨테이너 이미지를 쉽게 저장, 관리 및 배포할 수 있게 해주는 완전관리형 Docker 컨테이너 레지스트리입니다.

즉, AWS에서 제공하는 Docker라고 생각하시면 되겠죠.
이것을 기반으로 이전에서 배포했던 이미지를 Lambda에 연결하는 것을 해보도록 하겠습니다.

boto3

Boto3는 Python 스크립트를 작성하여 AWS 리소스에 액세스하고 Amazon S3 버킷 생성 및 삭제, Amazon S3에 파일 업로드 및 다운로드, Amazon EC2 인스턴스 시작 및 중지와 같은 일반적인 서비스 관리 작업을 자동화 할 수 있는 라이브러리 입니다. AWS 서비스의 대부분의 지원을 해주고 있으며, Boto3는 Amazon S3, Amazon EC2, Amazon DynamoDB, Amazon SNS 등을 비롯한 대부분의 AWS 서비스를 지원합니다.

진행하는 코드는 아래와 같습니다.

  1. 기본 코드
import boto3

def botoClient(service, region_name = config.C_AWS_REGION):
    client = boto3.client(service, region_name=region_name)
    return client
    
lambda_client = service_conn.botoClient(
    service="lambda"
)
ecr_client = service_conn.botoClient(
    service="ecr"
)
  1. 함수 호출
test_body = {}
result = lambda_client.invoke(
    FunctionName='{}',
    InvocationType='RequestResponse',
    Payload=json.dumps(test_body)
)

테스트를 진행해보면 최초의 한번은 이미지가 배포되는데 걸리는 시간이고 이후에는 배포가 완료되는 시간으로 계속 유지된다. (테스트를 해보면 15분정도 지나면 자연스럽게 내려간다.)

  1. 이미지 배포
dic = {
    'FunctionName': '{}',
    'ImageUri': '{}.dkr.ecr.ap-northeast-2.amazonaws.com/{}:latest'
}
result = lambda_client.update_function_code(**dic)
  1. 테스트 배포 중/후
    진행하다가 궁금해서 배포하면서 제대로 서비스가 구동이 되는지 확인을 해보고 싶으면.
dic = {
    'FunctionName': '{}',
    'ImageUri': '{}.dkr.ecr.ap-northeast-2.amazonaws.com/{}:latest'
}

# 4. 배포 중 리턴 시간
print("4. 배포 중 리턴 시간")
result = lambda_client.update_function_code(**dic)

res_list = []
time_4_e = None
time_4_s = None

print("4. 테스트 시작")
while True:
    dic = {
        'FunctionName': '{}',
    }
    result = lambda_client.get_function(**dic)

    status = result["Configuration"].get("LastUpdateStatus")
    # print("LastUpdateStatus : ", status)

    dic = {
        'FunctionName':'{}',
        'ImageUri':'{}.dkr.ecr.ap-northeast-2.amazonaws.com/{}:latest'
    }

    try:
        time_4_s = time.time()

        result = lambda_client.invoke(
            FunctionName='{}',
            InvocationType='RequestResponse',
            Payload=json.dumps(test_body)
        )
        # print(result['Payload'].read())

        time_4_e = time.time()
        # print(f"4. 걸린시간 : {time_4_e - time_4_s}")
        res_list.append(time_4_e - time_4_s)
    except:
        print("4. Call Error")

    if status == "Successful":
        print("4. update success")
        break
    time.sleep(2)

print(f"4. 호출하는 동안 걸린 시간(평균-{len(res_list)}건) : ", sum(res_list) / len(res_list))
print("4. 성공 후 걸린시간 : ", time_4_e - time_4_s)

여기서 lambda 클라이언트 타입을 입력할때,

Invodcation Type을 RequestResponse을 지정하면 리턴값을 받을 수 있고 event를 지정하면 값을 받을 수 있다는 점 확인을 해주면 된다.

이후 작업에 대해서는 람다와 API 게이트웨이로 연동해서 테스트 하는 것을 진행해 보도록 하겠다.

profile
잘부탁드립니다. ㅎㅎ

0개의 댓글