Tempo Di Valse

[AWS] ECS 에 Docker 연동하기 -5- (ECS-EFS 연동) 본문

개발/AWS

[AWS] ECS 에 Docker 연동하기 -5- (ECS-EFS 연동)

TempoDiValse 2022. 11. 22. 15:32

이전 포스팅에서는 ECS에 들어갈 이미지 VOLUME 과 연결될 EFS 서비스를 생성하는 방법에 대해 알아보았다.

 

 

[AWS] ECS 에 Docker 연동하기 -4- (EFS 생성)

이 전까지는, [AWS] ECS 에 Docker 연동하기 -3- (서비스/클러스터 생성) 저번 포스팅 에서는 ECS 환경에 로컬에서 작업했던 이미지를 띄우기 전, 기본 환경 작업인 Task 정의에 대해 포스팅을 작성해 보

tempodivalse.tistory.com

이번 포스팅은 생성한 EFS 를 ECS 서비스와 연결하고, 이미지가 띄워진 컨테이너 안에서 EFS 볼륨에 들어있는 파일들에 어떻게 접근하는 지 그 방법에 대해서 기술해보려고 한다.


1. 태스크 정의 개정

 보통 외부 스토리지를 사용하려고 할 때 "불륨을 마운트 한다"고 많이 이야기를 하는데, EFS 볼륨을 컨테이너에 마운트 하기 위해서는 이미지를 태스크 개정을 할 때부터 설정을 해주어야 한다. 단, 일반적인 콘솔을 통해 클릭하는 방식으로 이 전까지 간단하게 태스크를 만들었지만 볼륨을 마운트하기 위해서는 위자드 툴로 설정하는 것이 아닌, JSON 을 통해서 내가 사용하고자 하는 옵션을 입력하여 개정해야 한다.

 

"ECS > 태스크 정의 > 정의된 태스크 상세보기 > 상위 태스크 개정 선택 > 새 개정 생성 > JSON 을 사용하여 새 개정 생성" 절차를 밟게되면,

다양한 KV 형태의 속성값을 볼 수 있다. 대략 구조는

{
    "family": "FAMILY_NAME",
    "containerDefinition": {
    
    },
    ...
    ... etc
}

이런 식으로 되어있다. 여기에 먼저 이미지에서 사용할 EFS 의 볼륨 정보를 입력해야 한다. 입력하는 방식은 다음과 같다.

{
    "family": "FAMILY_NAME",
    "containerDefinition": {
    
    },
    // EFS 볼륨 정보 
    "volumes": [
        {
            "name": "nginx",
            "efsVolumeConfiguration": {
                "fileSystemId": "FILE_SYSTEM_ID"
                "rootDirectory": "/nginx",
                "transitEncryption": "ENABLED"
            }
        }
    ]
}

volumes 키를 이용하여 Array 형태로 EFS 의 볼륨 정보를 입력하는데, 간단하게 볼륨명과 해당 볼륨에 대한 정보를 넣어주면 된다. Array 형태이기 때문에 여러 볼륨을 넣는 것도 가능하다. 볼륨명의 경우에는 이미지 내에서 대명사 처럼 사용하는 것이기 때문에 어떤 이름을 넣을 것 인지는 신경쓰지 않아도 되고, 삽입 해야 될 곳과 맞으면 된다. 하나의 이미지에서 여러 볼륨을 바라봐야 되는 경우에는 Array 형식이기 때문에 같은 Object 형식으로 추가하면 된다.

 

위의 예시는 nginx 의 환경설정 파일을 외부 볼륨에서 관리한다는 가정으로 만들었는데, rootDirectory 는 /nginx 로 되어 있으며 EFS 와 연결된 EC2의 관점에서 본다고 하면 [ 마운트 하려고 만든 폴더 \ nginx ] 의 경로를 띄게 될 것이다. 어느 EFS 볼륨과 연결될 것 인지 fileSystemId 값을 입력해 주어야 하는 것도 잊으면 안된다. 암호화도 하는게 좋겠지.

 

다음에는 이미지의 어느 폴더에 볼륨을 마운트 시킬 것인지 명시를 해 줘야한다. 

