-
aws Step Functions_1카테고리 없음 2025. 5. 15. 15:48
AWS EC2 AMI 를 S3에 백업하기 위해 Lambda 와 Step Functions 를 사용했다.
step functions 은 구성이 어렵지 않고 결과값을 다음 task 에 전달하는게 편했다.
진행 방식
Lambda 3개 구성 (ALB 에 연결되어 있는 EC2 만 백업)
Lambda 1 : ec2 ami
Lambda 2 : create_store_image_task (ami -> s3 임시 디렉토리에 저장)
Lambda 3 : s3 임시 디렉토리에 저장된 ami (ex. ami-abcd1234) 구분이 어렵기 때문에 원본 서버 이름으로 변경 후
백업 일자 디렉토리로 copy
ami, 스냅샷, 임시 ami 삭제
Lambda 를 구분한 이유는 ami 생성 시간, create_store_image_task 작업 시간, copy 시간으로 인해 구분
위에서 생성한 lambda 를 step functions 를 통해 순차 진행
람다 사이에 wait 을 통해 대기 시간을 할당하고 3번 람다에서 실패하는 경우 wait 후 다시 3번 람다를 실행하게 설정했다.
3번 람다에서 실패가 뜬 이유 : copy 시간이 오래 걸려 (20GB) s3에서 copy 된 ami 를 찾을 수 없어 에러 발생
람다 내 대기 시간을 넣으면 람다 제한 시간을 초과하게 됨
copy 시간의 문제로 발생하는 에러였기 때문에 wait 을 추가하고 다시 실행하면서 step functions 이 문제 없이 실행됨.
하지만 위에서 말했듯이 결과값을 다음 task (여기선 람다) 에 보내는 것에 문제가 발생.
3번 람다의 결과값 (에러) 이 wait 후 4번 람다 retry_ec2_ami~~~ 로 넘어가서 4번 람다 실행 불가.
그래서 사용한 방법은 3번 람다에 들어오는 값 (2번 람다의 결과값) 을 변수로 저장해서 4번 람다 실행의 input 으로 전달
"Assign": { "ami_id": "{% $states.result.Payload %}" },
이렇게 Assing 을 사용하면 변수로 사용할 수 있다.
이 변수를 이렇게 입력값으로 사용 할 수 있다.
"Arguments": { "FunctionName": "arn:aws:lambda:region:account_id:function:ec2_ami_backup_3-delete_ami:$LATEST", "Payload": "{% $ami_id %}" },