디스크 공간이 충분하지 않은 Amazon Linux 1 AMI를 사용해 Amazon ECS 컨테이너 인스턴스에 태스크를 배치하지 않도록 방지하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 8월 20일

디스크 공간이 충분하지 않은 Amazon Linux 1 Amazon Machine Image(AMI)가 있는 Amazon ECS(Amazon Elastic Container Service) 컨테이너 인스턴스에서 태스크를 시작할 수 없습니다. 이는 Docker 데몬이 Docker 이미지 리포지토리에서 Docker 이미지를 가져온 다음 태스크를 실행하려고 할 때 발생합니다.

간략한 설명

Amazon EC2(Amazon Elastic Compute Cloud) 시작 유형을 사용하는 태스크를 시작하면 Amazon ECS는 CPU, 메모리, 포트 등 태스크 정의에 지정된 요구 사항에 따라 어디에 태스크를 배치할지 결정합니다. Amazon ECS는 컨테이너 인스턴스의 디스크 공간 가용성을 고려하지 않습니다.

이 문제를 해결하려면 디스크 공간을 모니터링한 후 Amazon ECS 컨테이너 인스턴스에서 사용 가능한 디스크 공간을 보여 주는 값을 반환하는 디스크 공간 모니터링 스크립트를 사용할 수 있습니다. 이 값은 사용자 지정 속성으로 컨테이너 인스턴스와 연결됩니다. 컨테이너 인스턴스의 인스턴스 프로파일과 연결된 AWS Identity and Access Management(IAM) 역할에는 이 사용자 지정 속성 값을 업데이트할 수 있는 권한이 있어야 합니다. 이 스크립트를 설치한 후 태스크 정의를 사용하여 디스크 공간이 충분하지 않은 컨테이너 인스턴스에서 태스크 배치를 제한하는 태스크 배치 제약 조건을 지정합니다.

참고: Amazon Linux 1은 2020년 12월 31일에 지원이 종료됩니다. 지원이 종료되기 전에 워크로드를 Amazon Linux 2로 마이그레이션하는 것이 좋습니다.

해결 방법

Amazon ECS 최적화 Amazon Linux AMI를 사용하여 컨테이너 인스턴스 시작

중요: 여러 개의 가용 영역으로 구성된 Auto Scaling 그룹으로 인스턴스를 시작하는 것이 좋습니다. 명령을 추가하여 시작 구성의 사용자 데이터에 있는 인스턴스를 부트스트랩할 수 있습니다.

1.    컨테이너 인스턴스 시작 구성의 사용자 데이터 섹션에 AWS CLI(Command Line Interface)와 jq 패키지(jq 웹 사이트에서 가져옴)를 설치하려면 다음과 같은 명령을 실행합니다.

yum install -y aws-cli jq

참고: 사용자 데이터 섹션은 시작 시 명령을 실행하여 Amazon EC2 인스턴스를 부트스트랩합니다.

2.    IAM 콘솔을 열고 다음 인라인 정책을 생성합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ecs:PutAttributes",
            "Resource": "*"
        }
    ]
}

참고: 인라인 정책은 컨테이너 인스턴스에 연결된 IAM 인스턴스 프로파일과 연결된 IAM 역할에 권한을 부여합니다.

3.    인라인 정책을 ecsInstanceRole IAM 역할과 연결합니다.

참고: IAM 권한은 AWS CLI에서 aws ecs put-attribute 명령을 사용하여 SpaceLeft 사용자 지정 속성을 컨테이너 인스턴스와 연결합니다. SpaceLeft 사용자 지정 속성은 디스크 공간 모니터링 스크립트에 의해 계산됩니다.

Amazon ECS 컨테이너 인스턴스에서 디스크 공간 모니터링 스크립트 설치 및 실행

1.    클러스터의 디스크 공간(GB)을 모니터링하려면 컨테이너 인스턴스에 다음 스크립트를 설치합니다.

#! /usr/bin/env bash
set -o pipefail
set -o nounset
set -o errexit

until curl -s http://localhost:51678/v1/metadata
do
   sleep 1
done

clusterName=$(curl -s http://localhost:51678/v1/metadata | jq .Cluster | tr -d '"' )
SpaceLeft=$(docker info | grep 'Data Space Available' | cut -d':' -f2)
Unit=$(echo "$SpaceLeft" | grep -o '..$')
if [ "$Unit" != GB ]; then
    SpaceLeft=$(echo "$SpaceLeft" | sed 's/[A-Za-z]*//g' | cut -d '.' -f1)
    SpaceLeftValue=$(echo "$SpaceLeft" | awk '{$1=$1/(1000); print $1;}')
else
        SpaceLeftValue=$(echo "$SpaceLeft" | sed 's/[A-Za-z]*//g')
fi

instanceArn=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F/ '{print $NF}' )
region=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F: '{print $4}')

aws ecs put-attributes \
  --cluster "$clusterName" \
  --attributes name="SpaceLeft",value="$SpaceLeftValue",targetType="container-instance",targetId="$instanceArn" \
  --region "$region"

참고: 스크립트 이름을 diskspaceMonitoring.sh로 지정한 다음 클러스터의 모든 Amazon ECS 컨테이너 인스턴스에 있는 /home/ec2-user/diskspaceMonitoring.sh 경로에 추가할 수 있습니다. 디스크 공간 모니터링 스크립트는 컨테이너 인스턴스 시작 구성에 속한 사용자 데이터의 일부분으로 지정해도 됩니다.

2.    컨테이너 인스턴스에서 다음 스크립트를 실행합니다.

$echo "* * * * * root /home/ec2-user/diskspaceMonitoring.sh" >> /etc/crontab

참고: 이 스크립트는 cron 작업의 일부로 1분 간격으로 주기적으로 실행할 수 있습니다. 시간 간격은 다르게 선택할 수 있습니다. 시작 구성의 사용자 데이터에 해당 스크립트를 추가할 수 있습니다.

3.    Amazon ECS 콘솔을 열고 Amazon ECS 태스크 정의를 사용하여 태스크 배치 제약 조건을 생성합니다. 예:

"placementConstraints": [
    {
        "expression": "attribute:SpaceLeft >= 0.1",
        "type": "memberOf"
    }
]

참고: 이제 연결된 태스크 정의에는 디스크 공간이 충분하지 않은 컨테이너 인스턴스에서 태스크 배치를 제한하는 배치 제약 조건이 있습니다.


이 문서가 도움이 되었습니까?


결제 또는 기술 지원이 필요합니까?