재학습/INFRA

[작성중][AWS]_Github actions로 ECS를 통해 서비스 배포하기

재이든 2023. 1. 6. 09:44
반응형

참고

https://docs.github.com/en/actions/deployment/deploying-to-your-cloud-provider/deploying-to-amazon-elastic-container-service

 

1.ECR

  • ECR은 이미지 레지스트리 서비스
  • ECR의 레포지토리는 생성된 이미지를 보관하는 역할(Like dockerhub)

* 개념

-클러스터 : 컨테이너 인스턴스(EC2)의 논리적인 그룹화

-빈 클러스터도 생성이 가능

-ECS Agent를 통해 논리적인 클러스터에 연결 됨

 

 

1-1.ECR > Repository > 레포지토리 생성

1-2. 완성된 레포지토리 클릭 > 푸시 명령어 보기 클릭

그렇다면, 

1.AWS CLI를 사용하여 인증토큰 검색 및 레지스트리에 대해 Docker 클라이언트 인증을 할 수 있는 명령어

2.도커 이미지를 빌드하는 명령어

3.이미지에 태그를 지정하여 레포지토리에 푸시하는 명령어

4.이미지를 새로 생성한 AWS 레포지토리에 푸시하는 명령어

가 주어진다.

 

1-3.첫 번째 명령어를 사용하여 Docker클라이언트를 인증하자.

이 명령어를 커맨드에 사용하기 위해서는 AWS CLI가 설치되어있어야 한다.

https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html

 

Using Amazon ECR with the AWS CLI - Amazon ECR

In some cases, you may need to reboot your instance to provide permissions for the ec2-user to access the Docker daemon. Try rebooting your instance if you see the following error: Cannot connect to the Docker daemon. Is the docker daemon running on this h

docs.aws.amazon.com

https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html

 

Installing or updating the latest version of the AWS CLI - AWS Command Line Interface

When updating from a previous version, the unzip command prompts to overwrite existing files. To skip these prompts, such as with script automation, use the -u update flag for unzip. This flag automatically updates existing files and creates new ones as ne

docs.aws.amazon.com

 

아래 커맨드를 통해 패키지를 다운로드받는다.

-o 옵션은 다운로드한 패키지가 기록되는 파일이름을 지정한다.

curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"

 

패키지파일을 소스로 지정하여 표준 macOS프로그램을 실행한다.

/usr/local/aws-cli에 설치되며

/usr/local/bin에 심볼릭링크가 자동으로 생성된다.

sudo installer -pkg ./AWSCLIV2.pkg -target /

설치완료 시 /var/log/install.log에 디버그 로그가 기록된다.

 

아래 커맨드로 설치유무를 확인 할 수 있다.

aws --version

 

도커도 다운로드

brew install docker

 

그러면

1.AWS CLI를 사용하여 인증토큰 검색 및 레지스트리에 대해 Docker 클라이언트 인증을 할 수 있는 명령어

를 실행해주자.

 

Error발생

Unable to locate credentials. You can configure credentials by running "aws configure".

Error: Cannot perform an interactive login from a non TTY device

 

=>자격증명이 안되어있다.

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-configure-quickstart.html

 

구성 기본 사항 - AWS Command Line Interface

AWS에서는 모든 수신 요청이 암호화 방식으로 서명되어야 합니다. AWS CLI에서 이 작업을 수행합니다. "서명"에는 날짜/시간 스탬프가 포함됩니다. 따라서 컴퓨터의 날짜 및 시간이 올바르게 설정

docs.aws.amazon.com

 

api configure

 

위의 명령어를 통해 아래 네 가지를 입력할 수 있다.

- 엑세스 키 ID

- 보안 엑세스 키

- AWS 리전

- 출력 형식

 

*리전은

서울이니까 ap-northeast-2 겠지?

 

또 오류

An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User:

s not authorized to perform: ecr:GetAuthorizationToken on resource: * because no identity-based policy allows the ecr:GetAuthorizationToken action

 

오류 설명

https://docs.aws.amazon.com/ko_kr/AmazonECR/latest/userguide/common-errors.html

이는 사용자에게 Amazon ECR를 사용할 권한이 부여되지 않았음을 나타내거나 해당 권한이 올바르게 설정되지 않았음을 나타냅니다. 특히, Amazon ECR 리포지토리에 대해 작업을 수행하고 있는 경우, 사용자에게 해당 리포지토리에 액세스할 수 있는 권한이 부여되었는지 확인하십시오. Amazon ECR에 대한 권한 생성 및 확인에 대한 자세한 내용은 Amazon Elastic Container Registry용 Identity and Access Management 단원을 참조하십시오.

 

