

# 프라이빗 Docker 이미지를 위한 Amazon ECS 컨테이너 인스턴스 구성
<a name="private-auth-container-instances"></a>

Amazon ECS 컨테이너 에이전트는 기본 인증을 사용하여 프라이빗 레지스트리로 인증할 수 있습니다. 프라이빗 레지스트리 인증을 활성화하면 태스크 정의에서 프라이빗 Docker 이미지를 사용할 수 있습니다. 이 기능은 EC2를 사용하는 태스크에서만 지원됩니다.

프라이빗 레지스트리 인증을 활성화하는 또 다른 방법은 AWS Secrets Manager를 사용하여 프라이빗 레지스트리 자격 증명을 안전하게 저장한 후 나중에 컨테이너 정의에서 참조합니다. 태스크에서 프라이빗 리포지토리의 이미지를 사용할 수 있는 것도 이러한 인증 기능 때문입니다. 이 방법은 EC2 또는 Fargate를 사용하는 태스크만 지원합니다. 자세한 내용은 [Amazon ECS에서 AWS 컨테이너가 아닌 이미지 사용](private-auth.md) 섹션을 참조하세요.

Amazon ECS 컨테이너 에이전트는 시작할 때 다음 환경 변수 2개를 찾습니다.
+ `ECS_ENGINE_AUTH_TYPE`, 전송되는 인증 데이터의 유형을 지정합니다.
+ `ECS_ENGINE_AUTH_DATA`, 실제 인증 자격 증명이 포함됩니다.

Amazon ECS 최적화 AMI의 Linux 변형은 컨테이너 인스턴스가 시작될 때, 그리고 서비스가 시작될 때마다이 변수에 대해 `/etc/ecs/ecs.config` 파일을 스캔할 수 있습니다(**sudo start ecs** 명령 사용). Amazon ECS 최적화가 아닌 AMI는 이러한 환경 변수를 파일에 저장하고 `--env-file path_to_env_file` 옵션을 사용하여 컨테이너 에이전트를 시작하는 **docker run** 명령에 전달해야 합니다.

**중요**  
이러한 인증 환경 변수를 인스턴스 시작 시 Amazon EC2 사용자 데이터를 사용하여 첨가하거나 `--env` 옵션을 사용하여 **docker run** 명령으로 전달하지 않는 것이 좋습니다. 인증 자격 증명과 같은 민감한 정보인 경우 이러한 방법이 적절하지 않습니다. 인증 자격 증명을 컨테이너 인스턴스에 안전하게 추가하는 방법에 대한 자세한 내용은 [Amazon S3에 Amazon ECS 컨테이너 인스턴스 구성 저장](ecs-config-s3.md) 섹션을 참조하세요.

## 인증 형식
<a name="docker-auth-formats"></a>

프라이빗 레지스트리 인증에 `dockercfg` 및 `docker` 두 가지 형식을 사용할 수 있습니다.

**Dockercfg 인증 형식**  
`dockercfg` 형식은 **docker login** 명령을 실행하면 만들어지는 구성 파일에 저장된 인증 정보를 사용합니다. 이 파일은 로컬 시스템에서 **docker login**을 실행하고 레지스트리 사용자 이름, 암호 및 이메일 주소를 입력하여 만들 수 있습니다. 컨테이너 인스턴스에 로그인한 후 그 인스턴스에서 명령을 실행할 수도 있습니다. Docker 버전에 따라 이 파일은 `~/.dockercfg` 또는 `~/.docker/config.json`으로 저장됩니다.

```
cat ~/.docker/config.json
```

출력:

```
{
  "auths": {
    "https://index.docker.io/v1/": {
      "auth": "zq212MzEXAMPLE7o6T25Dk0i"
    }
  }
}
```

**중요**  
Docker 버전이 새로우면 바깥쪽 `auths` 객체를 사용하여 위와 같은 구성 파일이 생성됩니다. Amazon ECS 에이전트는 `auths` 객체 없이 아래 형식의 `dockercfg` 인증 데이터만 지원합니다. **jq** 유틸리티가 설치된 경우에는 **cat \$1/.docker/config.json \$1 jq .auths** 명령으로 이 데이터를 추출할 수 있습니다.

```
cat ~/.docker/config.json | jq .auths
```

출력:

```
{
  "https://index.docker.io/v1/": {
    "auth": "zq212MzEXAMPLE7o6T25Dk0i",
    "email": "email@example.com"
  }
}
```

위 예제에서는 실행 시간에 Amazon ECS 컨테이너 에이전트가 로드하는 환경 변수 파일(Amazon ECS 최적화 AMI의 경우에는 `/etc/ecs/ecs.config`)에 다음 환경 변수를 추가해야 합니다. Amazon ECS 최적화 AMI를 사용하지 않고 **docker run**을 사용하여 수동으로 에이전트를 시작하는 경우 에이전트를 시작할 때 `--env-file path_to_env_file` 옵션을 통해 환경 변수 파일을 지정합니다.

