

# Amazon ECS 서비스 배포에 대한 수명 주기 후크
<a name="deployment-lifecycle-hooks"></a>

배포가 시작되면 수명 주기 단계에 따라 진행됩니다. 각 단계는 `IN_PROGRESS` 또는 `SUCCEEDED`와 같은 상태일 수 있습니다. Amazon ECS가 사용자를 대신해 지정된 수명 주기 단계에서 실행하는 Lambda 함수인 수명 주기 후크를 사용할 수 있습니다. 각 간접 호출에는 배포의 현재 상태에 대한 정보를 포함하는 JSON 페이로드가 포함됩니다.

## 수명 주기 후크
<a name="lifecycle-hook-status"></a>

수명 주기 후크는 Amazon ECS가 배포의 특정 단계에서 간접적으로 호출하는 Lambda 함수입니다. 배포를 진행하기 전에 후크를 사용하여 검증 테스트를 실행하거나, 거버넌스 정책을 적용하거나, 수동 승인 단계를 구현할 수 있습니다.

Amazon ECS가 후크를 간접적으로 호출하면 함수는 `hookStatus` 필드가 포함된 JSON 객체를 반환해야 합니다. 선택적으로 `callBackDelay`를 포함하여 재시도 타이밍을 제어하고 `hookDetails`를 포함하여 간접 호출 간에 데이터를 전달할 수 있습니다. 함수가 유효한 `hookStatus`를 반환하지 않거나 실패하면 Amazon ECS가 배포를 롤백합니다.

### hookStatus 값
<a name="hook-status-values"></a>

유효한 `hookStatus` 값은 다음과 같습니다.
+ `SUCCEEDED` - 배포는 다음 수명 주기 단계로 계속 진행됩니다.
+ `FAILED` - Amazon ECS는 배포를 마지막으로 성공한 서비스 개정으로 롤백합니다.
+ `IN_PROGRESS` - Amazon ECS는 지연 후 함수를 다시 간접적으로 호출합니다. 지연 시간의 기본값은 30초입니다. `callBackDelay`를 `hookStatus`와 함께 반환하여 이 값을 사용자 지정할 수 있습니다.

다음 예제에서는 사용자 지정 콜백 지연으로 `hookStatus`를 반환하는 방법을 보여줍니다. 이 예제에서 Amazon ECS는 기본 30초 대신 60초 후에 이 후크를 다시 시도합니다.

```
{
    "hookStatus": "IN_PROGRESS",
    "callBackDelay": 60
}
```

### hookDetails를 사용하여 상태 전달
<a name="hook-details"></a>

`hookDetails` 필드는 수명 주기 후크 함수에 데이터를 전달하는 데 사용할 수 있는 사전입니다. `hookDetails`를 채우는 방법에는 두 가지가 있습니다.
+ **서비스 생성 또는 업데이트 시** - 서비스 정의 내의 수명 주기 후크 구성에서 `hookDetails`를 정의합니다. Amazon ECS는 간접 호출 시마다 이 데이터를 함수에 전달합니다. 이러한 방법으로 서비스별 구성을 전달하여 여러 서비스에서 후크를 재사용하도록 할 수 있습니다.
+ **IN\_PROGRESS 응답을 통해 런타임 시** - `hookDetails`를 `IN_PROGRESS` 후크 상태와 함께 반환합니다. Amazon ECS는 다음 간접 호출 시 이 데이터를 함수에 다시 전달합니다. 외부 스토리지 없이 간접 호출 간에 상태를 유지하려면 이 옵션을 사용합니다.

다음 예제는 S3 버킷 이름을 함수에 전달하는 서비스 정의의 수명 주기 후크 구성을 보여줍니다.

```
{
    "hookTargetArn": "arn:aws:lambda:us-west-2:123456789012:function:my-approval-hook",
    "roleArn": "arn:aws:iam::123456789012:role/ecs-lambda-invoke-role",
    "lifecycleStages": [
        "POST_TEST_TRAFFIC_SHIFT"
    ],
    "hookDetails": {
        "S3_BUCKET_NAME": "my-approval-bucket"
    }
}
```

함수가 `IN_PROGRESS`를 반환하면 응답에 `hookDetails`를 포함할 수도 있습니다. Amazon ECS는 이 데이터를 병합하여 다음 간접 호출 시 다시 전달합니다. 일반적인 사용 사례에는 간접 호출 간 지표 카운터 또는 외부 리소스 ARN 전달이 포함됩니다.

