STOPSIGNAL이 이제 Amazon ECS Fargate에서 사용 가능합니다
Source: Dev.to
Fargate 이제 “STOP SIGNAL” 지원
Amazon ECS Fargate가 이제 Dockerfile에 정의된 STOPSIGNAL 명령을 컨테이너에 전달합니다.
- 공지:
- 우아한 종료 가이드:
- OCI 준수: OCI 표준을 따름으로써 Dockerfile에
STOPSIGNAL을 지정하면 Fargate, Kubernetes, 로컬 Docker에서 우아한 종료가 보장되어 이식성이 향상됩니다.
이전에는 ECS Fargate에서 우아한 종료를 구현하려면
SIGTERM을 처리하는 맞춤 로직이 필요했습니다. 미들웨어는 정지 신호를 받을 때 고정된 동작을 보이는 경우가 많습니다(예: Nginx: ).
Fargate는 AWS 고유의 관리형 호스트 OS(microVM/Firecracker) 위에서 실행되므로 저수준 신호 처리에 직접 접근하는 데 제한이 있을 수 있습니다. 더 자세한 내용이 있으면 자유롭게 공유해 주세요.
검증을 위한 소스 저장소는 다음과 같습니다:
샘플 애플리케이션
간단한 Express 서버가 사용자 정의 정지 신호 처리 방법을 보여줍니다.
// server.js
const express = require('express');
const app = express();
const PORT = process.env.PORT || 8080;
const SHUTDOWN_DELAY_MS = parseInt(process.env.SHUTDOWN_DELAY_MS, 10) || 10000;
app.get('/', (req, res) => {
res.send('Running and waiting for stop signal...');
});
const server = app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
// --- Signal Handlers ---
process.on('SIGTERM', () => {
handleShutdown('SIGTERM');
});
process.on('SIGINT', () => {
handleShutdown('SIGINT');
});
// SIGKILL cannot be caught
function handleShutdown(signal) {
console.log(`[${signal} RECEIVED] Graceful shutdown initiated.`);
// Stop accepting new connections
server.close(() => {
console.log('HTTP server closed.');
});
// Simulate cleanup work
console.log(`Starting cleanup. Waiting for ${SHUTDOWN_DELAY_MS / 1000} seconds...`);
setTimeout(() => {
console.log(`[${signal} SUCCESS] Cleanup complete. Exiting cleanly.`);
process.exit(0);
}, SHUTDOWN_DELAY_MS);
}
애플리케이션 동작 테스트
SIGINT를 수신하고 10초 동안 정리 작업을 수행합니다.- CloudWatch Logs에
[SIGINT RECEIVED]가 기록됩니다. - 검증을 위해 ECS 작업 정의의
stopTimeout을 15초로 설정했습니다. cdk deploy후(작업 재생성을 강제) 컨테이너가 예상대로SIGTERM을 수신합니다.
Dockerfile
Dockerfile에 STOPSIGNAL을 추가하기만 하면 우아한 종료에 사용되는 신호를 변경할 수 있습니다.
# Dockerfile
FROM node:22-slim
# ... other instructions ...
STOPSIGNAL SIGINT
CMD ["node", "server.js"]
배포 후 cdk deploy를 다시 실행하면 작업이 재생성되고, 컨테이너가 SIGINT를 정상적으로 잡아냅니다.
의미
이 사용자 정의 정지 신호 지원은 단순히 추가 파라미터를 넘어 AWS Fargate가 이제 OCI(Open Container Initiative) 표준을 완전히 준수한다는 것을 보여줍니다. 따라서 운영자는 다른 환경에서 사용하던 표준 이미지를 그대로 Fargate에 가져와, 환경 간에 일관된 우아한 종료 동작을 구현할 수 있습니다.