

# Amazon ECS 컨테이너 에이전트 업데이트
<a name="ecs-agent-update"></a>

때때로 버그 수정 및 새로운 기능을 적용하기 위해 Amazon ECS 컨테이너 에이전트를 업데이트해야 할 수도 있습니다. Amazon ECS 컨테이너 에이전트를 업데이트할 때 컨테이너 인스턴스의 실행 작업 또는 서비스가 중단되지 않습니다. 에이전트 업데이트 절차는 컨테이너 인스턴스가 Amazon ECS 최적화 AMI 또는 기타 운영 체제에서 시작되었는지에 따라 다릅니다.

**참고**  
에이전트 업데이트는 Windows 컨테이너 인스턴스에 적용되지 않습니다. 새로운 컨테이너 인스턴스를 시작하여 Windows 클러스터의 에이전트 버전을 업데이트하는 것을 권장합니다.

## Amazon ECS 컨테이너 에이전트 버전 확인
<a name="checking_agent_version"></a>

컨테이너 인스턴스에서 실행 중인 컨테이너 에이전트의 버전을 확인하고 업데이트가 필요한지 판단할 수 있습니다. Amazon ECS 콘솔의 컨테이너 인스턴스 보기에 에이전트 버전이 표시됩니다. 에이전트 버전을 확인하려면 다음 절차를 사용합니다.

------
#### [ Amazon ECS console ]

1. [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)에서 콘솔을 엽니다.

1. 탐색 모음에서 외부 인스턴스가 등록되어 있는 리전을 선택합니다.

1. 탐색 창에서 **클러스터**를 선택하고 외부 인스턴스를 호스팅하는 클러스터를 선택합니다.

1. **클러스터: *name*(Cluster : name)** 페이지에서 **인프라(Infrastructure)** 탭을 선택합니다.

1. **컨테이너 인스턴스(Container instances)**에서 컨테이너 인스턴스의 **에이전트 버전(Agent version)** 열을 확인합니다. 컨테이너 인스턴스에 최신 컨테이너 에이전트 버전이 포함되어 있지 않으면 콘솔이 메시지를 통해 경고하고 이전 에이전트 버전에 플래그를 지정합니다.

   에이전트 버전이 오래된 경우 다음 절차를 사용하여 컨테이너 에이전트를 업데이트할 수 있습니다.
   + 컨테이너 인스턴스가 Amazon ECS 최적화 AMI를 실행할 경우 [Amazon ECS 최적화 AMI에서 Amazon ECS 컨테이너 에이전트 업데이트](agent-update-ecs-ami.md)를 참조하세요.
   + 컨테이너 인스턴스가 Amazon ECS 최적화 AMI를 실행하지 않을 경우 [Amazon ECS 컨테이너 에이전트를 수동으로 업데이트하는 방법(비 Amazon ECS 최적화 AMI)](manually_update_agent.md)를 참조하세요.
**중요**  
Amazon ECS 최적화 AMI에서 v1.0.0 이전의 Amazon ECS 에이전트 버전을 업데이트하려면 현재 컨테이너 인스턴스를 종료하고 최신 AMI 버전을 사용하여 새 인스턴스를 시작하는 것이 좋습니다. 미리 보기 버전을 사용하는 컨테이너 인스턴스는 종료하고 최신 AMI로 대체해야 합니다. 자세한 정보는 [Amazon ECS Linux 컨테이너 인스턴스 시작](launch_container_instance.md)을 참조하세요.

------
#### [ Amazon ECS container agent introspection API  ]

컨테이너 인스턴스 자체에서 에이전트 Amazon ECS 컨테이너 에이전트 내부 검사 API 버전을 확인하는 데 이를 사용할 수도 있습니다. 자세한 정보는 [Amazon ECS 컨테이너 내부 검사](ecs-agent-introspection.md)을 참조하세요.

**내부 검사 API를 사용하여 Amazon ECS 컨테이너 에이전트가 최신 버전을 실행 중인지 확인하는 방법**

1. SSH를 통해 컨테이너 인스턴스에 로그인합니다.

1. 내부 검사 API를 쿼리합니다.

   ```
   [ec2-user ~]$ curl -s 127.0.0.1:51678/v1/metadata | python3 -mjson.tool
   ```
**참고**  
내부 검사 API는 Amazon ECS 컨테이너 에이전트의 버전 v1.0.0에서 `Version` 정보를 추가했습니다. 내부 검사 API를 쿼리했을 때 `Version`이 없는 경우, 또는 에이전트에 내부 검사 API 자체가 없는 경우 실행되는 버전은 v0.0.3 이하입니다. 버전을 업데이트해야 합니다.

------

