오늘 배운 것

오늘 오후까지 이어지던 SZ-85 작업은 계속 길어질 것 같아서 드래그앤 드롭 구현에 이상이 없는 정도에서 잠시 머지하고, 나는 그 동안 미뤄왔던 또 다른 급한 이슈를 처리하려고 했다. 

 

바로 github action, ECR, ECS를 통해 깃허브의 메인 브랜치의 코드를 도커 이미지로 빌드해서 ECR에 업로드하고, ECS를 통해 ECR에 업로드된 도커 이미지를 실행하는 일을 했다. 

 

사실 ECR로 이미지를 업로드하는 일까지는 순탄했고, 그 이후에 ECS의 클러스터를 설정하고, fargate와 EC2 중에서 나름 고민해서 선택을 했다. fargate는 서버리스로, 좀 더 간단한 설정을 할 수 있다는 장점이 있는 반면 EC2는 설정을 커스텀해야 하는 부분이 있지만 비용 측면에서 좋다고 했다. 그러다 문득 팀원이 멘토님께서 EC2 인스턴스를 그냥 쓰지 말고 EC2 스팟 요청을 통해 더 저렴하게 사용하라고 했던 것 같다고 말해줘서, 아 그러면 어차피 EC2 스팟 인스턴스를 써야 하는 거니 EC2를 써야 하겠다는 생각이 들어 EC2 인스턴스를 선택했다. 

 

그래서 EC2를 선택했는데 클러스터에 할당된 EC2 인스턴스가 없다는 말을 듣고 EC2 스팟 요청을 해야하나 말아야하나 하다가 클러스터 설정에서 '서비스 추가' 대신에 '태스크 추가'를 발견해서 그걸 눌러보았더니 참고하던 블로그와 똑같은 UI가 떴다. 

 

그래서 태스크 추가에서도 여러 설정을 하는데, '네트워크 모드'라는 옵션이 있었다. 옆의 설명을 읽어보니 태스크에서 ECS가 실행시키는 컨테이너가 어떤 네트워크 설정을 가질지를 결정하는 것 같았다. 기본값은 awsvpr로 되어있었는데 이건 fargate에서 필요한 설정이라고 되어 있어서 내가 선택한 EC2에 해당하는 옵션은 아닌 것 같았다. 그래서 docker network ls 명령어를 치면 기본값으로 항상 보이던 bridge 네트워크가 떠올라서 bridge를 선택했다. 예상해보건대 bridge 옵션을 선택하고, 만약 여러 컨테이너를 같이 사용해야 한다면 그때 그 컨테이너들을 같은 네트워크상에 위치시키면 되는 게 아닌가 싶다. (만약 그게 아니라면 설정을 바꾸면 되니, 큰 문제는 아니다.) 

 

그리고 이렇게 환경 변수를 따로 설정하는 부분도 있었는데, 나는 이미 AWS secrets manager에서 환경 변수를 설정해주었어서 이걸 사용한다면 언제 사용해야 하는지도 궁금했다. 

 

그런데 ECS에서 EC2 옵션을 선택하니 사용 가능한 인스턴스가 없다고 떴다. 그래서 GPT의 도움을 받아 원인을 찾아보니 EC2 인스턴스에 접속해서 별도로 ECS에 연결하는 설정을 해 주어야 하는 것으로 보였다. 그래서 그 작업을 한 다음, EC2 옵션에서 다시 ECS에 연결한 인스턴스가 뜨는 것을 확인한 다음에 다음 작업으로 넘어갈 수 있을 것 같았다. 

 

EC2 (스팟) 인스턴스를 생성할 때, User Data 섹션에 이 텍스트를 붙여넣어야 하는 것 같다. 환경변수 설정을 해 주는 것이라고 생각했다. 

echo ECS_CLUSTER=onestep-production4 >> /etc/ecs/ecs.config

 

그렇게 스팟 인스턴스를 실행시키고 퍼블릭 DNS 주소를 확인해서 EC2 서버에 접속하려고 하니, 퍼블릭 DNS 주소가 없었고 프라이빗 DNS 주소만 있었다. 원래 이런건지는 모르겠다. 그래서 탄력적 IP(elastic IP) 주소를 하나 생성하고, 이를 생성한 스팟 인스턴스에 할당했다. 다시 확인해 보니 스팟 인스턴스에 퍼블릭 DNS 주소가 잘 나왔다. 

 

그리고 종종 까먹지만 처음에 ssh로 접속을 시도할 때 실패하는데, 보안 그룹에서 TCP 통신을 허용하고 22번 포트를 열어주면 무사히 접속이 된다. 그 이유는 ssh로 통신할 때 TCP 프로토콜을 쓰고 22번 포트를 통하기 때문이다. 


그런데 ECS에서 태스크를 정의하고, 서비스나 태스크를 만들 때마다 항상 클러스터에서 실행 가능한 EC2 인스턴스가 없다는 문구가 계속 떴다. 심지어 관련 유튜브 영상을 참고했는데도, 해당 영상에서는 ECS 클러스터를 만들면서 자동으로 EC2 인스턴스를 생성했는데, 내가 했을 때는 그렇게 되지가 않아서 뭔가 놓친 것이 있다는 생각이 들었다. 

 

그래서 GPT에게 도움을 요청하니, IAM 권한을 생성하라고 말해주어서 AmazonEC2ContainerServiceforEC2Role라는 권한을 생성했다. 정확히 무슨 역할인지는 모르지만, EC2 컨테이너를 다른 AWS 서비스에서도 생성할 수 있도록 하는 역할일 것으로 추측했다. 찾아보니 AWS 내부의 여러 서비스들을 같이 사용할 때, 가령 서비스A에서 서비스B에 접근해야 하는 경우, IAM에서 그 작업을 실행할 수 있도록 역할을 생성해줘야 하는 것 같았다. 

 

 궁금한 점

1. 탄력적 IP 주소의 용도는 무엇일까

2. 왜 처음에 스팟 인스턴스를 생성하면 퍼블릭 DNS 주소는 기본적으로 할당되지 않고 별도로 할당해 주어야 하는 것일까 -> 찾아보니 추가 설정에서는 '퍼블릭 주소 할당'이 있다! 불필요하게 퍼블릭 주소(리소스)를 할당하지 않고, 사용자가 원할 때 할당하도록 한 것 같다. 

3. sudo yum과 sudo apt-get 이라는 명령어를 많이 보는데 이 명령어들의 구체적인 뜻은 무엇일까

4. Amazon EBS는 무엇인가

5. IAM 서비스는 무엇을 위해서, 왜 필요한가 b/c 종종 IAM 계정이나 권한을 생성하라는 말을 많이 들어서 궁금하다. 

 

 

'개발 일기장 > SWM Onestep' 카테고리의 다른 글

20240728 TIL  (2) 2024.07.28
20240727 TIL: ECR ECS 적용기  (0) 2024.07.27
20240725 TIL  (0) 2024.07.25
20240724 TIL  (0) 2024.07.24
20240723 TIL  (2) 2024.07.23

+ Recent posts