View a markdown version of this page

Amazon ECS Auto Scaling 그룹에 대해 사전 초기화된 인스턴스 구성 - Amazon Elastic Container Service

Amazon ECS Auto Scaling 그룹에 대해 사전 초기화된 인스턴스 구성

Amazon ECS에서 Amazon EC2 Auto Scaling 웜 풀을 지원합니다. 웜 풀은 서비스에 배치할 준비가 되어 사전 초기화된 Amazon EC2 인스턴스의 그룹입니다. 애플리케이션을 확장해야 할 때마다 Amazon EC2 Auto Scaling은 콜드 인스턴스를 시작하는 대신 웜 풀에서 미리 초기화된 인스턴스를 사용하고 모든 최종 초기화 프로세스가 실행되도록 허용한 다음 인스턴스를 서비스에 배치합니다.

웜 풀 및 Auto Scaling에 웜 풀을 추가하는 방법에 대한 자세한 정보는 Amazon EC2 Auto Scaling 사용 설명서Amazon EC2 Auto Scaling의 웜 풀을 참조하세요.

Amazon ECS의 Auto Scaling 그룹에 대한 웜 풀을 생성하거나 업데이트할 경우, 스케일 인에서 웜 풀로 인스턴스를 반환하는 옵션을 설정할 수 없습니다(ReuseOnScaleIn). 자세한 내용은 AWS Command Line Interface 참조put-warm-pool을 참조하세요.

Amazon ECS 클러스터에서 웜 풀을 사용하려면 Amazon EC2 Auto Scaling 그룹 시작 템플릿의 사용자 데이터(User data) 필드에서 ECS_WARM_POOLS_CHECK 에이전트 구성 변수를 true로 설정합니다.

다음은 Linux 인스턴스를 위한 Amazon EC2 시작 템플릿의 사용자 데이터(User data) 필드에 에이전트 구성 변수를 지정하는 방법의 예를 보여줍니다. MyCluster를 클러스터 이름으로 바꿉니다. Windows 인스턴스의 경우 Amazon ECS Windows 인스턴스에서 웜 풀 사용의 내용을 참조하세요.

#!/bin/bash cat <<'EOF' >> /etc/ecs/ecs.config ECS_CLUSTER=MyCluster ECS_WARM_POOLS_CHECK=true EOF

ECS_WARM_POOLS_CHECK 변수는 에이전트 버전 1.59.0 이상에서만 지원됩니다. 변수에 대한 자세한 정보는 Amazon ECS 컨테이너 에이전트 구성을 참조하세요.

Amazon ECS Windows 인스턴스에서 웜 풀 사용

Windows 인스턴스에서 중지된 풀 상태의 웜 풀을 사용하는 경우, Amazon EC2 Auto Scaling 수명 주기 후크를 사용하여 인스턴스가 중지되기 전에 사용자 데이터 실행이 완료되도록 합니다. 수명 주기 후크가 없으면 Amazon ECS 초기화가 완료되기 전에 인스턴스가 중지될 수 있습니다.

Windows 웜 풀 인스턴스의 수명 주기 후크를 다음과 같이 구성합니다.

  1. 컨테이너 인스턴스 역할에 다음 IAM 정책을 추가하여 인스턴스가 수명 주기 작업을 완료하도록 허용합니다.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "autoscaling:CompleteLifecycleAction" ], "Resource": "*" } ] }
  2. ABANDON를 기본 결과로 설정하고 Amazon ECS 초기화에 충분한 하트비트 제한 시간(예: 10분)을 지정하여 인스턴스 시작 시 Auto Scaling 그룹에 수명 주기 후크를 추가합니다. 자세한 내용을 알아보려면 Amazon EC2 Auto Scaling 사용 설명서수명 주기 후크 추가를 참조하세요.

  3. 예약된 작업을 생성하는 다음 사용자 데이터를 사용하여 지연 후 수명 주기 작업을 완료합니다. 지연이 발생하면 인스턴스가 중지되기 전에 EC2Launch가 상태 저장을 완료합니다. MyCluster, my-lifecycle-hookmy-asg-name을 값으로 바꿉니다.

    <powershell> $lifecycleHookName = "my-lifecycle-hook" $autoScalingGroupName = "my-asg-name" $scriptContent = @' $token = Invoke-RestMethod -Method Put -Uri http://169.254.169.254/latest/api/token -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} $instanceId = Invoke-RestMethod -Method Get -Uri http://169.254.169.254/latest/meta-data/instance-id -Headers @{"X-aws-ec2-metadata-token" = $token} $region = Invoke-RestMethod -Method Get -Uri http://169.254.169.254/latest/meta-data/placement/region -Headers @{"X-aws-ec2-metadata-token" = $token} $lifecycleHookName = "my-lifecycle-hook" $autoScalingGroupName = "my-asg-name" Complete-ASLifecycleAction -LifecycleHookName $lifecycleHookName -AutoScalingGroupName $autoScalingGroupName -InstanceId $instanceId -LifecycleActionResult 'CONTINUE' -Region $region '@ Set-Content -Path "C:\ProgramData\Amazon\ECS\complete-lifecycle.ps1" -Value $scriptContent try { [Environment]::SetEnvironmentVariable("ECS_WARM_POOLS_CHECK", "true", "Machine") Import-Module ECSTools Initialize-ECSAgent -Cluster MyCluster -EnableTaskIAMRole $taskAction = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -File C:\ProgramData\Amazon\ECS\complete-lifecycle.ps1" $taskTrigger = New-ScheduledTaskTrigger -Once -At ((Get-Date).AddSeconds(60)) $settings = New-ScheduledTaskSettingsSet -StartWhenAvailable $taskPrincipal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest Register-ScheduledTask -TaskName "CompleteLifecycleHook" -Action $taskAction -Trigger $taskTrigger -Principal $taskPrincipal -Settings $settings -Force } catch { $token = Invoke-RestMethod -Method Put -Uri http://169.254.169.254/latest/api/token -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} $INSTANCE = Invoke-RestMethod -Method Get -Uri http://169.254.169.254/latest/meta-data/instance-id -Headers @{"X-aws-ec2-metadata-token" = $token} $region = Invoke-RestMethod -Method Get -Uri http://169.254.169.254/latest/meta-data/placement/region -Headers @{"X-aws-ec2-metadata-token" = $token} Complete-ASLifecycleAction -InstanceId $INSTANCE -LifecycleHookName $lifecycleHookName -AutoScalingGroupName $autoScalingGroupName -LifecycleActionResult ABANDON -Region $region } </powershell> <persist>true</persist>

이 사용자 데이터 스크립트는 다음 작업을 수행합니다.

  • 웜 풀 검사가 활성화된 상태에서 Amazon ECS 에이전트를 초기화합니다.

  • 사용자 데이터가 완료된 후 30초를 기다리는 예약 작업을 생성한 다음 수명 주기 후크에 진행하라는 신호를 보냅니다. 지연을 통해 EC2Launch가 상태를 저장하여 후속 부팅 시 사용자 데이터가 올바르게 다시 실행될 수 있습니다.

  • 초기화에 실패하면 ABANDON로 수명 주기 작업이 완료되므로 인스턴스가 종료되고 교체됩니다.