Amazon Elastic Container Registry용 Identity and Access Management - Amazon ECR

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

 

아무래도 내 계정에 대해 ECR사용권한이 없는것같다... 아쓍.. 다시 Stop

 

---

권한받았다. 다시진행...

 

여튼 그럼 

aws ecr get-login-password ~ 커맨드를 작성해보니 엄청 긴 토큰같은게 나왔다.

 

그 후 docker login --username AWS~ 로 진행하는 커맨드를 작성해보니 계속해서 행이 걸렸다.

왜그런지 원인파악을 수십분..

 

그 원인은, 저 '엄청 긴 토큰같은 거' 때문이였다.

 

docker login --username AWS~ 시 --password의 파라미터로 저 토큰같은걸 넣어줘야한다.

즉, 저 토큰같은건 비밀번호이다.

그랬더니 Login Succeeded!

 

 

1-4. 두 번째 명령어를 사용하여 도커이미지를 빌드하자.

실행 후 나오는 로그

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

Docker Desktop on Mac Download가 필요하다.

다운로드받자.

https://docs.docker.com/desktop/install/mac-install/

 

Install on Mac

 

docs.docker.com

그럼 상단에 도커아이콘이 뜬다.

그 다음 도커 빌드 커맨드를 입력하면 정상실행이 된다.

 

1-5. 세 네 번째를 이용하여 태그지정 및 ECR 레포지토리로 푸시

빌드까지 진행되었다면 태그지정은 문제없이 수행된다.

그러나 ECR 레포지토리로 푸시 될 때 아래와같은 오류를 접할 수 있었다.

no basic auth credentials

 

원인

aws ecr get-login-password 명령을 사용하여 Docker에 대해 성공적으로 인증을 한 경우에도 docker push 또는 docker pull 명령을 실행하면 HTTP 403 (Forbidden) 오류 또는 no basic auth credentials 오류 메시지가 표시되는 경우가 있습니다. 다음은 이러한 문제의 알려진 원인 몇 가지입니다.

다른 리전에 대해 인증 받음

인증 요청은 특정 리전으로 묶여 있으며 그 외 리전에 사용할 수 없습니다. 예를 들어, 미국 서부(오레곤)로부터 권한 부여 토큰을 받은 경우, 미국 동부(버지니아 북부)의 리포지토리에 대해 인증 받는 데 사용할 수 없습니다. 이 문제를 해결하려면 리포지토리가 있는 리전과 동일한 리전에서 인증 토큰을 검색했는지 확인합니다. 자세한 정보는 프라이빗 레지스트리 인증을 참조하십시오.

권한이 없는 리포지토리로 푸시하도록 인증했습니다.

리포지토리로 푸시하는 데 필요한 권한이 없습니다. 자세한 정보는 프라이빗 리포지토리 정책을 참조하십시오.

토큰이 만료됨

GetAuthorizationToken 작업을 사용하여 받은 토큰의 기본 권한 부여 토큰 만료 기간은 12시간입니다.

wincred 자격 증명 관리자의 버그

