十分なディスク容量がない Amazon Linux 1 AMI を使用する Amazon ECS コンテナインスタンスにタスクを配置しないようにするにはどうすればよいですか?

所要時間2分
0

Amazon Elastic Container Service (Amazon ECS) コンテナインスタンスを Amazon Linux 1 Amazon マシンイメージ (AMI) と併せて使用しています。しかし、十分なディスク容量がない Linux 1 AMI で Amazon ECS コンテナインスタンスでタスクを開始することはできません。Docker デーモンが Docker イメージリポジトリから Docker イメージを取得して、タスクを実行しようとしたときにこの問題が発生します。この問題をどのように防ぐことができますか?

簡単な説明

Amazon Elastic Compute Cloud (Amazon EC2) 起動タイプを使用してタスクを開始する場合、Amazon ECS はコンテナインスタンスでのディスク容量の可用性を考慮しません。Amazon ECS は、タスク定義で指定された要件 (CPU、メモリ、ポートなど) に基づいて、 タスクを配置する場所を決定します。 この問題を解決するには、ディスク領域を監視するディスク領域監視スクリプトを使用できます。このスクリプトは、Amazon ECS コンテナインスタンスで使用可能なディスク領域を示す値を返します。戻り値は、カスタム属性としてコンテナインスタンスに関連付けられています。コンテナインスタンスプロファイルに関連付けられた AWS Identity and Access Management (IAM) ロールには、このカスタム属性値を更新するためのアクセス許可が必要です。

その後、タスク定義を使用して、ディスク領域が不十分なコンテナインスタンスでのタスクの配置を制限するタスク配置制約を指定します。

注: Amazon Linux 1 のサポートは 2020 年 12 月 31 日に終了します。ベストプラクティスとして、サポートが終了する前にワークロードを Amazon Linux 2 に移行してください。

解決方法

Amazon ECS-optimized Amazon Linux AMI でコンテナインスタンスを起動する

重要: 複数のアベイラビリティーゾーンで設定された Auto Scaling グループを使用してインスタンスを起動することがベストプラクティスです。インスタンスをブーストラップするコマンドは、起動設定のユーザーデータに追加できます。

注: AWS コマンドラインインターフェイス (AWS CLI) のコマンド実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用するようにしてください

1.    次のコマンドを実行して、AWS CLI および jq パッケージを、コンテナインスタンスの起動設定の user data セクションにインストールします。詳細については、jq のウェブサイトで「./jq」をご参照ください。

yum install -y aws-cli jq

注: ユーザーデータセクションは、起動時にコマンドを実行して 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.    IAM ロール ecsInstanceRole に対し、インラインポリシーを関連付けます。

注: AWS CLI の aws ecs put-attribute コマンドを使うと、IAM のアクセス権限により、コンテナインスタンスに対し 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 ジョブの一環として一分間隔で定期的に実行することができます。または、異なる時間間隔を選択することもできます。スクリプトは、起動設定のユーザーデータに追加できます。

3.    Amazon ECS コンソールを開き、タスク配置の制約を使って Amazon ECS タスクの定義を行います。例:

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

関連付けられたタスク定義に、ディスク領域が不十分なコンテナインスタンスでのタスクの配置を制限する配置制約が配置されました。


関連情報

CannotCreateContainerError: API error (500): devmapper

AMI ストレージ構成

AWS公式
AWS公式更新しました 3年前