디스크 공간이 부족한 Amazon Elastic Container Service(Amazon ECS) 컨테이너 인스턴스에서 작업을 시작할 수 없습니다. 이 문제는 Docker 데몬이 내 Docker 이미지 리포지토리에서 Docker 이미지를 가져온 다음 작업을 실행하려 할 때 발생합니다. 해결하려면 어떻게 해야 합니까?

Amazon ECS는 Amazon ECS 컨테이너 인스턴스의 CPU, 메모리, 포트 가용성을 확인하여 작업 배치를 결정합니다. 이때 Amazon ECS는 컨테이너 인스턴스의 디스크 공간 가용성을 고려하지 않습니다.

디스크 공간 모니터링 스크립트를 사용하여 디스크 공간을 모니터링한 후 Amazon ECS 컨테이너 인스턴스의 사용 가능한 디스크 공간을 보여 주는 값을 반환하십시오. 이 값은 사용자 지정 속성으로 컨테이너 인스턴스에 연결됩니다. 컨테이너 인스턴스의 인스턴스 프로파일과 관련한 AWS Identity and Access Management(IAM) 역할에는 이 사용자 지정 속성 값을 업데이트하는 권한이 있습니다. 이 스크립트를 설치한 후 작업 정의를 사용하여 디스크 공간이 부족한 컨테이너 인스턴스에 작업을 배치하지 않도록 제한하는 작업 배치 제약 조건을 지정하십시오.

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

1.    다음 명령을 실행하여 컨테이너 인스턴스의 사용자 데이터 섹션에 AWS 명령줄 인터페이스(AWS CLI)와 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 지원 지식 센터로 돌아가기

도움이 필요하십니까? AWS 지원 센터를 방문하십시오.

게시된 날짜: 2019년 1월 22일