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

최종 업데이트 날짜: 2021년 1월 28일

Amazon Linux 1 Amazon Machine Image(AMI)와 함께 Amazon ECS(Amazon Elastic Container Service) 컨테이너 인스턴스를 사용합니다. 그러나 디스크 공간이 충분하지 않은 Linux 1 AMI 기반 Amazon ECS 컨테이너 인스턴스에 태스크가 배치되지 않도록 하려면 어떻게 해야 합니까? 이 문제는 Docker 데몬이 내 Docker 이미지 리포지토리에서 Docker 이미지를 가져온 다음 태스크를 실행하려 할 때 발생합니다. 이 문제를 방지하려면 어떻게 해야 합니까?

간략한 설명

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

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

그런 다음, 태스크 정의를 사용하여 디스크 공간이 부족한 컨테이너 인스턴스에 태스크를 배치하지 않도록 제한하는 태스크 배치 제약 조건을 지정합니다.

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

해결 방법

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

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

참고: AWS CLI(AWS 명령줄 인터페이스) 명령을 실행할 때 오류가 발생할 경우 AWS CLI의 최신 버전을 사용하고 있는지 확인하세요.

1.    다음 명령을 실행하여 컨테이너 인스턴스의 시작 구성의 user data 섹션에 AWS CLI 및 jq 패키지를 설치합니다. 자세한 내용은 jq 웹사이트의 ./jq를 참조하세요.

yum install -y aws-cli jq

참고: user data 섹션은 시작 시에 명령을 실행하여 Amazon EC2 인스턴스를 부트스트랩합니다.

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

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

중요: 위의 정책은 와일드카드 파라미터를 사용합니다. 이 파라미터를 사용하면 보안 주체가 계정의 호환 가능한 리소스(컨테이너 인스턴스)에 대해 ecs:PutAttributes를 호출할 수 있습니다. 이 예제는 사용 편의성을 위한 것입니다. 그러나 가능하면 최소한의 권한을 부여하는 것이 좋습니다. 자세한 내용은 Amazon Elastic Container Service 자격 증명 기반 정책 예제를 참조하세요. 다음 예제 정책은 특정 클러스터의 컨테이너 인스턴스로만 호출을 제한합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:PutAttributes"
            ],
            "Resource": [
                "arn:aws:ecs:<region>:<accountId>:container-instance/<clusterName>/*"
            ]
        }
    ]
}

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"
    }
]

이제 연결된 태스크 정의에 디스크 공간이 부족한 컨테이너 인스턴스에 태스크를 배치하지 않도록 제한하는 태스크 배치 제약 조건이 포함되었습니다.


이 문서가 도움이 되었나요?


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