```
ECS_ENGINE_AUTH_TYPE=dockercfg
ECS_ENGINE_AUTH_DATA={"https://index.docker.io/v1/":{"auth":"zq212MzEXAMPLE7o6T25Dk0i","email":"email@example.com"}}
```

다음 구문을 사용하면 여러 프라이빗 레지스트리를 구성할 수 있습니다.

```
ECS_ENGINE_AUTH_TYPE=dockercfg
ECS_ENGINE_AUTH_DATA={"repo.example-01.com":{"auth":"zq212MzEXAMPLE7o6T25Dk0i","email":"email@example-01.com"},"repo.example-02.com":{"auth":"fQ172MzEXAMPLEoF7225DU0j","email":"email@example-02.com"}}
```

**Docker 인증 형식**  
`docker` 형식은 에이전트가 인증할 때 사용하는 레지스트리 서버의 JSON 표현을 사용합니다. 여기에는 해당 레지스트리가 요구하는 인증 파라미터도 포함됩니다(예: 해당 계정의 사용자 이름, 암호, 이메일 주소). Docker Hub 계정의 경우 JSON 표현은 다음과 같습니다.

```
{
  "https://index.docker.io/v1/": {
    "username": "my_name",
    "password": "my_password",
    "email": "email@example.com"
  }
}
```

이 예제에서는 실행 시간에 Amazon ECS 컨테이너 에이전트가 로드하는 환경 변수 파일(Amazon ECS 최적화 AMI의 경우에는 `/etc/ecs/ecs.config`)에 다음 환경 변수를 추가해야 합니다. Amazon ECS 최적화 AMI를 사용하지 않고 **docker run**을 사용하여 수동으로 에이전트를 시작하는 경우 에이전트를 시작할 때 `--env-file path_to_env_file` 옵션을 통해 환경 변수 파일을 지정합니다.

```
ECS_ENGINE_AUTH_TYPE=docker
ECS_ENGINE_AUTH_DATA={"https://index.docker.io/v1/":{"username":"my_name","password":"my_password","email":"email@example.com"}}
```

다음 구문을 사용하면 여러 프라이빗 레지스트리를 구성할 수 있습니다.

```
ECS_ENGINE_AUTH_TYPE=docker
ECS_ENGINE_AUTH_DATA={"repo.example-01.com":{"username":"my_name","password":"my_password","email":"email@example-01.com"},"repo.example-02.com":{"username":"another_name","password":"another_password","email":"email@example-02.com"}}
```

## 절차
<a name="enabling-private-registry"></a>

컨테이너 인스턴스에 대한 프라이빗 레지스트리를 사용 설정하려면 다음 절차를 따르세요.

**Amazon ECS 최적화 AMI에서 프라이빗 레지스트리를 활성화하는 방법**

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

1. `/etc/ecs/ecs.config` 파일을 열고 레지스트리 및 계정으로 다음과 같이 `ECS_ENGINE_AUTH_TYPE` 및 `ECS_ENGINE_AUTH_DATA` 값을 추가합니다.

   ```
   sudo vi /etc/ecs/ecs.config
   ```

   이 예제에서는 Docker Hub 사용자 계정을 인증합니다.

   ```
   ECS_ENGINE_AUTH_TYPE=docker
   ECS_ENGINE_AUTH_DATA={"https://index.docker.io/v1/":{"username":"my_name","password":"my_password","email":"email@example.com"}}
   ```

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

   ```
   docker inspect ecs-agent | grep ECS_DATADIR
   ```

   출력:

   ```
   "ECS_DATADIR=/data",
   ```
**중요**  
이전 명령이 `ECS_DATADIR` 환경 변수를 반환하지 않으면 에이전트를 중지하기 전에 이 컨테이너 인스턴스에서 실행 중인 태스크를 모두 중지해야 합니다. `ECS_DATADIR` 환경 변수를 사용하는 새 버전의 에이전트는 해당 상태를 저장하며 태스크가 실행되는 동안 에이전트를 중지하고 시작해도 문제가 발생하지 않습니다. 자세한 정보는 [Amazon ECS 컨테이너 에이전트 업데이트](ecs-agent-update.md)을 참조하세요.

1. 다음과 같이 `ecs` 서비스를 중단합니다.

   ```
   sudo stop ecs
   ```

   출력:

   ```
   ecs stop/waiting
   ```

1. `ecs` 서비스를 다시 시작합니다.
   + Amazon ECS 최적화 Amazon Linux 2 AMI의 경우:

     ```
     sudo systemctl restart ecs
     ```
   + Amazon ECS 최적화 Amazon Linux AMI의 경우:

     ```
     sudo stop ecs && sudo start ecs
     ```

1. (선택 사항) 에이전트 내부 검사 API 태스크를 쿼리하여 에이전트가 실행 중인지 확인하고 새 컨테이너 인스턴스에 대한 일부 정보를 볼 수 있습니다. 자세한 내용은 [Amazon ECS 컨테이너 내부 검사](ecs-agent-introspection.md) 섹션을 참조하세요.

   ```
   curl http://localhost:51678/v1/metadata
   ```