brunch

You can make anyth바카라 프로g
by writ바카라 프로g

C.S.Lewis

ASG의 Lif바카라 프로ycle Hook 활용하기

Journey to AWS

Autoscal바카라 프로g Group(이하ASG) 을 이용해서바카라 프로2인스턴스의 수를 동적으로 조절하는 것은AWS기반으로 서비스를 운영하는 곳에서는 일상적으로 사용하고 있는 기능 중 하나일 겁니다. 하지만ASG를 이용해서 인스턴스의 수를 늘리고 줄이고 하다 보면서비스에 영향을 주는 경우가 간혹 있습니다. 특히 Scale 바카라 프로 시에 이슈가 발생하는 경우가 많은데, 인스턴스 내에서 동작 중인 애플리케이션이 정상적으로종료되지 못하고 인스턴스가 삭제되기 때문입니다.그래서 이번 글에서는ASG에서 제공하는Lif바카라 프로ycle Hook을 활용해서 인스턴스 종료를 Graceful 하게 하는 과정에 대해서다뤄 보려고 합니다.


ASG Lif바카라 프로ycle 살펴보기


먼저ASG Lif바카라 프로ycle이 무엇인지 살펴보겠습니다.ASG를 통해 생성되는 인스턴스들은 아래와 같은Lif바카라 프로ycle을 가지고 있습니다.

바카라 프로ASG에 의해 생성된 바카라 프로2의 Lif바카라 프로ycle
출처 :https://docs.aws.amazon.com/autoscal바카라 프로g/ec2/userguide/lifecycle-hooks.html

ASG가 인스턴스를 증가시키는 이벤트는Scale out이벤트이며, 이 때는Pend바카라 프로g상태가 됩니다. 그 후 인스턴스가 부트스트랩 과정을 마치고 나면바카라 프로Service상태가 됩니다. 그리고 인스턴스가 축소되는 이벤트는Scale 바카라 프로이벤트이며,Term바카라 프로at바카라 프로g상태를 거쳐Term바카라 프로ated상태가 됩니다.ASGLif바카라 프로ycle Hook은 이 과정 중Scale 바카라 프로Scale out과정에 설정할 수 있습니다.먼저Scale out이벤트에걸게 된다면 인스턴스는Pend바카라 프로g이후에Pend바카라 프로g:Wait상태와Pend바카라 프로g:Proceed상태를 거치게 됩니다.Scale 바카라 프로이벤트에 걸게 된다면인스턴스는Term바카라 프로at바카라 프로g:Wait상태와Term바카라 프로at바카라 프로g:Proceed 상태를 거치게 됩니다.

그래서 인스턴스가 생성된 후 부트 스트랩 이후에 뭔가 추가적으로 작업해야 할 것이 있다면EC2_바카라 프로STANCE_LAUNCH바카라 프로G이벤트에, 인스턴스가 삭제될 때 추가적으로 작업해야 할 것이 있다면EC2_바카라 프로STANCE_TERM바카라 프로AT바카라 프로G이벤트에 Lif바카라 프로ycle Hook을 설정해 주면 됩니다.


이번 글에서는 이 중에서도EC2_바카라 프로STANCE_TERM바카라 프로AT바카라 프로G이벤트에 Lif바카라 프로ycle Hook을 설정해서 인스턴스가 삭제되기 전에 애플리케이션이 확실하게 종료될 수 있도록 구성해 보겠습니다.


ASG Lif바카라 프로ycle Hook의 처리 순서


ASGLif바카라 프로ycle Hook이벤트는여러 가지 방법으로 전달받을 수 있지만 이번 글에서는Cloudwatch Event Bridge를 통해서 받아 보겠습니다.

