본문 바로가기

AWS/Docker

[AWS/Docker] AWS Copilot CLI를 사용하여 Amazon ECS 시작하기

요구 사항

시작하기 전에 다음 요구 사항이 선행되어야 합니다.

데모 앱 Clone

git clone을 사용하여 AWS에서 제공하는 간단한 데모 앱을 clone합니다.

$ git clone https://github.com/aws-samples/amazon-ecs-cli-sample-app.git demo-app

현재 디렉토리 트리는 다음과 같습니다. 도커 파일을 포함하고 있습니다.

demo-app
    ├── CODE_OF_CONDUCT.md
    ├── CONTRIBUTING.md
    ├── Dockerfile
    ├── LICENSE
    ├── README.md
    └── index.html

AWS Copilot CLI를 사용한 애플리케이션 설정 및 배포

copilot init은 Containerized 앱을 Amazon ECS에 도입하기 위해 가장 먼저 실행해야 하는 명령문입니다. 이 명령문은 도커 파일이 위치한 앱의 루트 디렉토리에서 실행됩니다.

$ copilot init

AWS Copilot은 일련의 터미널 프롬프트로써 사용자의 첫 애플리케이션 및 서비스 설정을 안내합니다. 이미 AWS Copilot을 사용하여 애플리케이션이 배포된 경우 애플리케이션 이름 목록에서 하나를 선택하라는 메시지가 출력됩니다.

What would you like to name your application? [? for help]

먼저 애플리케이션 이름을 demo로 지정합니다.

Which workload type best represents your architecture?  [Use arrows to move, type to filter, ? for more help]
> Request-Driven Web Service  (App Runner)
  Load Balanced Web Service   (Internet to ECS on Fargate)
  Backend Service             (ECS on Fargate)
  Worker Service              (Events to SQS to ECS on Fargate)
  Scheduled Job               (Scheduled event to State Machine to Fargate)

이어서 서비스 유형을 선택을 요구합니다. 키보드 화살표를 사용하여 서비스 유형을 선택 할 수 있습니다. 데모는 간단한 API로 동작하는 Flask 애플리케이션이므로 Load Balanced Web Service 항목을 선택합니다.

What do you want to name this service? [? for help]

서비스의 이름을 api로 입력합니다.

Which Dockerfile would you like to use for api?  [Use arrows to move, type to filter, ? for more help]
> ./Dockerfile
  Enter custom path for your Dockerfile
  Use an existing image instead

도커 파일을 선택합니다. copilot init 명령문이 실행된 경로에서 사용 가능한 도커 파일을 제안해줍니다. 키보드 화살표를 사용하여 적절한 도커 파일-데모 앱에서는 ./Dockerfile을 선택합니다.

Which port do you want customer traffic sent to? [? for help] (80)

포트를 정의합니다. 80을 입력하거나 디폴트(80)를 사용하기 위해 Enter를 입력합니다.

⠦ Creating the infrastructure to manage services and jobs under application demo.

이제 앱 리소스가 생성중임을 보여주는 로그가 출력됩니다. 잠시 기다린 후 리소스 생성이 완료되면 이어서 진행합니다.

Would you like to deploy a test environment? [? for help] (y/N)

앱 리소스가 생성되었다면 테스트 환경을 배포합니다. y를 입력합니다.

⠦ Linking account [AWS 계정 ID] and region [AWS 리전 코드] to application demo.

테스트 앱을 배포하는 상태 로그가 출력됩니다. 잠시 기다린 후 앱이 완전히 배포되면 다음 섹션을 이어서 진행합니다.

✔ Deployed service api.
Recommended follow-up action:
  - You can access your service at http://demo-Publi-19H1JJ6HDHZ3X-859227431.[AWS 리전 코드].elb.amazonaws.com over the internet.

애플리케이션 실행 확인

다음 명령문은 앱 상태를 확인합니다. AWS Copilot 앱을 모두 나열합니다.

$ copilot app ls

다음 명령문은 앱 환경 설정과 서비스 정보를 표시합니다.

$ copilot app show

다음 명령문은 Copilot 환경 정보를 출력합니다.

$ copilot env ls

다음 명령문은 앱의 엔드포인트, 용량 및 관련 리소스를 포함하여 서비스 정보를 표시합니다.

$ copilot svc show

다음 명령문은 앱의 모든 서비스 목록을 표시합니다.

$ copilot svc ls

다음 명령문은 배포된 서비스의 로그를 출력합니다.

$ copilot svc logs

다음 명령문은 서비스의 상태를 표시합니다.

$ copilot svc status

AWS 관리 콘솔에서 확인

AWS 관리 콘솔의 Amazon ECS에서 입장하여 실행 중인 컨테이너 인스턴스 목록을 확인 할 수 있습니다. 콘솔에서 Amzon ECS > 클러스터 > 실행 중인 클러스터 이름에 입장합니다.

작업(또는 태스크) 탭 > 실행 중인 태스크 이름을 선택합니다. 클러스터에서 실행 중인 컨테이너(이전 섹션을 따라서 진행하였다면 서비스 이름에 해당하는 api)를 확인 할 수 있습니다.

앱 설정 단계에서 서비스 유형으로 Load Balanced Web Service 항목을 선택하였습니다. AWS 관리 콘솔의 Amazon EC2에 입장합니다. EC2 대시보드 > 리소스 > 로드 밸런서에 입장합니다.

앱에 로드 밸런서가 배치되어 있습니다. 해당 로드 밸런서의 DNS로 요청을 보내면(웹 페이지에서 열면) 다음 페이지가 출력됩니다. 페이지에 출력되는 화면은 데모 앱의 index.html에 해당합니다.

demo-app/index.html

모든 리소스 삭제

테스트가 끝나면 추가 비용이 들지 않도록 모든 리소스를 삭제합니다. 이 명령문은 도커 파일이 위치한-copilot init 명령문을 실행한 동일 경로에서 실행되어야 합니다.

$ copilot app delete

앱이 실행되지 않은 경로에서 호출하면 다음과 같이 실패합니다.

$ copilot app delete
✘ could not find an application attached to this workspace, please run `app init` first