프라이빗 Docker 이미지용 Amazon ECS 컨테이너 인스턴스 구성
프라이빗 Docker 이미지용 Amazon ECS 컨테이너 인스턴스 구성
Amazon ECS 컨테이너 에이전트는 기본 인증(basic authentication)을 사용해 프라이빗 레지스트리와 인증할 수 있어요. 프라이빗 레지스트리 인증을 활성화하면 태스크 정의에서 프라이빗 Docker 이미지를 사용할 수 있어요.
출처: 문서
본문
이 기능은 EC2를 사용하는 태스크만 지원해요. 프라이빗 레지스트리 인증을 활성화하는 또 다른 방법은 AWS Secrets Manager를 사용해 프라이빗 레지스트리 자격 증명을 안전하게 저장한 다음 컨테이너 정의에서 참조하는 것이에요. 이렇게 하면 태스크가 프라이빗 리포지토리의 이미지를 사용할 수 있어요. 이 방법은 EC2 또는 Fargate를 사용하는 태스크를 모두 지원해요. 자세한 내용은 Using non-AWS container images in Amazon ECS 를 참고해 주세요.
Amazon ECS 컨테이너 에이전트는 시작할 때 두 가지 환경 변수를 찾아요.
ECS_ENGINE_AUTH_TYPE- 전송되는 인증 데이터의 유형을 지정해요.ECS_ENGINE_AUTH_DATA- 실제 인증 자격 증명을 포함해요.
Amazon ECS-optimized AMI의 Linux 변형은 컨테이너 인스턴스가 시작될 때와 서비스가 시작될 때마다(sudo start ecs 명령으로) /etc/ecs/ecs.config 파일에서 이러한 변수를 스캔해요. Amazon ECS-optimized가 아닌 AMI는 이러한 환경 변수를 파일에 저장하고 컨테이너 에이전트를 시작하는 docker run 명령에 --env-file path_to_env_file 옵션으로 전달해야 해요.
중요
Amazon EC2 user data로 인스턴스 시작 시 이러한 인증 환경 변수를 주입하거나 docker run 명령의 --env 옵션으로 전달하는 것은 권장하지 않아요. 이러한 방법은 인증 자격 증명 같은 민감한 데이터에 적합하지 않아요. 컨테이너 인스턴스에 인증 자격 증명을 안전하게 추가하는 방법은 Storing Amazon ECS container instance configuration in Amazon S3 를 참고해 주세요.
인증 형식
프라이빗 레지스트리 인증에는 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 ~/.docker/config.json | jq .auths
cat ~/.docker/config.json | jq .auths
출력:
{
"https://index.docker.io/v1/": {
"auth": "zq212MzEXAMPLE7o6T25Dk0i",
"email": "[email protected]"
}
}
앞의 예제에서 다음 환경 변수를 Amazon ECS 컨테이너 에이전트가 런타임에 로드하는 환경 변수 파일(Amazon ECS-optimized AMI의 경우 /etc/ecs/ecs.config)에 추가해야 해요. Amazon ECS-optimized 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 protected]"}}
다음 구문으로 여러 프라이빗 레지스트리를 구성할 수 있어요.
ECS_ENGINE_AUTH_TYPE=dockercfg
ECS_ENGINE_AUTH_DATA={"repo.example-01.com":{"auth":"zq212MzEXAMPLE7o6T25Dk0i","email":"[email protected]"},"repo.example-02.com":{"auth":"fQ172MzEXAMPLEoF7225DU0j","email":"[email protected]"}}
docker 인증 형식
docker 형식은 에이전트가 인증해야 하는 레지스트리 서버의 JSON 표현을 사용해요. 또한 해당 레지스트리가 요구하는 인증 파라미터(사용자 이름, 비밀번호, 계정의 이메일 주소 등)도 포함해요. Docker Hub 계정의 JSON 표현은 다음과 같아요.
{
"https://index.docker.io/v1/": {
"username": "my_name",
"password": "my_password",
"email": "[email protected]"
}
}
이 예제에서 다음 환경 변수를 Amazon ECS 컨테이너 에이전트가 런타임에 로드하는 환경 변수 파일(Amazon ECS-optimized AMI의 경우 /etc/ecs/ecs.config)에 추가해야 해요. Amazon ECS-optimized 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 protected]"}}
다음 구문으로 여러 프라이빗 레지스트리를 구성할 수 있어요.
ECS_ENGINE_AUTH_TYPE=docker
ECS_ENGINE_AUTH_DATA={"repo.example-01.com":{"username":"my_name","password":"my_password","email":"[email protected]"},"repo.example-02.com":{"username":"another_name","password":"another_password","email":"[email protected]"}}
절차 다음 절차를 사용해 컨테이너 인스턴스에 프라이빗 레지스트리를 켜 주세요.
Amazon ECS-optimized AMI에서 프라이빗 레지스트리 활성화
- SSH를 사용해 컨테이너 인스턴스에 로그인합니다.
/etc/ecs/ecs.config파일을 열고 레지스트리와 계정에 대한ECS_ENGINE_AUTH_TYPE및ECS_ENGINE_AUTH_DATA값을 추가합니다.
이 예제는 Docker Hub 사용자 계정을 인증합니다.sudo vi /etc/ecs/ecs.configECS_ENGINE_AUTH_TYPE=docker ECS_ENGINE_AUTH_DATA={"https://index.docker.io/v1/":{"username":"my_name","password":"my_password","email":"[email protected]"}}- 에이전트가 상태를 저장하는 데
ECS_DATADIR환경 변수를 사용하는지 확인합니다.
출력:docker inspect ecs-agent | grep ECS_DATADIR
중요 이전 명령이"ECS_DATADIR=/data",ECS_DATADIR환경 변수를 반환하지 않으면 에이전트를 중지하기 전에 이 컨테이너 인스턴스에서 실행 중인 태스크를 모두 중지해야 해요.ECS_DATADIR환경 변수가 있는 최신 에이전트는 상태를 저장하므로 태스크가 실행되는 동안에도 중지하고 시작할 수 있어요. 자세한 내용은 Updating the Amazon ECS container agent 를 참고해 주세요. - ecs 서비스를 중지합니다.
출력:sudo stop ecsecs stop/waiting - ecs 서비스를 다시 시작합니다.
- Amazon ECS-optimized Amazon Linux 2 AMI의 경우:
sudo systemctl restart ecs - Amazon ECS-optimized Amazon Linux AMI의 경우:
sudo stop ecs && sudo start ecs
- Amazon ECS-optimized Amazon Linux 2 AMI의 경우:
- (선택 사항) 에이전트 인트로스펙션 API 작업을 조회해 에이전트가 실행 중인지 확인하고 새 컨테이너 인스턴스에 대한 정보를 볼 수 있습니다. 자세한 내용은 Amazon ECS container introspection 을 참고해 주세요.
curl http://localhost:51678/v1/metadata