on
AWS ECS Fargate 실습
AWS ECS Fargate 실습
요구사항
1. GET - /{name} 으로 요청하면 응답으로 'Hi! {name}!! Welcome to ECS Fargate!'
2. GET - /github/{github-id} 로 요청하면 응답으로 프로필 사진과 사용자 이름 반환하기.
{
status : 200,
data : {
profileImage : GITHUB_PROFILE_IMAGE_URL,
name : GITHUB_USER_NAME
}
}
2번의 요구사항은 위와 같은 json format의 데이터로 반환이 된다고 해보자.
구현의 난이도는 어렵지 않고 간단하게 만들기 위해서 DB가 필요없는 실습을 준비했다.
진행
Hello FargateAPI 코드 작성- Docker build
- ECR에 업로드
- ECS Fargate에 n분마다 실행되게 하여 결과 확인
Hello Fargate API
@RestController
public class HelloController {
@GetMapping("/{name}")
public String greeting(@PathVariable String name) {
return "Hello " + name + "!! This is aws ECS fargate!";
}
}
Docker build
ECS는 이름 그대로 ‘컨테이너 관리 서비스’이다. 따라서 우리가 만든 어플리케이션을 container화하여 배포해야 하기에 docker를 사용할 것이다. Docker에 대해서는 이전에 포스팅을 다룬적이 있다. 그러니 오늘은 실습에 더 집중하여 진행하겠다.
FROM openjdk:11-jdk
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
위와 같은 Dockerfile을 정의해줬다.
Docker build error
failed to solve with frontend dockerfile.v0: failed to read dockerfile: open /var/lib/docker/tmp/buildkit-mount208043088/Dockerfile: no such file or directory
너무 오랜만에 써서 DockerFile이라는 이름으로 파일을 생성했다가 다음과 같은 오류가 났으니 조심하도록 하자.
Dockerfile이 파일 이름이다….(f가 대문자로 되어 있어서 오류가 발생했던 것.)

docker build -t MY_DOCKER_IMAGE_NAME -f PATH_OF_DOCKERFILE

docker images
정상적으로 build가 돼서 Docker image가 만들어진 것을 볼 수 있다.

docker run -d -p OUTER_PORT:DOCKER_EXPOSED_PORT CONTAINER_ID
curl command로 확인을 하기 위해 demon으로 실행시켰다. 결과적으로 우리가 만들었던 결과대로 잘 나온 것을 볼 수 있다.
ECR upload

AWS ECR repository로 가서 새로운 repository를 만들어 주자.

적당히 이름 적어주고 private repository로 하면 설정을 더 해줘야했기에 그냥 public으로 했다. 이렇게 ECR repository를 생성만하면 그 다음은 쉽다. 그냥 하라는대로 하면 되기 때문이다.

여기에 나온 그대로 따라서 복사 붙여넣기만 한다면 쉽게 우리가 local에서 생성한 image를 업로드 할 수 있는 것이다.

잘 생성된 것을 볼 수 있다.
ECS Fargate 생성
먼저 cluster를 생성해야 한다. cluster에 대해서 알고 싶다면 이전 포스팅을 참고하면 된다.

create cluster를 클릭하자.

우리는 Fargate실습이기에 Networking Only를 선택해주자.
Task Definition
cluster를 생성하였다면, 이제 우리가 cluster위에서 ‘어떤 작업’을 할지 정의해줘야 한다.


여기서 외부 port와 docker exposed port를 명시적으로 8080:8080으로 매핑해줘야 한다.

Task Size는 그냥 최소 memory, cpu로 골랐다. 이번 포스팅에서는 요구사항 1만 하고 다음 포스팅에서 마저 다 하도록 하겠다.
Run Task
바로 Cluster 관리 페이지로 들어가서 Run Task를 클릭하여 우리가 바로 위에서 정의한 hello-fargate-task-def를 실행시켜보자.

그러나 STOPPED 가 뜨는 애석한 상황이 펼쳐지고 말았다… 모든 것은 log로 알 수 있으니깐 cloudwatch에 기록된 log event를 보도록 하자.
Cloud watch log event
exec /usr/local/openjdk-11/bin/java: exec format error
위와 같은 에러가 발생했다. 뭐가 문제인지 stackoverflow에 검색을 해봤다.
The error
Exec format errormeans we download the wrong JDK build for a specific platform.
그러니깐 나의 local환경은 mac이지만, aws fargate서버 컴퓨터 환경과 달랐기 때문에 생기는 오류라고 한다.
AWS Fargate platform
Mac m1에서 일부 이미지를 지원하지 않는다고 한다. 따라서 --platform 이라는 옵션을 추가하여 build 시에 명시해줘야 한다.
docker build --platform=linux/amd64 -t MY_DOCKER_IMAGE_NAME .
Result

정상적으로 잘 동작함을 알았다.
Next…
이 다음으로는 요구사항을 마저 만들어보도록 하겠다.