```
{
    "hookStatus": "IN_PROGRESS",
    "callBackDelay": 30,
    "hookDetails": {
        "approvalChecked": true,
        "S3_BUCKET_NAME": "my-approval-bucket"
    }
}
```

Amazon ECS는 다음 간접 호출 시 `executionDetails`와 함께 이벤트 페이로드에 `hookDetails`를 포함합니다.

```
{
  "executionId": "e8d5a28f-eb01-4f3c-9454-a30ba6dc54bc",
  "lifecycleStage": "POST_TEST_TRAFFIC_SHIFT",
  "resourceArn": "arn:aws:ecs:us-west-2:123456789012:service-deployment/my-cluster/my-service/EZe5RNVLH6PPzHXINuP28",
  "executionDetails": {
    "serviceArn": "arn:aws:ecs:us-west-2:123456789012:service/my-cluster/my-service",
    "targetServiceRevisionArn": "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900",
    "testTrafficWeights": {},
    "productionTrafficWeights": {}
  },
  "hookDetails": {
    "approvalChecked": true,
    "S3_BUCKET_NAME": "my-approval-bucket"
  }
}
```

함수는 이전 간접 호출의 구성 및 상태에 액세스하기 위해 `event["hookDetails"]`를 읽을 수 있습니다.

**참고**  
런타임 시 `hookDetails`에 추가된 데이터는 단일 배포 내에서 동일한 후크의 간접 호출 간에만 유지됩니다. 데이터는 동일한 배포 내의 서로 다른 후크 또는 서로 다른 배포의 동일한 후크 간에는 전달되지 않습니다.

## 수명 주기 단계 범주
<a name="lifecycle-stage-categories"></a>

수명 주기 단계는 다음과 같은 두 가지 범주로 구분됩니다.

1. **단일 간접 호출 단계** - Amazon ECS는 서비스 배포 중에 이러한 단계를 한 번만 간접 호출합니다.
   + `RECONCILE_SERVICE`
   + `PRE_SCALE_UP`
   + `POST_SCALE_UP`
   + `POST_TEST_TRAFFIC_SHIFT`
   + `POST_PRODUCTION_TRAFFIC_SHIFT`

1. **반복 간접 호출 단계** - Amazon ECS는 서비스 배포 중에 이러한 단계를 여러 번 간접적으로 호출할 수 있습니다(롤백 포함).
   + `TEST_TRAFFIC_SHIFT`
   + `PRODUCTION_TRAFFIC_SHIFT`

## 수명 주기 페이로드
<a name="service-deployment-lifecycle-payloads"></a>

### 공통 페이로드 구조
<a name="common-payload-structure"></a>

Amazon ECS가 수명 주기 후크 Lambda 함수를 간접적으로 호출하면 이벤트 페이로드에는 다음과 같은 최상위 필드가 포함됩니다.
+ `executionId` - 이 후크 실행의 고유한 식별자.
+ `lifecycleStage` - 현재 수명 주기 단계(예: `PRODUCTION_TRAFFIC_SHIFT`).
+ `resourceArn` - 배포와 연결된 리소스의 ARN.
+ `executionDetails` - 다음 목록에 설명된 배포별 정보가 포함된 객체.

`executionDetails` 객체는 다음 필드를 포함합니다.
+  `serviceArn` - 서비스의 Amazon 리소스 이름(ARN).
+  `targetServiceRevisionArn` - 배포 중인 대상 서비스 개정의 ARN.
+  `testTrafficWeights` - 해당 테스트 트래픽 가중치 백분율에 대한 서비스 개정 ARN의 맵.
+  `productionTrafficWeights` - 해당 프로덕션 트래픽 가중치 백분율에 대한 서비스 개정 ARN의 맵.

다음 예제는 Lambda 함수가 수신하는 전체 이벤트 구조를 보여줍니다.

```
{
  "executionId": "f4fcae0f-9bec-41c6-ba87-0eaa0cef8af5",
  "lifecycleStage": "PRODUCTION_TRAFFIC_SHIFT",
  "resourceArn": "arn:aws:ecs:us-west-2:123456789012:service-deployment/my-cluster/my-service/EZe5RNVLH6PPzHXINuP28",
  "executionDetails": {
    "serviceArn": "arn:aws:ecs:us-west-2:123456789012:service/my-cluster/my-service",
    "targetServiceRevisionArn": "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900",
    "testTrafficWeights": {},
    "productionTrafficWeights": {
      "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900": 100,
      "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/1920498462936580504": 0
    }
  }
}
```

