[AWS] ECS 이미지 배포하기

최승언·2023년 4월 18일
1

AWS

목록 보기
11/15
post-thumbnail
post-custom-banner

이번 포스팅에서는 dockerhub에 새로 업데이트하여 업로드한 docker 이미지를 가지고 빠르게 배포하는 방법을 적어보도록 한다.

개념도


deploy_helper 코드는 다음과 같다.

import boto3 # boto3 패키지 
import sys # 커맨드에서 매개변수를 받기 위한 패키지
import os # os 환경변수 불러오기 위한 패키지

# 호스트의 환경변수 불러오기
AWS_ACCESS_KEY_ID = os.getenv("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = os.getenv("AWS_SECRET_ACCESS_KEY")
AWS_DEFAULT_REGION = os.getenv("AWS_DEFAULT_REGION")

client = boto3.client('ecs',aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCESS_KEY, region_name=AWS_DEFAULT_REGION) # ecs client 객체 초기화

# 가장 최근 task_definition 불러오기
def describe_taskdefinition(taskDefinition):

    response = client.describe_task_definition(
        taskDefinition=taskDefinition
    )

    return response

# 새 작업 정의 생성하기
def register_taskdefinition(image,taskDefinition):

    prev_task_definition_info = describe_taskdefinition(taskDefinition) # 가장 최신의 작업정의서 불러오기
    prev_task_definition_info['taskDefinition']['containerDefinitions'][0]['image'] = image # 1번 컨테이너의 이미지 교체
    task_definition_info = prev_task_definition_info['taskDefinition'] # 작업 정의서 정보만 불러와 저장

    client.register_task_definition(
        family=task_definition_info['family'],
        executionRoleArn=task_definition_info['executionRoleArn'],
        networkMode=task_definition_info['networkMode'],
        containerDefinitions=task_definition_info['containerDefinitions'],
        cpu=task_definition_info['cpu'],
        memory=task_definition_info['memory'],
        )

# 서비스 업데이트
def update_service(image,cluster,service,taskDefinition,desiredCount):

    register_taskdefinition(image,taskDefinition) # 이미지 넣어서 새 작업 정의 생성
    client.update_service(
        cluster=cluster,
        service=service,
        taskDefinition=taskDefinition,
        desiredCount=desiredCount
        )
    
# 메인 함수
def main():

    image = sys.argv[1]
    cluster = sys.argv[2]
    service = sys.argv[3]
    taskDefinition = sys.argv[4]
    desiredCount = int(sys.argv[5])

    update_service(image,cluster,service,taskDefinition,desiredCount)

if __name__ == "__main__":
    main() # main 함수 실행

argv를 입력받는 부분은 다음과 같다.

$ python3 deploy-helper.py <Image 레포지토리 url> <ECS 클러스터 이름> <ECS 서비스 이름> <작업 정의 이름> <작업의 > 

보면 알 수있겠지만 Image 레포지토리는 dockerhub에 먼저 푸시되어 있어야 하는 상태이고 ecs와 서비스, 작업 정의도 미리 만들어져 있어야 한다.

profile
작업하다가 막힌부분을 기록하는 곳.
post-custom-banner

0개의 댓글