ECS 배포 중 상태 확인을 자동화하는 Appspec의 Hooks 설정

소개



배포에 실패했을 때 자동으로 롤백할 수 있다는 것은 중요하다.
ECS의 CodeDeploy에 의한 배포에서는 End-to-End의 상태 확인을 자동화할 수 있다.
이번은 튜토리얼과 거의 같은 내용이지만, Appspec의 Hooks 설정에 의한 정상성 확인 방법을 정리한다.

전제 조건



적어도 다음을 이해하고 있던 것이 삼키기가 빠를 것이다.
  • ECS + Fargate 배포 파이프 라인을 직접 만든 적이있다

  • ※배포 파이프라인의 샘플은 이전 기사 로 쓰고 있으므로 참고까지.

    할 일



    파이프라인의 정리까지 되어 있다면 그다지 힘들지 않다.
    이하의 작업을 하면 된다.
  • Appspec 편집
  • IAM 정책 검사
  • 상태 확인을위한 Lambda 함수 만들기

  • Appspec 편집



    Appspec에서는 CodeDeploy의 각 라이프사이클 이벤트를 훅하고 Lambda 함수를 호출할 수 있으므로, 그 훅의 설정(Hooks)을 설정한다.
    이번에는 ECS 태스크 배포 후 ELB의 테스트 포트 측 상태 확인이 완료되었을 때 호출되는 라이프사이클 이벤트에 대해 후크한다.
    자세한 내용은 공식 문서을 참조하십시오.
    Hooks:
      - AfterInstall: "[後で設定するLambda関数名]"
    

    이것만으로 좋다. Arn으로 지정하고 있는 경우도 있지만, 함수명에서도 실행할 수 있었다.

    IAM 정책 점검



    CodeDeploy 서비스 역할에 lambda:InvokeFunction가 포함되어 있는지 확인합니다.
    Hooks의 구조는 CodeDeploy에서 Lambda 함수를 실행하기 때문에이 권한이 없으면 오류가 발생합니다.

    상태 확인을 위한 Lambda 함수 만들기



    키모가 되는 것이 이 람다이다.
    boto3에서 CODE_DEPLOY 클라이언트를 만들고 어설션 결과를 put_lifecycle_event_hook_execution_status로 알립니다. 상태로 Failed를 전달하면 배포가 자동으로 롤백됩니다. 조심해야 하는 것은 Succeeded 를 건네준 경우는 「자동으로 진행한다」가 아니고 「에러가 되지 않을 뿐」이므로, 조작자가 스스로 다음의 페이즈에 진행시켜 주지 않으면 안 된다.
    import json
    import urllib.request
    import boto3
    
    CODE_DEPLOY = boto3.client('codedeploy')
    
    def notify_execution_status(event, status):
        deployment_id = event.get('DeploymentId')
        execution_id = event.get('LifecycleEventHookExecutionId')
    
        return CODE_DEPLOY.put_lifecycle_event_hook_execution_status(deploymentId=deployment_id,
                                                                     lifecycleEventHookExecutionId=execution_id,
                                                                     status=status)
    
    def lambda_handler(event, context):
        print(event)
    
        status = 'Succeeded'
    
        try:
            request = urllib.request.Request("http://[ELBのドメイン]:[テストポート]/[リソース]", method="GET")
            with urllib.request.urlopen(request) as response:
                response_body = response.read().decode("utf-8")
            assert [任意のアサーション]
            notify_response = notify_execution_status(event, status)
        except Exception as e:
            print(e)
            status = 'Failed'
            notify_execution_status(event, status)
        else:
            print(notify_response)    
    

    이제이 중 CODE_DEPLOY.put_lifecycle_event_hook_execution_status은 CodeDeploy의 상태를 변경하기 때문에이 Lambda 함수에 권한을 부여해야합니다.

    Lambda 실행 IAM 역할의 Actions에 codedeploy:PutLifecycleEventHookExecutionStatus를 넣어 두자.

    실행 결과



    위의 설정이 들어간 CodeDeploy를 움직이면 아래와 같이 CloudWatch Logs에 Lambda 함수의 결과가 출력된다.
    난점은 CodeDeploy측에서 이 함수가 잘 됐는지 확인할 수 없다는 것이다 (CloudWatch Logs를 보지 않으면 롤백되지 않으면 잘 되었다고 생각할 수밖에 없다). 즉, 명시적으로 성공한 것을 알 수 있는 로그로 해 두지 않으면 판단에 헤매게 된다. 그러나 일부러 로그를 다른 화면에 보러 가고 버튼을 누르는 복잡한 절차로 만드는 것은 정말 클라우드 네이티브가 아니고 멋지다 ......



    위의 확인 후, 아래의 CodeDeploy 콘솔 화면의 "트래픽 재 라우팅"버튼을 누르면 배포가 완료됩니다.



    참고로 Lambda 함수가 Failed를 반환하면 다음과 같이 출력됩니다.



    실은 이것 , 잘 시나리오 를 Lambda 로 짜 낼 수 있으면 , End - to - End 의 인테그레이션 시험 무엇 도 CI 에 짜넣어 자동화할 수 있다고 하는 것이다 ... ... . 궁리의 여지가 있을 것 같다.

    좋은 웹페이지 즐겨찾기