이번 포스팅에서는 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와 서비스, 작업 정의도 미리 만들어져 있어야 한다.