### 수명 주기 단계 페이로드
<a name="lifecycle-stage-payloads"></a>

다음 섹션에서는 이 수명 주기 단계의 페이로드 예제를 보여줍니다. 이들 예제에서 그린 서비스 개정(`9313423515462893900`)은 배포 중인 새 개정이고 블루 서비스 개정(`1920498462936580504`)은 기존 프로덕션 개정입니다.

#### PRE\_SCALE\_UP
<a name="pre-scale-up"></a>

이 단계는 Amazon ECS가 그린 서비스 개정 태스크를 시작하기 전에 발생합니다. 그린 서비스 개정이 시작되지 않았으며 해당 개정으로 라우팅되는 트래픽이 없습니다.

```
{
  "executionId": "e8d5a28f-eb01-4f3c-9454-a30ba6dc54bc",
  "lifecycleStage": "PRE_SCALE_UP",
  "resourceArn": "arn:aws:ecs:us-west-2:123456789012:service-deployment/my-cluster/my-service/EZe5RNVLH6PPzHXINuP28",
  "executionDetails": {
    "serviceArn": "arn:aws:ecs:us-west-2:123456789012:service/my-cluster/my-service",
    "targetServiceRevisionArn": "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900",
    "testTrafficWeights": {},
    "productionTrafficWeights": {}
  }
}
```

#### POST\_SCALE\_UP
<a name="post-scale-up"></a>

이 단계는 Amazon ECS가 그린 서비스 개정 태스크를 시작하고 태스크가 정상 상태인 이후에 발생합니다. 그린 태스크가 실행 중이지만 아직 트래픽을 수신하지 않습니다.

```
{
  "executionId": "8b095b05-7bb0-4c56-a223-a3f61f4f9295",
  "lifecycleStage": "POST_SCALE_UP",
  "resourceArn": "arn:aws:ecs:us-west-2:123456789012:service-deployment/my-cluster/my-service/EZe5RNVLH6PPzHXINuP28",
  "executionDetails": {
    "serviceArn": "arn:aws:ecs:us-west-2:123456789012:service/my-cluster/my-service",
    "targetServiceRevisionArn": "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900",
    "testTrafficWeights": {},
    "productionTrafficWeights": {}
  }
}
```

#### TEST\_TRAFFIC\_SHIFT
<a name="test-traffic-shift"></a>

이 단계는 Amazon ECS가 테스트 트래픽을 그린 서비스 개정으로 전환할 때 발생합니다. `testTrafficWeights`는 그린 개정이 테스트 트래픽의 100%를 수신하고 블루 개정이 0%를 수신하고 있음을 보여줍니다. 프로덕션 트래픽은 계속해서 블루 개정으로 흐릅니다.

```
{
  "executionId": "779085de-ab47-42bc-84ad-41f9914a8643",
  "lifecycleStage": "TEST_TRAFFIC_SHIFT",
  "resourceArn": "arn:aws:ecs:us-west-2:123456789012:service-deployment/my-cluster/my-service/EZe5RNVLH6PPzHXINuP28",
  "executionDetails": {
    "serviceArn": "arn:aws:ecs:us-west-2:123456789012:service/my-cluster/my-service",
    "targetServiceRevisionArn": "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900",
    "testTrafficWeights": {
      "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900": 100,
      "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/1920498462936580504": 0
    },
    "productionTrafficWeights": {}
  }
}
```

#### POST\_TEST\_TRAFFIC\_SHIFT
<a name="post-test-traffic-shift"></a>

이 단계는 Amazon ECS가 테스트 트래픽 전환을 완료한 후에 발생합니다. 그린 서비스 개정이 테스트 트래픽의 100%를 처리합니다.

```
{
  "executionId": "3a0345ba-b029-404b-890d-7da2a4b266aa",
  "lifecycleStage": "POST_TEST_TRAFFIC_SHIFT",
  "resourceArn": "arn:aws:ecs:us-west-2:123456789012:service-deployment/my-cluster/my-service/EZe5RNVLH6PPzHXINuP28",
  "executionDetails": {
    "serviceArn": "arn:aws:ecs:us-west-2:123456789012:service/my-cluster/my-service",
    "targetServiceRevisionArn": "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900",
    "testTrafficWeights": {},
    "productionTrafficWeights": {}
  }
}
```