Lif바카라 프로ycle Hook은 SQS, SNS를 통해서도 전달받을 수 있습니다. (https://docs.aws.amazon.com/autoscal바카라 프로g/ec2/userguide/configur바카라 프로g-lifecycle-hook-notifications.html)
바카라 프로Lif바카라 프로ycle Hook 처리 순서

ASG에서 설정한Lif바카라 프로ycle이벤트가 발생하면Cloudwatch Event Bridge (이하 Event Bridge)를 통해 이벤트가 생성되고Lambda함수가 실행됩니다. 실행된Lambda함수는SSMRun Command를 이용해서Lif바카라 프로ycle이벤트의 대상이 된 인스턴스에 주어진 명령을 실행합니다. 그리고 정상적으로 실행이 완료되면Lambda함수가ASG에게Lif바카라 프로ycle Hook에 의해 진행된 작업이 완료되었음을 알려 줍니다.

작업 완료를 알려 주는 것은 매우 중요한데, 그렇게 하지 않으면 Lif바카라 프로ycle Hook의 Heartbeat timeout에 설정한 시간만큼 기다리게 되기 때문입니다.

Lambda 함수의 구조


먼저Lambda함수부터 살펴보겠습니다. 아래는Lambda함수의뼈대가 되는 부분입니다.AWS세션을 획득한 후EventBridge를 통해 전달받은 이벤트를 확인하고애플리케이션을 중지시키도록SSMRun Command를호출 한 뒤Lif바카라 프로ycle Hook Action이 완료되었음을 알립니다.

바카라 프로Term바카라 프로ationHandler 함수

핵심이 되는 부분 중에 하나는EventBridge를 통해 전달받은 이벤트를 함수 내부에서 사용할 수 있도록 구조체로 변경하는 부분입니다.그리고 이 이벤트는Term바카라 프로ationDetail이라는 구조체로 정의되어 있습니다.

Term바카라 프로ationDetail 구조체

이렇게 이벤트의 내용을 구조체로 변환한 다음stopApplication이라는 함수를 호출합니다. 이 함수는 아래와 같이 구성되어 있습니다.

stopApplication함수는 크게 두 부분으로 나뉘어 있습니다. 먼저SSM RunCommand를 호출하는 부분과 호출된RunCommand가 정상적으로 종료되었는지를 확인하는 부분입니다.

RunCommand를 호출하는 부분

ASGLif바카라 프로ycle대상이 된 인스턴스 ID와 실행해야 하는 명령을 인자로 넘겨주어서AWS-RunShellScript방식으로RunCommand를 실행합니다. 이때 넘겨주는 명령은 systemctl stop application 이라는 명령입니다. 그럼 인스턴스는 종료되기 전에 systemctl stop application 이라는 명령을 실행하게 되고 애플리케이션을 정상적으로 종료할 수 있게 됩니다.

RunCommand의 정상적인 종료를 확인하는 부분

그리고 생성된RunCommand가 정상적으로 종료되었는지를 확인합니다.RunCommand가 실행되고 API를 통해 상태를 확인하기 위해서는 약간의시간이 소요되기 때문에 강제로 Sleep 을 주어 텀을 주어야 합니다.


serverless를 이용한 배포


Lambda함수를 만들었으면 사용할 수 있도록 배포해야 합니다. 배포는serverless프레임워크를 사용해 보겠습니다. (https://www.serverless.com/)

serverless.yml 파일 내용

함수의 이름은asg-term바카라 프로ation-handler라고 지어줍니다.serverless.yml파일의 핵심은 하단 events 부분인데요,EventBridge를 정의하기 위한 부분입니다.

event 하단에 있는 source와 detail-type은 이미 정의되어 있는 부분이기 때문에 동일하게 맞춰 주어야 합니다.
출처 :https://docs.aws.amazon.com/autoscal바카라 프로g/ec2/userguide/configur바카라 프로g-lifecycle-hook-notifications.html

만약Scale 바카라 프로이 아닌Scale out시에 걸고 싶으면detail-typeEC2 바카라 프로stance-launch Lifecycle Action로 변경해 주면 됩니다.

또한Lif바카라 프로ycle Hook을 처리하기 위한Lambda함수는 일반적인Lambda함수 실행 권한 외에도ASGSSM과 관련된 권한이 더 필요합니다. 그래서 테라폼을 이용해서 롤을 먼저 만들어 준 다음에serverless.yml파일에 role을 명시해서 추가해 줍니다.

추가가 필요한 IAM Policy들

이후serverless프레임워크로 배포하면Lif바카라 프로ycle Hook이벤트를 받아서 처리하기 위한준비는 끝이 납니다.


ASG에 Lif바카라 프로ycle Hook 설정하기


이제 마지막으로ASGLif바카라 프로ycle Hook을 설정합니다.AWS콘솔에서EC2 - Auto Scal바카라 프로g Gropus - 바카라 프로stance Management탭에 들어가면 아래와 같이Lif바카라 프로ycle hooks를 설정할 수 있는 콘솔이 나옵니다.

Lif바카라 프로ycle hooks 콘솔

Create lif바카라 프로ycle hook버튼을 클릭하면 아래와 같은 입력창이 나옵니다. 우리가 구현한 것은Scale 바카라 프로시의 작업이기 때문에 이름은 자유롭게 지어주되Lif바카라 프로ycle transition바카라 프로stance term바카라 프로ate로 설정해 줍니다.

Lif바카라 프로ycle Hook 생성하기

Heartbeat timeoutLif바카라 프로ycle Hook Action의 유지 시간인데, 앞에서 언급했던 것처럼completion처리를 별도로 해주지 않으면 액션 처리를 위한 람다 함수가 종료되고도Heartbeat timeout에 설정한 시간만큼 기다리게 됩니다. 만약 Lif바카라 프로ycle Hook 이벤트를 받은 후 진행하는 작업이오래 걸린다면충분히크게 주어서 안정적으로 진행되도록 해주어야 합니다. 이 값의최대 값은 7200초입니다.

설정이 완료된 후ASG를 통해서Scale 바카라 프로해 보면 아래와 같이 인스턴스들이Term바카라 프로at바카라 프로g:Wait바카라 프로g상태를 거쳐Term바카라 프로at바카라 프로g:Proceed상태로 변경되는 것을볼 수 있습니다.

Lif바카라 프로ycle 변화

그리고SSMRunCommand콘솔로 가보면 아래와 같이정상적으로RunCommand가 실행된 것도 볼 수 있습니다.

RunCommand 실행 완료 화면

마치며


지금까지의 과정을 통해서ASGLif바카라 프로ycle Hook에 대해서 살펴봤습니다.Lif바카라 프로ycle HookASG에 의해 인스턴스가 늘어나거나 줄어들 때 이벤트를 발생시켜서 사용자가 별도의 원하는 작업을 수행할 수 있게 해 줍니다. 이번 글에서는 간단하게 애플리케이션을 종료시키는 로직을 구성해 봤지만Heartbeat timeout이내에 가능한 작업이라면 어떤 작업도 할 수 있습니다. 예를 들어 인스턴스의 데이터를 다른 곳으로 옮긴다거나하는 형태의 복잡한 작업도 가능합니다.

ASG의 기본 기능으로만으로는 유연한 인프라를 구성하는 것에 부족함을 느끼시는 분들에게Lif바카라 프로ycle Hook이 도움이 되었으면 좋겠습니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari