[AWS] ECS 컨테이너 재시작
클러스터 하나에 서비스 여러개를 돌리고 있는데, 이게 간헐적으로 뻗을 때가 있어서 1-2시간 주기로 재시작을 시켜줄 필요가 있었다.
그래서 Lambda, EventBridge를 이용해 세팅을 좀 해줬다.
Lambda 생성
Node.js로 설정한 다음에 아래와 같이 코드를 작성한다.
const aws = require('aws-sdk');
const ecs = new aws.ECS();
const CLUSTER_ARN = 'arn:aws:ecs:ap-northeast-2:...:cluster/...'; // 클러스터 ARN
exports.handler = async (event) => {
const services = (await ecs.listServices({
cluster: CLUSTER_ARN,
}).promise()).serviceArns;
const service_details = (await ecs.describeServices({
cluster: CLUSTER_ARN,
services,
}).promise()).services;
<br>
await Promise.all(service_details.map(async e=>{
await ecs.updateService({
cluster: CLUSTER_ARN,
service: e.serviceArn,
desiredCount: e.desiredCount,
forceNewDeployment: true,
}).promise()
}));
<br>
// TODO implement
const response = {
statusCode: 200,
body: JSON.stringify('Hello from Lambda!'),
};
return response;
};
지정된 클러스터의 모든 서비스를 재시작하도록 했다.
위에 cluster arn만 잘 집어넣어주면 된다.
그리고 설정할게 몇개 더 있는데
일단 제한시간을 좀 늘려주고
연결된 역할에 들어가서
ECS 접근권한을 주고

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "ecs:ListTasks",
"Resource": "*",
"Condition": {
"ArnEquals": {
"ecs:cluster": "arn:aws:ecs:ap-southeast-2:아이디:cluster/클러스터명"
}
}
}
]
}
리스트업용 권한은 직접 만들어서 넣어줘야 한다.
이대로 함수만 작동시켜도 재시작은 잘 될 것이다.
이벤트 브릿지 연동
이제 저게 자동으로 돌게 만들어보자.
이벤트브릿지 생성창에 진입해서
이름 짓고,
주기 정보를 넣어주면 된다.
나는 복잡한 조건이 필요치 않아서 2시간 주기로만 했다.
그리고 방금 만든 람다를 연결해주면 끝이다.