#### PRODUCTION\_TRAFFIC\_SHIFT
<a name="production-traffic-shift"></a>

이 단계는 Amazon ECS가 프로덕션 트래픽을 그린 서비스 개정으로 전환할 때 발생합니다. `productionTrafficWeights`는 그린 개정이 프로덕션 트래픽의 100%를 수신하고 블루 개정이 0%를 수신하고 있음을 보여줍니다.

```
{
  "executionId": "f4fcae0f-9bec-41c6-ba87-0eaa0cef8af5",
  "lifecycleStage": "PRODUCTION_TRAFFIC_SHIFT",
  "resourceArn": "arn:aws:ecs:us-west-2:123456789012:service-deployment/my-cluster/my-service/EZe5RNVLH6PPzHXINuP28",
  "executionDetails": {
    "serviceArn": "arn:aws:ecs:us-west-2:123456789012:service/my-cluster/my-service",
    "targetServiceRevisionArn": "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900",
    "testTrafficWeights": {},
    "productionTrafficWeights": {
      "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900": 100,
      "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/1920498462936580504": 0
    }
  }
}
```

#### POST\_PRODUCTION\_TRAFFIC\_SHIFT
<a name="post-production-traffic-shift"></a>

이 단계는 Amazon ECS가 프로덕션 트래픽 전환을 완료한 후에 발생합니다. 이제 그린 서비스 개정이 모든 프로덕션 트래픽을 처리합니다.

```
{
  "executionId": "5f40ed04-7e54-437d-b95d-98bc872fec49",
  "lifecycleStage": "POST_PRODUCTION_TRAFFIC_SHIFT",
  "resourceArn": "arn:aws:ecs:us-west-2:123456789012:service-deployment/my-cluster/my-service/EZe5RNVLH6PPzHXINuP28",
  "executionDetails": {
    "serviceArn": "arn:aws:ecs:us-west-2:123456789012:service/my-cluster/my-service",
    "targetServiceRevisionArn": "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900",
    "testTrafficWeights": {},
    "productionTrafficWeights": {}
  }
}
```

## 롤백 중 수명 주기 후크
<a name="lifecycle-hooks-during-rollback"></a>

전용 `ROLLBACK` 수명 주기 단계는 없습니다. 롤백이 발생하면 Amazon ECS는 `PRODUCTION_TRAFFIC_SHIFT` 및 `TEST_TRAFFIC_SHIFT` 단계(반복 간접 호출 단계)에 등록된 후크를 다시 간접적으로 호출합니다. 롤백 시 페이로드의 `productionTrafficWeights`는 블루 개정으로 다시 전환하는 트래픽을 보여줍니다.

트래픽이 원래 배포에서 다른 위치로 전환되더라도 여전히 원래 배포의 대상이므로 `targetServiceRevisionArn`은 그린 개정 ARN으로 유지됩니다.

다음 예제에서는 롤백 시 `PRODUCTION_TRAFFIC_SHIFT` 페이로드를 보여줍니다. 이제 블루 개정(`1920498462936580504`)은 프로덕션 트래픽의 100%를 수신하고 그린 개정(`9313423515462893900`)은 0%를 수신함을 알 수 있습니다.

```
{
  "executionId": "70073435-cb99-457f-b900-6ee1dcad05ec",
  "lifecycleStage": "PRODUCTION_TRAFFIC_SHIFT",
  "resourceArn": "arn:aws:ecs:us-west-2:123456789012:service-deployment/my-cluster/my-service/EZe5RNVLH6PPzHXINuP28",
  "executionDetails": {
    "serviceArn": "arn:aws:ecs:us-west-2:123456789012:service/my-cluster/my-service",
    "targetServiceRevisionArn": "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900",
    "testTrafficWeights": {},
    "productionTrafficWeights": {
      "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900": 0,
      "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/1920498462936580504": 100
    }
  }
}
```

롤백 시 후크가 간접적으로 호출되고 있는지 확인하려면 `productionTrafficWeights`를 확인합니다. `targetServiceRevisionArn`(그린 개정)의 가중치가 0%이고 다른 개정의 가중치가 100%인 경우 배포가 롤백되는 것입니다.