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

최종 업데이트 날짜: 2020년 3월 25일

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

간략한 설명

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

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

​해결 방법

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

1.    컨테이너 인스턴스의 사용자 데이터 섹션에 AWS CLI(AWS 명령줄 인터페이스) 및 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

참고: 1분 간격 또는 원하는 간격으로 cron 작업의 일부로 스크립트를 주기적으로 실행할 수 있습니다.

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

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

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


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

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?