4.2. ECSコンテナエージェントの更新¶
作業の目的 [why]¶
ECSクラスタ"cluster-handson-cli"に属するインスタンスのコンテナエージェントを更新します。
完了条件/事前条件 [設計者用情報]
完了条件 [after]
主処理は、以下を満たしたときに成功したものとします。
- 完了条件1
- ECSクラスタ"cluster-handson-cli"に属するインスタンスのコンテナエージェントのバージョンが"1.16.2"よりも新しくなっている。
- 完了条件2
- ECSコンテナインスタンス"i-xxxxxxxxxxxxxxxxx"のステータスが"ACTIVE"で、エージェントが接続状態である。
事前条件 [before]
主処理の実施は、以下の状態であることを前提とします。
- 事前条件1
- ECSクラスタ"cluster-handson-cli"が存在する。
- 事前条件2
- ECSコンテナインスタンス"i-xxxxxxxxxxxxxxxxx"がECSクラスタ"cluster-handson-cli"に属している。
- 事前条件3
- ECSコンテナインスタンス"i-xxxxxxxxxxxxxxxxx"のステータスが"ACTIVE"で、エージェントが接続状態である。
- 事前条件4
- ECSコンテナインスタンス"i-xxxxxxxxxxxxxxxxx"のエージェントのバージョンが"1.16.1"である。
前提と異なることが判明した場合、直ちに処理を中止します。
作業対象 [what]¶
- ECSサービス
標準時間¶
8分
前提条件¶
作業環境条件 [where]¶
本作業は、以下の作業環境で行います。
作業環境条件1: OSとバージョン
Amazon Linuxの以下のバージョンで動作確認済
コマンド:
cat /etc/issue | head -1
結果(例):
Amazon Linux AMI release 2016.09
作業環境条件2: シェルとバージョン
bashの以下のバージョンで動作確認済
コマンド:
bash --version -v | head -1
結果(例):
GNU bash, バージョン 4.2.46(1)-release (x86_64-redhat-linux-gnu)
作業環境条件3: AWS CLIのバージョン
以下のバージョンで動作確認済
- AWS CLI 1.14.24
コマンド:
aws --version
結果(例):
aws-cli/1.14.31 Python/2.7.12 Linux/4.4.11-23.53.amzn1.x86_64 botocore/1.8.35
バージョンが古い場合は最新版に更新しましょう。
コマンド:
sudo -H pip install -U awscli
開始条件¶
作業に必要なモノ・情報 [resource]¶
作業開始には、以下が全て揃っていることが必要です。
リソース1: ECSクラスタ名
- 作成するECSクラスタの名称です。
- 今回は"cluster-handson-cli"とします。
リソース2: ECSコンテナインスタンス
- エージェントを更新するECSコンテナタインスタンスです。
- 今回はステータスが"ACTIVE"でエージェントのバージョンが"1.16.2"よりも古いコンテナインスタンスのうちの1つとします。
タスクの実施¶
0. パラメータの指定¶
まず変数の確認をします。
変数の確認:
cat << ETX # 0.a. AWS_DEFAULT_PROFILE:"<ECSのフル権限を許可されたプロファイル>" AWS_DEFAULT_PROFILE="${AWS_DEFAULT_PROFILE}" # 0.b. AWS_DEFAULT_REGION:"ap-northeast-1" AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}" # 0.1. ECS_CLUSTER_NAME:"cluster-handson-cli" ECS_CLUSTER_NAME="${ECS_CLUSTER_NAME}" # 0.2. EC2_INSTANCE_ID:"i-xxxxxxxxxxxxxxxxx" EC2_INSTANCE_ID="${EC2_INSTANCE_ID}" ETX
下段の変数が入っていない、もしくは上段と同等の値が入っていない場合は、それぞれの手順番号について作業を行います。
0.2. ECSコンテナインスタンスの指定¶
ECSコンテナインスタンスを指定します。
まず、ステータスが"ACTIVE"のインスタンスを調べます。
変数の設定:
ECS_CLUSTER_NAME='cluster-handson-cli'
コマンド:
ARRAY_ECS_INSTANCE_ARNS=$( \ aws ecs list-container-instances \ --cluster ${ECS_CLUSTER_NAME} \ --query 'containerInstanceArns' \ --output text \ ) \ && echo "${ARRAY_ECS_INSTANCE_ARNS}"
結果(例):
arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:container-instance/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
コマンド:
aws ecs describe-container-instances \ --cluster ${ECS_CLUSTER_NAME} \ --container-instances "${ARRAY_ECS_INSTANCE_ARNS}" \ --query "containerInstances[].[join(\`\`,[ec2InstanceId,\`: \`,status]),agentConnected]" \ --output text
結果(例):
i-xxxxxxxxxxxxxxxxx: ACTIVE True
インスタンスIDを変数に格納します。
変数の設定:
EC2_INSTANCE_ID="<操作対象とするインスタンスのインスタンスID>"
再確認¶
設定されている変数の内容を再確認します。
変数の確認:
cat << ETX # 0.a. AWS_DEFAULT_PROFILE:"<ECSのフル権限を許可されたプロファイル>" AWS_DEFAULT_PROFILE="${AWS_DEFAULT_PROFILE}" # 0.b. AWS_DEFAULT_REGION:"ap-northeast-1" AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}" # 0.1. ECS_CLUSTER_NAME:"cluster-handson-cli" ECS_CLUSTER_NAME="${ECS_CLUSTER_NAME}" # 0.2. EC2_INSTANCE_ID:"i-xxxxxxxxxxxxxxxxx" EC2_INSTANCE_ID="${EC2_INSTANCE_ID}" ETX
1. 前処理¶
1.1. 処理対象の状態確認¶
主処理の実施は、以下の状態であることを前提とします。
前提と異なることが判明した場合、直ちに処理を中止します。
事前条件1: ECSクラスタ"cluster-handson-cli"が存在する。
「ECSクラスタ"cluster-handson-cli"が存在する。」ことを確認します。
コマンド:
aws ecs list-clusters \ --query "clusterArns[?contains(@,\`${ECS_CLUSTER_NAME}\`)]"
結果(例):
[ "arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:cluster/cluster-handson-cli" ]
事前条件2: ECSコンテナインスタンス"i-xxxxxxxxxxxxxxxxx"がECSクラスタ"cluster-handson-cli"に属している。
「ECSコンテナインスタンス"i-xxxxxxxxxxxxxxxxx"がECSクラスタ"cluster-handson-cli"に属している。」ことを確認します。
コマンド:
aws ecs describe-container-instances \ --cluster ${ECS_CLUSTER_NAME} \ --container-instances "${ARRAY_ECS_INSTANCE_ARNS}" \ --query "containerInstances[?ec2InstanceId == \`${EC2_INSTANCE_ID}\`].ec2InstanceId"
結果(例):
[ i-xxxxxxxxxxxxxxxxx ]
事前条件3: ECSコンテナインスタンス"i-xxxxxxxxxxxxxxxxx"のステータスが"ACTIVE"で、エージェントが接続状態である。
「ECSコンテナインスタンス"i-xxxxxxxxxxxxxxxxx"のステータスが"ACTIVE"で、エージェントが接続状態である。」ことを確認します。
コマンド:
aws ecs describe-container-instances \ --cluster ${ECS_CLUSTER_NAME} \ --container-instances "${ARRAY_ECS_INSTANCE_ARNS}" \ --query "containerInstances[].[join(\`\`,[ec2InstanceId,\`: \`,status]),agentConnected]" \ --output text
結果(例):
i-xxxxxxxxxxxxxxxxx: ACTIVE True
事前条件4: ECSコンテナインスタンス"i-xxxxxxxxxxxxxxxxx"のエージェントのバージョンが"1.16.1"である。
「ECSコンテナインスタンス"i-xxxxxxxxxxxxxxxxx"のエージェントのバージョンが"1.16.1"である。」ことを確認します。
コマンド:
aws ecs describe-container-instances \ --cluster ${ECS_CLUSTER_NAME} \ --container-instances "${ARRAY_ECS_INSTANCE_ARNS}" \ --query "containerInstances[].[join(\`\`,[ec2InstanceId,\`: \`,versionInfo.agentVersion,\`: \`,versionInfo.dockerVersion])]" \ --output text
結果(例):
i-xxxxxxxxxxxxxxxxx: 1.16.1: DockerVersion: 17.06.2-ce
1.2. 主処理に必要な情報の取得¶
ECSコンテナインスタンスARNの取得
コマンド:
ECS_INSTANCE_ARN=$( \ aws ecs describe-container-instances \ --cluster ${ECS_CLUSTER_NAME} \ --container-instances "${ARRAY_ECS_INSTANCE_ARNS}" \ --query "containerInstances[?ec2InstanceId == \`${EC2_INSTANCE_ID}\`].containerInstanceArn" \ --output text \ ) \ && echo ${ECS_INSTANCE_ARN}
結果(例):
arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:container-instance/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
2. 主処理¶
ECSコンテナエージェントの更新¶
変数の確認:
cat << ETX # ECS_CLUSTER_NAME:"cluster-handson-cli" ECS_CLUSTER_NAME="${ECS_CLUSTER_NAME}" # ECS_INSTANCE_ARN:"arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:container-instance/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" ECS_INSTANCE_ARN:=${ECS_INSTANCE_ARN}" ETX
コマンド:
aws ecs update-container-agent \ --cluster ${ECS_CLUSTER_NAME} \ --container-instance ${ECS_INSTANCE_ARN}注釈
現在のバージョンより新しいバージョンが存在しない場合はエラーになります。
結果(例):
An error occurred (NoUpdateAvailableException) when calling the UpdateContainerAgent operation: There is no update available for your container agent.
結果(例):
{ "containerInstance": { "containerInstanceArn": "arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:container-instance/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "ec2InstanceId": "i-xxxxxxxxxxxxxxxxx", "version": 14, "versionInfo": { "agentVersion": "1.16.1", "agentHash": "ea383f2", "dockerVersion": "DockerVersion: 17.06.2-ce" }, "remainingResources": [ { "name": "CPU", "type": "INTEGER", "doubleValue": 0.0, "longValue": 0, "integerValue": 1024 }, { "name": "MEMORY", "type": "INTEGER", "doubleValue": 0.0, "longValue": 0, "integerValue": 993 }, { "name": "PORTS", "type": "STRINGSET", "doubleValue": 0.0, "longValue": 0, "integerValue": 0, "stringSetValue": [ "22", "2376", "2375", "51678", "51679" ] }, { "name": "PORTS_UDP", "type": "STRINGSET", "doubleValue": 0.0, "longValue": 0, "integerValue": 0, "stringSetValue": [] } ], "registeredResources": [ { "name": "CPU", "type": "INTEGER", "doubleValue": 0.0, "longValue": 0, "integerValue": 1024 }, { "name": "MEMORY", "type": "INTEGER", "doubleValue": 0.0, "longValue": 0, "integerValue": 993 }, { "name": "PORTS", "type": "STRINGSET", "doubleValue": 0.0, "longValue": 0, "integerValue": 0, "stringSetValue": [ "22", "2376", "2375", "51678", "51679" ] }, { "name": "PORTS_UDP", "type": "STRINGSET", "doubleValue": 0.0, "longValue": 0, "integerValue": 0, "stringSetValue": [] } ], "status": "ACTIVE", "agentConnected": true, "runningTasksCount": 0, "pendingTasksCount": 0, "agentUpdateStatus": "PENDING", "attributes": [ { "name": "com.amazonaws.ecs.capability.logging-driver.syslog" }, { "name": "ecs.ami-id", "value": "ami-xxxxxxxx" }, { "name": "com.amazonaws.ecs.capability.logging-driver.none" }, { "name": "com.amazonaws.ecs.capability.logging-driver.json-file" }, { "name": "ecs.capability.execution-role-awslogs" }, { "name": "ecs.vpc-id", "value": "vpc-f9ab7a9e" }, { "name": "com.amazonaws.ecs.capability.docker-remote-api.1.17" }, { "name": "com.amazonaws.ecs.capability.docker-remote-api.1.18" }, { "name": "com.amazonaws.ecs.capability.docker-remote-api.1.19" }, { "name": "ecs.capability.task-eni" }, { "name": "ecs.capability.task-cpu-mem-limit" }, { "name": "com.amazonaws.ecs.capability.docker-remote-api.1.30" }, { "name": "ecs.capability.execution-role-ecr-pull" }, { "name": "ecs.subnet-id", "value": "subnet-xxxxxxxx" }, { "name": "ecs.availability-zone", "value": "ap-northeast-1a" }, { "name": "ecs.instance-type", "value": "t2.micro" }, { "name": "com.amazonaws.ecs.capability.task-iam-role-network-host" }, { "name": "com.amazonaws.ecs.capability.logging-driver.awslogs" }, { "name": "com.amazonaws.ecs.capability.docker-remote-api.1.24" }, { "name": "com.amazonaws.ecs.capability.docker-remote-api.1.25" }, { "name": "com.amazonaws.ecs.capability.privileged-container" }, { "name": "ecs.capability.cni-plugin-version", "value": "397bc51-2017.10.1" }, { "name": "com.amazonaws.ecs.capability.ecr-auth" }, { "name": "com.amazonaws.ecs.capability.docker-remote-api.1.20" }, { "name": "ecs.os-type", "value": "linux" }, { "name": "com.amazonaws.ecs.capability.docker-remote-api.1.21" }, { "name": "com.amazonaws.ecs.capability.docker-remote-api.1.22" }, { "name": "com.amazonaws.ecs.capability.task-iam-role" }, { "name": "com.amazonaws.ecs.capability.docker-remote-api.1.23" } ], "registeredAt": 1516607929.297, "attachments": [] } }
3. 後処理¶
完了条件の確認¶
主処理は、以下を満たしたときに成功したものとします。
完了条件1: ECSクラスタ"cluster-handson-cli"に属するインスタンスのコンテナエージェントのバージョンが"1.16.2"よりも新しくなっている。
「ECSクラスタ"cluster-handson-cli"に属するインスタンスのコンテナエージェントのバージョンが"1.16.2"よりも新しくなっている。」ことを確認します。
コマンド:
aws ecs describe-container-instances \ --cluster ${ECS_CLUSTER_NAME} \ --container-instances "${ARRAY_ECS_INSTANCE_ARNS}" \ --query "containerInstances[].[join(\`\`,[ec2InstanceId,\`: \`,versionInfo.agentVersion,\`: \`,versionInfo.dockerVersion])]" \ --output text
結果(例):
i-xxxxxxxxxxxxxxxxx: 1.16.2: DockerVersion: 17.06.2-ce
完了条件2: ECSコンテナインスタンス"i-xxxxxxxxxxxxxxxxx"のステータスが"ACTIVE"で、エージェントが接続状態である。
「ECSコンテナインスタンス"i-xxxxxxxxxxxxxxxxx"のステータスが"ACTIVE"で、エージェントが接続状態である。」ことを確認します。
コマンド:
aws ecs describe-container-instances \ --cluster ${ECS_CLUSTER_NAME} \ --container-instances "${ARRAY_ECS_INSTANCE_ARNS}" \ --query "containerInstances[].[join(\`\`,[ec2InstanceId,\`: \`,status]),agentConnected]" \ --output text
結果(例):
i-xxxxxxxxxxxxxxxxx: ACTIVE True