[AWS] ECS 이미지 배포하기

최승언·2023년 4월 18일
1

AWS

목록 보기
11/15
post-thumbnail

이번 포스팅에서는 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
작업하다가 막힌부분을 기록하는 곳.

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN