본문 바로가기

개발노트/LINUX

(45)
AWS ECS 로 blue/green 배포 시 겪은 troubleshooting 기록 배경 그동안 EC2 ASG 로 서버 애플리케이션을 실행하는 환경에서 ECS 로 이전을 해야할 필요가 생겼다. 그동안 처음부터 ECS 로 구축하거나 기존에 EC2 ASG 로 운영하던 서비스를 ECS 로 이전해본 경험이 많이 있었는데 유독 이번에 이전 작업을 할 때 문제를 겪은 순간이 많이 있어서 기억을 되짚어가며 기록으로 남겨보려고 한다. 들어가기 전에 ECS Fargate 가 아닌 ECS on EC2 를 사용하고 있다. ECS 의 capacity provider 는 두 종류의 architecture(amd, arm)를 지원하기 위해 두 개가 구성돼있다. ECS cluster 용 EC2 instance 에는 ecs agent 의 설정에 `ECS_CONTAINER_STOP_TIMEOUT=35m` 가 있는 상..
AWS SSM > session manager 를 이용하여 EC2 접속하기 부제 SSH key 없이, AWS Access Key 로 원격에서 EC2 의 shell 을 실행하기 예상 효과 & 목적 EC2 접속을 위한 SSH Key 관리를 하지 않아도 되게 함으로써 개발자 생산성 향상 새로운 팀원에게 SSH Key 를 발급해주거나, 기존 Key 를 전달하는 과정 등에서 보안 취약점이 생길 수 있음 또한 SSH Key 관리를 한다는 것 자체가 개발자/인프라 담당자의 생산성을 저하시키는 업무가 될 수 있음 Bastion 서버를 따로 운영하지 않아도 됨 같은 망이 아닌, 원격에서도 Private Subnet 에 있는 EC2 에 바로 접속할 수 있어서 개발자 생산성 향상시킬 수 있음 SSH 접속 기록을 CloudWatch 또는 S3 에 log 를 남기는 것을 통해 보안 감사 capabil..
cloudflare free plan 을 이용한 DDNS 설정 들어가며, 내 집에는 라즈베리 파이가 있다. 여러가지 목적으로 잘 활용하고 있는데, 그 중에서 WOL 실행기로써 사용하고 있는 것이 매우 편리하다. 바깥에 나가있을 때 언제 어디서든 집에 있는 컴퓨터를 켜고 각종 필요한 관공서/민원 서류를 발급받아 내가 있는 곳으로 전송을 해야하거나, 컴맹인 가족이 뭘 해달라고 하면 대신 해줘야 하는 일들이 종종 있기 때문이다. 원래는 WOL 기능이 지원되는 iptime 의 공유기를 썼었는데, 이사온 집에서는 Wifi mesh 때문에 통신사에서 빌려주는 공유기를 쓰고 있다. 따로 Wifi mesh 를 구성할 수도 있었지만 굳이 비용을 들이지 않고 통신사에서 빌려주는 공유기를 쓰면 쉽게 설정 가능했기에 그렇게 쓰고 있다. 그러나 통신사에서 주는 공유기는 WOL 기능이 없다..
Docker - no space left on device 대응 방법 AWS ECS 로 서버를 운영하고 있는데, ECS Fargate 가 아니라 ECS on EC2 로 운영을 하다 보면 EC2 에 대한 관리도 개발자/인프라 관리자가 책임을 갖게 된다. ECS on EC2 로 운영하고 있는 상황에서 새로운 ECS task 를 띄우려고 할 때 가끔씩 CannotPullContainerError: failed to register layer. ... no space left on device 와 같이 오류가 발생하며 task 가 실행되지 않는 이슈가 생길 수 있다. 이는 EC2 의 용량이 꽉 차서 생기는 문제일 확률이 매우 높으며, 아래와 같이 해결할 수 있다. 1. 주기적으로 docker prune 을 한다. - EC2 를 launch 하는 데 사용되는 LaunchTempla..
AWS private API Gateway 뒤에서 springdoc swagger 접근 path 관련 troubleshooting 몰랐던 점 1. private API Gateway 는 custom domain name 으로 API Mapping 연결하여 사용할 수 없다. 더 앞단에 custom domain name 으로 연결할 LB 와 TargetGroup 을 둬서 연결하는 workaround 가 있기는 하다만, 불필요하게 LB, TargetGroup 이 필요하다고 느껴졌고, 구현한 API 들의 경로는 문제가 없는데 단순히 springdoc swagger openapi 문서 제공을 위해 그런 인프라 구성을 하는 것이 매우 over engineering 이라고 생각했다. 2. spring boot + springdoc 에서 application properties 로 path, url 등을 설정할 수 있는데 해당 설정을 하면 어떻게..
testcontainers 사용 시, No such container 오류 메시지와 함께 test 가 실패한다면(feat. ARM) Java Application 또는 Spring 을 사용하는 Application 에서 테스트 코드에 testcontainers 를 사용하고 있다. 개발 환경은 M1 Mac 이고, 배포 타겟도 AWS 의 graviton EC2 위에 올리는 Elastic Container Service 이다. M1 Mac 으로 개발하기 전에는 Intel Mac 으로 개발을 했었고, 그 때에도 testcontainers 를 사용하여 테스틐 코드를 작성하며 개발했던 프로젝트가 있었다. public dockerhub 에의 접근은 limit 이 걸려있으므로, 이를 우회하기 위해 dockerhub 으로 pull 받은 이미지를 그대로 private AWS ECR 에 올려놓고 사용하고 있었다. testcontainers 를 사용하면 ..
jib 로 java application docker build 후 발생하는 docker logs exec user process caused exec format error 라는 에러 spring boot 로 새로운 서버 하나를 ECS on EC2 로 배포하고 있는데, jib 로 build 한 image 로 애플리케이션이 정상적으로 뜨지 않아 디버깅하던 중 docker logs 명령어의 결과가 `docker logs exec user process caused exec format error` 로 나왔다. 저 메시지는 주로 스크립트에 shebang 을 설정하지 않아서 어떤 환경으로 스크립트를 실행해야할 지 모를 때 발생하는 것으로 알고 있었는데, jib 에서 이런 문제를 만들었을 거라는 생각은 들지 않아 좀 더 찾아보았다. 결국은 jib 가 기본적으로는 amd architecture 에서 실행이 가능한 image 로 빌드를 하도록 돼있었고, 나는 build.gradle 에서 별도로 j..
redis-cli 로 non-expiring key 찾아내기 (ttl 없는 key 찾기) redis-cli -h $READONLY_REDIS_NODE -n 2 --scan --pattern "pattern*" | while read LINE ; do TTL=`redis-cli -h $READONLY_REDIS_NODE ttl "$LINE"`; if [ $TTL -eq -1 ]; then echo "$LINE" >> /home/ec2-user/non-expiring-keys.out; fi; done; # -n 옵션은 database 선택 (select) https://stackoverflow.com/a/56265879/7548600 참고

반응형