# Amazon ECS 최적화 AMI에서 Amazon ECS 컨테이너 에이전트 업데이트
<a name="agent-update-ecs-ami"></a>

Amazon ECS 최적화 AMI를 사용하는 경우, 최신 버전의 Amazon ECS 컨테이너 에이전트를 얻을 수 있는 옵션은 다음과 같이 여러 가지가 있습니다(권장 순서로 표시).
+ 컨테이너 인스턴스를 종료하고 (수동으로 또는 Auto Scaling 시작 구성을 최신 AMI로 업데이트하여) 최신 버전의 Amazon ECS 최적화 Amazon Linux 2 AMI를 시작합니다. 그러면 테스트 및 검증된 최신 버전의 Amazon Linux, Docker, `ecs-init` 및 Amazon ECS 컨테이너 에이전트를 포함하는 컨테이너 인스턴스가 새로 시작됩니다. 자세한 정보는 [Amazon ECS 최적화 Linux AMI](ecs-optimized_AMI.md)을 참조하세요.
+ SSH를 사용하여 인스턴스에 연결하고 `ecs-init` 패키지(및 해당 종속성)를 최신 버전으로 업데이트합니다. 이 작업은 Amazon Linux 리포지토리에서 사용 가능한 테스트 및 검증된 최신 버전의 도커 및 `ecs-init`와 최신 버전의 Amazon ECS 컨테이너 에이전트를 제공합니다. 자세한 정보는 [Amazon ECS 최적화 AMI에서 `ecs-init` 패키지를 업데이트하는 방법](#procedure_update_ecs-init)을 참조하세요.
+ 콘솔을 통해 또는 AWS CLI 또는 AWS SDK를 사용해 `UpdateContainerAgent` API 작업으로 컨테이너를 업데이트합니다. 자세한 정보는 [`UpdateContainerAgent` API 태스크를 사용하여 Amazon ECS 컨테이너 에이전트 업데이트](#agent-update-api)을 참조하세요.

**참고**  
에이전트 업데이트는 Windows 컨테이너 인스턴스에 적용되지 않습니다. 새로운 컨테이너 인스턴스를 시작하여 Windows 클러스터의 에이전트 버전을 업데이트하는 것을 권장합니다.<a name="procedure_update_ecs-init"></a>

**Amazon ECS 최적화 AMI에서 `ecs-init` 패키지를 업데이트하는 방법**

1. SSH를 통해 컨테이너 인스턴스에 로그인합니다.

1. 다음 명령을 사용하여 `ecs-init` 패키지를 업데이트합니다.

   ```
   sudo yum update -y ecs-init
   ```
**참고**  
`ecs-init` 패키지와 Amazon ECS 컨테이너 에이전트가 즉시 업데이트됩니다. 그러나 새 버전의 Docker는 Docker 대몬이 다시 시작되기 전에는 로드되지 않습니다. 인스턴스를 재부팅하거나 인스턴스에서 다음 명령을 실행하여 다시 시작하세요.  
Amazon ECS 최적화 Amazon Linux 2 AMI:  

     ```
     sudo systemctl restart docker
     ```
Amazon ECS 최적화 Amazon Linux AMI:  

     ```
     sudo service docker restart && sudo start ecs
     ```

## `UpdateContainerAgent` API 태스크를 사용하여 Amazon ECS 컨테이너 에이전트 업데이트
<a name="agent-update-api"></a>

**중요**  
`UpdateContainerAgent` API는 Amazon ECS 최적화 AMI의 Linux 변형에서만 지원됩니다. 단, Amazon ECS 최적화 Amazon Linux 2(arm64) AMI만 예외입니다. Amazon ECS 최적화 Amazon Linux 2(arm64) AMI를 사용하는 컨테이너 인스턴스의 경우, `ecs-init` 패키지를 업데이트하여 에이전트를 업데이트하세요. 다른 운영 체제를 실행하는 컨테이너 인스턴스의 경우 [Amazon ECS 컨테이너 에이전트를 수동으로 업데이트하는 방법(비 Amazon ECS 최적화 AMI)](manually_update_agent.md) 섹션을 참조하세요. Windows 컨테이너 인스턴스를 사용하고 있을 경우 새로운 컨테이너 인스턴스를 시작하여 Windows 클러스터의 에이전트 버전을 업데이트하는 것을 권장합니다.

`UpdateContainerAgent` API 프로세스는 콘솔 또는 AWS CLI나 AWS SDK를 통해 에이전트 업데이트를 요청하면 시작됩니다. Amazon ECS는 현재 에이전트 버전을 사용 가능한 최신 에이전트 버전과 비교하여 업데이트가 가능한지 확인합니다. 업데이트가 가능하지 않으면(예: 이미 최신 버전이 실행 중) `NoUpdateAvailableException`이 반환됩니다.

위에 표시된 업데이트 프로세스의 단계는 다음과 같습니다.

`PENDING`  
에이전트 업데이트가 가능하고, 업데이트 프로세스가 시작되었습니다.

`STAGING`  
에이전트가 에이전트 업데이트를 다운로드하기 시작했습니다. 에이전트가 업데이트를 다운로드할 수 없는 경우 또는 업데이트의 내용이 부정확하거나 손상된 경우 에이전트가 실패 알림을 전송하고 업데이트가 `FAILED` 상태로 전환됩니다.

`STAGED`  
에이전트 다운로드가 완료되었으며 에이전트 내용이 확인되었습니다.

`UPDATING`  
`ecs-init` 서비스가 다시 시작되어 새 에이전트 버전을 선택합니다. 어떤 이유로 에이전트를 다시 시작할 수 없는 경우 업데이트가 `FAILED` 상태로 전환되고, 그렇지 않으면 에이전트가 Amazon ECS에게 업데이트 완료 신호를 보냅니다.

**참고**  
에이전트 업데이트는 Windows 컨테이너 인스턴스에 적용되지 않습니다. 새로운 컨테이너 인스턴스를 시작하여 Windows 클러스터의 에이전트 버전을 업데이트하는 것을 권장합니다.

**콘솔에서 Amazon ECS 최적화 AMI에서 Amazon ECS 컨테이너 에이전트를 업데이트하는 방법**

1. [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)에서 콘솔을 엽니다.

1. 탐색 모음에서 외부 인스턴스가 등록되어 있는 리전을 선택합니다.

1. 탐색 창에서 **클러스터**를 선택하고 클러스터를 선택합니다.

1. **클러스터: *name*(Cluster : name)** 페이지에서 **인프라(Infrastructure)** 탭을 선택합니다.

1. **컨테이너 인스턴스**에서 업데이트할 인스턴스를 선택하고 **작업**, **에이전트 업데이트**를 선택합니다.

# Amazon ECS 컨테이너 에이전트를 수동으로 업데이트하는 방법(비 Amazon ECS 최적화 AMI)
<a name="manually_update_agent"></a>

때때로 버그 수정 및 새로운 기능을 적용하기 위해 Amazon ECS 컨테이너 에이전트를 업데이트해야 할 수도 있습니다. Amazon ECS 컨테이너 에이전트를 업데이트할 때 컨테이너 인스턴스의 실행 작업 또는 서비스가 중단되지 않습니다.
**참고**  
에이전트 업데이트는 Windows 컨테이너 인스턴스에 적용되지 않습니다. 새로운 컨테이너 인스턴스를 시작하여 Windows 클러스터의 에이전트 버전을 업데이트하는 것을 권장합니다.

1. SSH를 통해 컨테이너 인스턴스에 로그인합니다.

1. 에이전트가 `ECS_DATADIR` 환경 변수를 사용하여 해당 상태를 저장하는지 확인합니다.

   ```
   ubuntu:~$ docker inspect ecs-agent | grep ECS_DATADIR
   ```

   출력:

   ```
   "ECS_DATADIR=/data",
   ```
**중요**  
이전 명령이 `ECS_DATADIR` 환경 변수를 반환하지 않으면 에이전트를 업데이트하기 전에 이 컨테이너 인스턴스에서 실행 중인 태스크를 모두 중지해야 합니다. `ECS_DATADIR` 환경 변수를 사용하는 새 버전의 에이전트는 해당 상태를 저장하며 태스크가 실행되는 동안 에이전트를 업데이트해도 문제가 발생하지 않습니다.

1. Amazon ECS 컨테이너 에이전트를 중지합니다.

   ```
   ubuntu:~$ docker stop ecs-agent
   ```

1. 에이전트 컨테이너를 삭제합니다.

   ```
   ubuntu:~$ docker rm ecs-agent
   ```

1. `/etc/ecs` 디렉터리와 Amazon ECS 컨테이너 에이전트 구성 파일이 `/etc/ecs/ecs.config`에 있는지 확인합니다.

   ```
   ubuntu:~$ sudo mkdir -p /etc/ecs && sudo touch /etc/ecs/ecs.config
   ```

1. `/etc/ecs/ecs.config` 파일을 편집하고 이 파일에 최소한 다음과 같은 변수 선언이 포함되어 있는지 확인합니다. 컨테이너 인스턴스가 기본 클러스터에 등록되지 않도록 하려면 클러스터 이름을 `ECS_CLUSTER`의 값으로 지정합니다.

   ```
   ECS_DATADIR=/data
   ECS_ENABLE_TASK_IAM_ROLE=true
   ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true
   ECS_LOGFILE=/log/ecs-agent.log
   ECS_AVAILABLE_LOGGING_DRIVERS=["json-file","awslogs"]
   ECS_LOGLEVEL=info
   ECS_CLUSTER=default
   ```

   이들을 비롯한 기타 에이전트 런타임 옵션에 대한 자세한 내용은 [Amazon ECS 컨테이너 에이전트 구성](ecs-agent-config.md) 섹션을 참조하세요.
**참고**  
필요할 경우 (시작 시 Amazon EC2 사용자 데이터를 사용하여 컨테이너 인스턴스에 다운로드할 수 있는) Amazon S3에 에이전트 환경 변수를 저장할 수 있습니다. 프라이빗 리포지토리의 인증 자격 증명과 같은 민감한 정보에는 이 방법을 권장합니다. 자세한 내용은 [Amazon S3에 Amazon ECS 컨테이너 인스턴스 구성 저장](ecs-config-s3.md) 및 [Amazon ECS에서 AWS 컨테이너가 아닌 이미지 사용](private-auth.md) 섹션을 참조하세요.

1. Amazon Elastic Container Registry Public에서 최신 Amazon ECS 컨테이너 에이전트 이미지를 가져옵니다.

   ```
   ubuntu:~$ docker pull public.ecr.aws/ecs/amazon-ecs-agent:latest
   ```

   출력:

   ```
   Pulling repository amazon/amazon-ecs-agent
   a5a56a5e13dc: Download complete
   511136ea3c5a: Download complete
   9950b5d678a1: Download complete
   c48ddcf21b63: Download complete
   Status: Image is up to date for amazon/amazon-ecs-agent:latest
   ```

1. 컨테이너 인스턴스에서 최신 Amazon ECS 컨테이너 에이전트를 실행합니다.
**참고**  
Docker 재시작 정책 또는 프로세스 관리자(예: **upstart** 또는 **systemd**)를 사용하여 컨테이너 에이전트를 서비스 또는 대몬으로 취급하고 종료 후에 다시 시작되도록 합니다. 이를 위해 Amazon ECS 최적화 AMI는 `ecs-init` RPM을 사용합니다. GitHub에서 [이 RPM의 소스 코드](https://github.com/aws/amazon-ecs-init)를 확인할 수 있습니다.

   다음의 에이전트 실행 명령 예제는 각 옵션을 표시하기 위해 여러 줄로 구분되어 있습니다. 이들을 비롯한 기타 에이전트 런타임 옵션에 대한 자세한 내용은 [Amazon ECS 컨테이너 에이전트 구성](ecs-agent-config.md) 섹션을 참조하세요.
**중요**  
운영 체제에서 SELinux를 사용하는 경우 **docker run** 명령에 `--privileged` 옵션이 필요합니다. 또한 SELinux 사용 컨테이너 인스턴스의 경우에는 `:Z` 옵션을 `/log` 및 `/data` 볼륨 마운트에 추가하는 것이 좋습니다. 그러나 명령을 실행하기 전에 이러한 볼륨에 대한 호스트 마운트가 존재해야 하며 그렇지 않으면 `no such file or directory` 오류가 발생합니다. SELinux 사용 컨테이너 인스턴스에서 Amazon ECS 에이전트를 실행하는 데 문제가 있는 경우 다음 조치를 취하세요.  
컨테이너 인스턴스에서 호스트 볼륨 마운트 지점을 생성합니다.  

     ```
     ubuntu:~$ sudo mkdir -p /var/log/ecs /var/lib/ecs/data
     ```
아래의 **docker run** 명령에 `--privileged` 옵션을 추가합니다.
아래의 **docker run** 명령에 대한 `/log` 및 `/data` 컨테이너 볼륨 마운트(예: `--volume=/var/log/ecs/:/log:Z`)에 `:Z` 옵션을 추가합니다.

   ```
   ubuntu:~$ sudo docker run --name ecs-agent \
   --detach=true \
   --restart=on-failure:10 \
   --volume=/var/run:/var/run \
   --volume=/var/log/ecs/:/log \
   --volume=/var/lib/ecs/data:/data \
   --volume=/etc/ecs:/etc/ecs \
   --volume=/etc/ecs:/etc/ecs/pki \
   --net=host \
   --env-file=/etc/ecs/ecs.config \
   amazon/amazon-ecs-agent:latest
   ```
**참고**  
`Error response from daemon: Cannot start container` 메시지가 표시되는 경우 **sudo docker rm ecs-agent** 명령을 사용하여 실패한 컨테이너를 삭제하고 에이전트를 다시 실행해볼 수 있습니다.