Windows용 Docker의 일부 버전에서는 wincred라는 자격 증명 관리자를 사용하는데, 이는 aws ecr get-login-password에서 생성하는 Docker 로그인 명령을 올바르게 처리하지 않습니다(자세한 내용은 https://github.com/docker/docker/issues/22910 참조). 출력인 Docker 로그인 명령을 실행할 수 있지만, 이미지를 푸시하거나 가져오려고 시도하면 해당 명령이 실패합니다. 이 버그는 aws ecr get-login-password의 출력인 Docker 로그인 명령에서 레지스트리 인수의 https:// 스키마를 제거하면 해결할 수 있습니다. HTTPS 스키마가 없는 예제 Docker 로그인 명령은 아래와 같습니다.

docker login -u AWS -p <password> <aws_account_id>.dkr.ecr.<region>.amazonaws.com

https://docs.aws.amazon.com/ko_kr/AmazonECR/latest/userguide/common-errors-docker.html#error-403

 

Amazon ECR 사용 시 Docker 명령을 실행하면 발생하는 오류 문제 해결 - Amazon ECR

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

 

어떤것에도 해당사항이 없다.

리전은 서울로 동일하고, 토큰은 아직 12시간이 지나지않았다. 그리고 Windows환경이아니라 Mac환경이다..

아.. 왜..

 

결과

ecr pus관련 권한이없던게 맞다.

해당권한을 가져야 수행 가능.

 

결과적으로 커맨드를 모두 수행하였고

이미지를 성공적으로 올릴 수 있었다.

 

 

 


2-1.ECS > 클러스터 > 클러스터 생성

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/getting-started-fargate.html

 

Getting started with the new console using Linux containers on AWS Fargate - Amazon Elastic Container Service

Getting started with the new console using Linux containers on AWS Fargate Amazon Elastic Container Service (Amazon ECS) is a highly scalable, fast, container management service that makes it easy to run, stop, and manage your containers. You can host your

docs.aws.amazon.com

2-2.ECS > 클러스터 > 작업정의 > 새 작업정의 생성

*작업

- 컨테이너를 실행하는 최소 단위

- 컨테이너와 작업은 1:N 관계

- 여러 컨테이너를 하나로 묶어서 실행

- Docker-compose와 비슷한 녀석

 

*작업정의

- 작업 실행 시 필요한 옵션 설정이 가능

- 생성 또는 업데이트된 Task Definitions는 Revision Version이 기록된다 (Roll-back 용이)

 

*Task를 실행하는 방법

- 직접 Task Definitions를 이용한 실행

- Service를 이용한 실행

 

*Service

- TaskDefinitions를 이용하여 Task실행 유형(EC2 or Fargate), 타입, 작업개수, 배포방식, 전략, 오토스케일링설정 등 을 설정하여 실행

- Task를 관리하는 상위 그룹 개념

- EC2, Fargate 두 가지 Task 실행유형을 제공

- 타입이란?

복제(Replica), 데몬 두 가지를 제공.

복제는 서비스에 정의된 작업 개수 및 옽토스케일 설정에 따라 클러스터 인스턴스에 Task가 복제되어 실행

데몬은 클러스터 내의 모든 ECS인스턴스에 무조건 하나씩 실행

 

Task 실행유형

- Fargate선택 시 Task Definitions 작성 시 호환성 여부 항목에 Fargate가 선택되어 있어야 함

- Fargete선택 시 클러스터에 인스턴스가 없어도, Task에 정의한대로 Serverless하게 서비스 수행 가능

 

작업정의 명세를 작성하고

컨테이너를 추가한다.

 

2-3.ECS > 클러스터 > 작업정의 > 새 작업정의 생성 > 컨테이너 추가

이미지 URL은 ECR에 생성된 레포지토리의 URL을 붙여주면된다

필자는 URL:latest로 설정했다.

컨테이너 생성

 

2-4. 그리고 작업정의 생성

 

하면 작업정의 생성중 0/2.. 에 멈추거나

작업정의를 생성하지못한다.

 

이건 또 뭐시여

 

또 권한이여? 

 

또 권한이였다.

 

작업크기를 설정하고

컨테이너를 추가하여 ECR에 올린 이미지를 등록 후 CPU도 256으로 설정한다.

 

아.. 그리고 AWS콘솔을 이용하여 생성을 시도하고 실패한다고 가정하자

오류 로그 확인이 불가다.

그냥 실패. 또는 진행이안가는상태로 가만히 있는다.

뭐어쩌라는거??

 

AWS CLI를 사용하면 오류로그를 확인할 수 있다고 한다.

여튼 나는 권한문제만 있었나보다. 문제없이 생성완료

 

2-4.ECS > 클러스터 > 서비스 > 서비스생성

서비스를 생성하주고, 서비스에 작업도 등록해준다.

 

그러면 결과적으로

1.클러스터가 생성되었으며

2.클러스터안에는 서비스가있고

3.서비스에는 작업이 등록되어있다.

 

그럼 이제야 GithubActions로 CI/CD를 처리할 준비가 되는것

 

3-1.GithubActions main.yml작성

Github > Repository >  { Target Repo } > Actions > setup

main.yml작성

 

1.액션을 받을 브랜치와 액션을 설정

2.체크아웃 > AWS접속 > ECR 도커 로그인 > 여기서 ECR에서 봤던 푸시명령어들 수행

3-0. task.json에 작업정의내용을 json화시킨다.

3.

 

3-2.REpo > Settings > Secrets and Variables > Actions

중요한 내용은 ENV처리한다

 

 

3-3.Commit & Push -> Buld & Deploy작업 수행

 

3-4.배포가 완료되면 이제 테스트해보자.

 

반응형

'재학습 > INFRA' 카테고리의 다른 글

[AWS]_Jenkins_어떤유형의 AWS서버를 선택할까?  (0) 2023.01.04
AWS환경에 Docker설치  (0) 2022.10.12
[CLOUD] 클라우드 서비스란?  (0) 2021.11.26