ECS에 amazonlinux2 환경을 구축할 때의 함정



소개



여러분, 정말입니다. k. s. 로저스 야스몬입니다.
이번에는 얼마 전 구축한 ECS의 amazonlinux2 환경에서 컨테이너 인스턴스가 파괴된다는 함정에 빠졌기 때문에 현상 공유와 회피 방법을 쓰고 싶습니다.

전제


  • AWS ECS에 구축
  • 이미지는 amazonlinux2를 사용합니다
  • systemctl을 사용하여 서비스를 관리하고 싶습니다

  • ECS에서 위의 전제로 httpd가 움직이는 컨테이너 만들기



    우선 로컬로 구축



    적당히 httpd가 움직이는 docker를 준비합니다
    # amazon linux
    FROM amazonlinux:2
    
    # httpd24
    RUN yum -y install httpd
    
    RUN systemctl enable httpd.service
    

    빌드 및 컨테이너 시작
    $ docker build -t test:latest ./
    
    $ docker run --privileged -d -t -p 8080:80 --name testapp test:latest /sbin/init
    

    동작 확인


    ECS에 배포



    ECR을 만들어 이전에 만든 이미지 업로드


    적절하게 클러스터 만들기


    태스크 정의 작성

    systemctl을 사용하기 위해 권한을 부여하고 명령으로 /sbin/init를 지정합니다.

    작업 시작


    동작 확인


    함정



    언뜻, 위까지 실행해 「어라? 할 수 있어?」라고 생각할지도 모릅니다만, 함정은 여기에서입니다

    ECS를 이용하는 분들은 CI를 짜서 자동으로 배포할 수 있는 구조를 만들고 자주 이미지와 컨테이너가 업데이트된다는 운용을 하고 있는 것이 대부분이라고 생각합니다.

    그렇다면 다음과 같이 동일한 구성으로 새 작업 정의를 만들고 수동으로 업데이트하십시오.
    작업을 중지합니다.


    정확히 동일한 내용으로 작업 정의를 만들고 시작합니다.


    그러면 오류가 발생하고 중지됩니다.


    오류 내용은
    CannotStartContainerError: API error (500): cgroups: cannot find cgroup mount destination: unknown 
    

    글쎄. . . cgroup을 마운트하지 못하고 오류입니다. . .

    여러가지 조사해 다음과 같은 기사를 찾아 대응하려고도 한다. . .
    htp : // bg. 아오오오 r. jp / kk s06122015 - arma / r chi s / 10167213. HTML

    원래, ECS의 인스턴스의 /sys/fs/cgroup 부하는 갓포. . .
    설명 된 sudo mkdir /sys/fs/cgroup/systemd도 권한 오류로 실행할 수 없으며 systemd를 무리하게 만들고 마운트하는 것도 불가능했습니다.

    아무래도, 특권 부여(privileged)를 true로 해 버리면 첫회 기동은 하지만, 그 후 컨테이너를 갱신했을 때에 마운트 에러가 발생해, 이후 컨테이너가 일어나지 않게 되는 것 같다・・・
    그리고 systemctl을 이용하려면 특권 부여(privileged)를 true로 해야 한다.

    특권 부여(privileged)를 true로 하지 않고, systemctl을 사용할 수 있도록 하는 방법 등 여러가지 조사해 실험해 보았지만, 이 현상을 회피하는 방법은 없을 것 같았다.

    회피 방법



    그렇다면이 함정을 어떻게 피할 것인가 하면 docker 경험자는 핀으로 올 수 있지만 foreground 고정합니다.
    또, 대부분의 경우 systemctl을 이용하고 싶은 경우는 복수의 서비스를 기동시키고 싶다고 하는 이유가 있다고 생각하므로, 이하와 같이 기술합니다.
    # amazon linux
    FROM amazonlinux:2
    
    # httpd24
    RUN yum -y install httpd php-fpm
    
    CMD /bin/bash -c "httpd && php-fpm && tail -f /dev/null"
    

    이렇게하면 systemctl을 사용하지 않으므로 권한 부여 (privileged)가 필요하지 않습니다.
    따라서 컨테이너를 다시 만들 때 cgroup 마운트 오류가 발생하지 않는다는 느낌입니다.
    보충이지만 Dockerfile에서 CMD를 지정했기 때문에 작업 정의에 지정한 명령 /sbin/init은 더 이상 필요하지 않습니다.

    마지막으로



    이번에는 ECS에 amazonlinux2를 구축했을 때 빠진 함정을 소개했습니다.
    실제로 나 자신 이 함정에 2~3일 빠져서 systemctl은 이용하지 않는다는 결론에 이르렀습니다.
    더 스마트한 해결책을 아는 분은 코멘트란에서 가르쳐 주셨으면 합니다!

    Wantedly에서도 블로그 게시



    Tech 블로그에 더해 회사 블로그 등도 하고 있으므로, 신경이 쓰이는 분은 꼭 들여다 봐 주세요.
    htps //w w. 와서 dly. 코 m / 코 m 파니에 s / ks 로즈 rs

    좋은 웹페이지 즐겨찾기