🚀 Languege/DevOps

CodePipeline ECR Rolling Update를 위한 TaskDefinition Update Lambda 코드

mini_world 2022. 8. 10. 22:26
목차 접기

 

CodePipelin 구성 시,
빌드과정 없이 ECR -> ECS 에 바로 배포한다면 TaskDefinition 파일을 업데이트 해줘야 한다.

그러자고 Codebuild를 쓰자니, 파일 만드는데 몇초면 끝나는데, 비용도 비용이고 codebuild는 무겁다 ㅠ (이거 돌리는데 4분걸린다..)

lambda로 하면 30초면 끝나니 이렇게 해보는것을 추천한다.

===========================================
Source ------>  Def-Step ------> ECS (rolling update)
[ECR]                  [Lambda]             
===========================================

 

import json
import boto3
import zipfile
import tempfile
import os
from subprocess import call

code_pipeline = boto3.client('codepipeline')
s3           = boto3.client('s3')

def lambda_handler(event, context):
    job_id = event['CodePipeline.job']['id']

    bucketN = event['CodePipeline.job']['data']['inputArtifacts'][0]['location']['s3Location']['bucketName']
    objectK = event['CodePipeline.job']['data']['inputArtifacts'][0]['location']['s3Location']['objectKey']

    outputN = event['CodePipeline.job']['data']['outputArtifacts'][0]['location']['s3Location']['bucketName']
    outputK = event['CodePipeline.job']['data']['outputArtifacts'][0]['location']['s3Location']['objectKey']

    tmp_file = tempfile.NamedTemporaryFile()
    
    with tempfile.NamedTemporaryFile() as tmp_file:
        s3.download_file(bucketN, objectK, tmp_file.name)
        with zipfile.ZipFile(tmp_file.name, 'r') as zip:

            json_data = zip.read('imageDetail.json')
            obj = json.loads(json_data)
            #print(obj)
            
            image_uri = obj['ImageURI'].split('@')[0]
            ImageDigest = obj['ImageDigest']
            repo_name = obj['RepositoryName']

            image = f"{image_uri}@{ImageDigest}"
            #print(image)

            definition = [{
                'name': repo_name,
                'imageUri': image
            }]
            #print(definition)
            
            with open('/tmp/imagedefinitions.json', 'w') as outfile:
                json.dump(definition, outfile)
                
            # taskdef 파일 준비
            for i in ['TaskDef-1', 'TaskDef-2', 'TaskDef-4']:
              file_name = '/tmp/imagedefinitions-'+i+'.json'
              file_data = [{
                'name': "alpha-"+i,
                'imageUri': image
              }]
              with open(file_name, 'w') as outfile:
                json.dump(file_data, outfile)

            # 압축
            file_path = '/tmp/'
            zip_file = zipfile.ZipFile('/tmp/imagedefinitions.zip', mode='w')
            os.chdir("/tmp/")
            for file in os.listdir(file_path):
              if file.endswith('.json'):
                zip_file.write(file)
            zip_file.close()
            
            # json파일 잘 생겼는지 확인
            path_dir = '/tmp'
            file_list = os.listdir(path_dir)
            print(file_list)

            # s3에 에 출력 아티펙트로 업로드
            response = s3.upload_file('/tmp/imagedefinitions.zip', outputN, outputK)
            #코드파이프라인에 success 전달
            code_pipeline.put_job_success_result(jobId=job_id)
            #/tmp경로 clear
            call('rm -rf /tmp/*', shell=True)
    return True
728x90