목차
접기
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