{
    "family": "FAMILY_NAME",
    "containerDefinition": {
        ...
        ...
        // 볼륨 정보를 이미지 내의 경로 위치에 마운트 시킨다.
        "mountPoints": [
            {
                "sourceVolume": "nginx",
                "containerPath": "NGINX_CONF_PATH",
                "readOnly": true
            }
        ]
        ...
    },
    // EFS 볼륨 정보 
    "volumes": [
        {
            "name": "nginx",
            "efsVolumeConfiguration": {
                "fileSystemId": "FILE_SYSTEM_ID"
                "rootDirectory": "/nginx",
                "transitEncryption": "ENABLED"
            }
        }
    ]
}

containerDefinition 에는 컨테이너에 대한 기본적인 요소 뿐만 아니라 CPU, 포트, 볼륨, 커맨드 등의 셋팅을 할 수 있다. 이 중에서 볼륨을 마운트 시키기 위해서는 mountPoints 라는 키 값을 찾아 입력을 해야 한다. mountPoints 도 Array 형 이기 때문에 마운트해야 할 볼륨이 많은 경우에는 Object 만 알맞게 추가하면 된다. 

 

들어가는 내용에서 sourceVolume 값은 volumes 의 오브젝트에 써놓은 name 과 같은 값을 작성하였다. 그리고 containerPath 에는 구체적으로 작성하지 않았지만 NGINX 의 환경설정이 담겨져있는 PATH 에 마운트 할 예정이다. 이렇게 되면 EFS 의 /nginx 폴더는 containerPath 가 지정한 경로로 마운트가 되어 컨테이너에서는 저 경로만 바라봐도 파일이 존재하는 것으로 인식할 수 있는 것이다. readOnly 옵션의 경우에는 아직 파악은 하지 못했지만 켜둘 경우에는 컨테이너 내에서는 읽기만 가능한 파일들이 되지 않을까 싶다.

 

2. 디버깅(?)

이렇게 JSON 으로 직접 입력을 한 후에 제대로 되었는 지 확인 할 수 있는 방법이 있을까? 한다면, '커맨드' 를 이용할 수 있다. 컨테이너가 띄워지게 되면 ls -al 할 수 있또록 커맨드를 실행하면 되는데, containerDefinition 에 command 키를 가지는 Array 형식의 객체를 정의하면 된다.

command: [ "ls -al NGINX_CONF_PATH" ]

커맨드 이기 때문에 Object 형은 필요 없고, 문자열로 커맨드만 작성하게 되면 컨테이너가 실행되고서 커맨드도 실행이 된다. 그리고 출력 확인은 서비스의 로그에서 확인할 수 있다. 마운트가 잘 된 경우에는 에러 메세지 없이 디렉토리가 출력이 될 것이고, 그렇지 않으면 no such file or directory 같은 메세지가 출력이 될 것 이다. 어차피 Revision 이기 때문에 오류가 난 경우에는 다시 태스크를 정의해서 올리는 방식으로 해야 한다.

 

3. 서비스 업데이트

태스크 개정을 새로 했기 때문에 이를 서비스에 적용하기 위해서는 수동으로 설정해주어야 한다. 클러스터에 있는 서비스를 선택하여 편집을 하게 되면,

위와 같은 화면이 나오는데, 여기에서 개정만 한단계 위로 올린 후 업데이트를 누르면 서비스가 방금 전에 만든 개정된 태스크로 바뀌어서 다시 시작하게 된다.

 

4. 성공

필요 파일을 제대로 찾았고 모든 태스크에 문제가 없이 서비스 실행에 성공을 했다면, 다음과 같이 배포 및 태스크가 초록색으로 나올 것이고,

태스크의 상태도,

이런 식으로 보이게 된다.


ECS 를 간단하게 구축 하는 데에는 이 정도까지의 포스팅으로 완료를 하면 될 것 같다. 자세한 것들을 좀 더 알면 좋겠지만 AWS 전문 엔지니어가 아니기 때문에 구축하고 유지보수 하면서 하나하나 알아가야 되지 않나 싶다. 어디까지나 이 포스팅들은 흐름의 정리이기 때문에 포스팅을 읽는 사람들의 시스템에 맞게 다른 방식으로 바꿔가며 구현했으면 좋겠다.

 

그러나 ECS 포스팅이 아직 끝나지 않았다..

반응형
Comments