AWS의 서비스인 ECS에서 인스턴스 유형으로 EC2 시작유형과 Fargate를 각각 사용해 웹 APP을 배포해 보도록 하겠습니다.
*리전은 버지니아 북부(us-east-1)을 기준으로 합니다.
1. Cloudformation으로 VPC등 스택 배포하기
파일을 다운 받습니다.
기존 템플릿 선택, 템플릿 파일 업로드 > 다운받은 파일 업로드
이름은 ecs-workshop
3단계 스택 옵션 구성은 건너뜁니다.
그렇게 생성을 누르고 기다려줍니다.
CREATE_IN_PROGRESS에서 CREATE_COMPLETE가 될 때까지 기다립니다.
VPC 콘솔로 들어가서 VPC가 잘 생성되었는지 확인하시면 완료입니다.
2. EC2 상에 VScode IDE 환경 구축
준비된 yaml 파일을 이용해 Cloudformation을 이용해 퍼블릭 서브넷의 EC2 인스턴스에 도커 파일을 빌드할 수 있도록 IDE를 구축합니다.
스택 생성 > 새 리소스 사용(표준) 클릭
아래 파일을 다운받습니다.
기존 템플릿 선택 > 템플릿 파일 업로드 > yaml 파일 업로드
다운받은 yaml 파일을 업로드 합니다.
스택 이름은 vscodeserver
VPCId는 생성된 ECSWorkShopVPC
subnetId는 PublicSubnet1으로 지정합니다.
이름은 VSCode-Server
패스워드는 입장시 입력해야 접속할 수 있으므로 본인이 원하는 문자로 지정합니다. 저는 Password123!으로 하겠습니다.
그리고 Access Control은 EC2의 인바운드 규칙 같은 역할을 하는데 접속할 수 있는 IP에 제한을 둡니다. 자신의 IP를 지정해서 본인만 접속할 수 있도록 지정할 수도 있지만 저는 실습이니 전체 접속 허용(0.0.0.0/0)으로 하겠습니다.
3, 4단계를 건너뛰고 생성을 클릭합니다.
CREATE_COMPLETE가 될 때까지 기다립니다.
생성된 스택의 출력을 누르고 값에 나온 주소로 접속합니다.
생성시 입력한 비밀번호가 너무 짧으면 (ex. 0000) 접속이 거부될 수도 있습니다.
I understand 클릭
아래 새로운 터미널 창 생성
콘솔 EC2에 들어가시면 인스턴스가 생성되어 있는데 EC2 인스턴스의 ID를 기억해둡시다.
AWS Cloudshell 생성
그리고 다음 명령어 들을 입력해줍니다.
aws configure
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]: us-east-1
Default output format [None]: json
CloudShell에 입력해줍니다.
# EC2가 권한 수임할 수 있는 role 생서
aws iam create-role --role-name AdminRole --assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"ec2.amazonaws.com"},"Action":"sts:AssumeRole"}]}'
# 생성된 role에 권한 부여(AdministratorAccess)
aws iam attach-role-policy --role-name AdminRole --policy-arn arn:aws:iam::aws:policy/AdministratorAccess
# EC2에 연결할 수 있는 instance profile 생성
aws iam create-instance-profile --instance-profile-name AdminInstanceProfile
# instance profile과 role 연결
aws iam add-role-to-instance-profile --instance-profile-name AdminInstanceProfile --role-name AdminRole
# EC2 인스턴스에 instance profile을 연결
aws ec2 associate-iam-instance-profile --instance-id <방금 저장한 인스턴스ID입력> --iam-instance-profile Name=AdminInstanceProfile
# 확인
aws sts get-caller-identity
이제 VScode server 화면으로 돌아가서 터미널 창에 다음 명령어 들을 입력합니다.
사용할 코드 다운로드
git clone https://github.com/solminkim/ecs-cats-dogs
결과 확인
ls -l ~/ecs-cats-dogs
CLI 도구들 설치 및 업데이트
sudo pip install --upgrade awscli
sudo yum install -y jq
현재 리전(us-east-1)을 기본값으로 설정
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
export AWS_REGION=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/placement/region)
echo "export AWS_REGION=${AWS_REGION}" | tee -a ~/.bash_profile
aws configure set default.region ${AWS_REGION}
현재 ID를 환경 변수로 등록
export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)
echo "export AWS_ACCOUNT_ID=${AWS_ACCOUNT_ID}" | tee -a ~/.bash_profile
vscode에서 open folder 누르고 /home/ec2-user/ecs-cats-dogs 폴더로 이동
이제 환경설정이 모두 끝났습니다.
3. Amazon ECR 생성 및 도커 이미지 푸시
프라이빗 레포지토리 생성
이름 cats
같은 방식으로 dogs와 web도 생성해줍니다.
이제 vscode 창으로 돌아가서 아래의 명령어를 입력해 이미지를 빌드해줍니다.
docker build -t cats ~/ecs-cats-dogs/cats/
docker build -t dogs ~/ecs-cats-dogs/dogs/
docker build -t web ~/ecs-cats-dogs/web/
순서대로 cats, dogs, web 이미지를 빌드하는데 cats는 좀 오래 걸리지만 설정파일이 같은 dogs, web은 캐시파일을 사용하기 때문에 조금 더 빨리 빌드됩니다.
이제 cats 리포지토리를 클릭하고 이미지를 푸시해줄겁니다. "푸시 명령 보기"를 클릭합니다.
3번은 이미 진행했으니 1, 2, 4번을 vscode server 브라우저에 있는 터미널 창에 입력해줍니다.
1번은 로그인하는 명령어이니 이 다음 web, dogs에서는 생략해주어 됩니다.
레포지토리 3개에 이미지가 모두 푸시되었으면 성공입니다.
4. ECS 클러스터 생성
1) Application Load Balancer, ECS 클러스터 보안 그룹 만들기
VPC 콘솔로 들어가서 보안 그룹 생성을 클릭합니다.
이름은 ALB-SG, VPC는 ECSWorkshopVPC로 선택합니다.
인바운드 규칙 추가를 누르고 유형은 HTTP, 소스는 Anywhere-IPv4로 지정합니다.
태그도 지정해줍니다.
같은 방식으로 ECS 클러스터의 보안 그룹도 생성합니다. 이름은 ECS-ASG-SG, VPC는 ECSWorkshopVPC로 지정합니다.
유형은 모든 TCP, 소스 유형은 사용자 지정으로 하고 ALB-SG를 선택합니다.
ALB에서 오는 트래픽만 ECS 클러스터가 받도록 하는 설정입니다.
2) ECS 클러스터 생성
콘솔에서 ECS 클러스터 생성을 클릭합니다.
이름은 ECS-Workshop으로 합니다.
인프라는 Fargate와 EC2 인스턴스를 모두 선택합니다.
커널은 Amazon Linux 2
인스턴스 유형은 m5.large
원하는 용량은 최소 2, 최대 2
루트 EBS 볼륨 크기는 100으로 지정합니다.
VPC는 ECSWorkshopVPC, 서브넷은 PrivateSubnet1, 2를 선택합니다(ECS 클러스터는 프라이빗 서브넷에서 서비스 됩니다) 기존 보안 그룹 선택을 누르고 ECS-ASG-SG을 선택합니다.
모니터링 Container Insights 사용을 클릭합니다.
그리고 생성을 눌러 클러스터를 생성합니다.
만일 생성이 안되는 경우 CloudFormation에서 보기를 눌러 재시도를 눌러주세요.
3) ECS 작업 정의
새 태스크 정의 생성 클릭
1) web 작업 정의 생성
이름은 webdef
시작 유형을 EC2 인스턴스로 지정하고 네트워크 모드는 bridge로 지정합니다. CPU는 0.5, 메모리는 1 GB, 태스크 실행 역할은 새 역할 생성
이름은 web, 이미지 uri는 web 리포지토리에 있는 이미지 uri를 복사합니다. 필수 컨테이너 예, 호스트 포트는 0으로 지정해 포트 없이 동적 포트로 지정하고 컨테이너 포트는 80, 프로토콜은 TCP, 포트 이름은 web-80-tcp, 앱 프로토콜은 HTTP로 해서 컨테이너 내부 통신은 http로 지정합니다.
구조를 사진으로 표현하면 다음과 같습니다.
컨테이너는 자신들만의 가상 네트워크를 사용하여 통신하고 인스턴스에서는 네트워크 브릿지를 이용하여 통신합니다.
로깅 옵션을 설정하는데 awslogs-gruop: /ecs/webdef, awslogs-region: us-east-1, awslogs-stream-prefix: ecs, awslogs-create-group: true로 설정해줍니다.
이렇게 하면 webdef 태스크 정의가 생성되었습니다. 이대로 cats와 dogs도 만들어줍니다.
2) cats 작업 정의 생성
앞서 web과의 차이점은 태스크 실행 역할이 새로운 태스크 생성이 아닌 web을 만들때 생성된 ecsTaskExecutionRole을 사용한다는 점입니다.
컨테이너 이름은 cats, 포트 이름은 cats-80-tcp 이외에는 web과 동일합니다.
이미지 uri는 cats 레포지토리의 uri가 아닌 이미지의 uri를 사용하셔야 합니다.
cloudwatch 로그 수집도 /ecs/catsdef로 바뀌고 나머지 값은 동일합니다.
3) dog 작업정의 생성
이름은 dogsdef
여기서 조금 다릅니다. 시작 유형을 EC2 인스턴스가 아닌 Fargate로 지정합니다.
그러면 네트워크 모드가 awsvpc로 고정됩니다. fargate는 완전관리형 서비스이기 때문입니다.
나머지는 cats와 같습니다.
이름은 dogs, 이미지 uri는 dog 이미지의 uri, 포트매핑은 cats와 같습니다.
로그 수집도 기본값으로 설정해 주시면 됩니다.
4) IAM 역할 수정
콘솔 IAM으로 접속해 맨 처음 web 작업 정의를 만들 때 생성된 ecsTaskExecutionRole을 클릭하고 권한에서 AmazonECSTaskExecutionRolePolicy을 클릭해 정책 연결을 클릭합니다.
CloudwatchFullAccess를 입력하고 정책을 클릭 후 권한 추가를 눌러줍니다.
이제 ECS 작업 정의는 cloudwatch에 완전 접근 권한을 얻게되었습니다.
5. ECS 서비스 배포하기
1) ALB 생성
콘솔 EC2 > 로드 밸런서 > 로드 밸런서 생성 > ALB 생성 클릭
이름 demego-alb를 입력하고 기본값으로 유지합니다.
네트워크 매핑에서 VPC는 ECSWorkshopVPC를 선택하고 가용 영역은 publicsubnet1, 2를 선택합니다.
기존에 만들어두었던 ALB-SG로 보안그룹을 선택합니다.
대상 그룹 생성 클릭
대상 그룹의 이름은 web
VPC는 ECSWorkshopVPC를 선택합니다.
2단계 대상 등록은 건너뛰고 생성하기를 클릭합니다.
web 대상 그룹을 선택하고 아래로 내려 로드 밸런서 생성을 클릭합니다.
2) Web 서비스 생성
ECS로 돌아가서 클러스에서 ECS-Workshop을 클릭하고 서비스 생성을 클릭합니다.
web 서비스를 만들것이기 때문에 시작 유형은 EC2로 설정합니다.
패밀리는 webdef, 서비스 이름은 web, 태스크 수는 2로 합니다.
여기서 패밀리가 앞에서 만들었던 ECS 작업 정의를 의미합니다.
리스너는 ALB를 만들 때 기존 리스너 사용 web을 선택하고
대상 그룹도 web 대상그룹을 선택합니다.
이제 생성을 누릅니다.
3) Cats 서비스 생성
cats도 EC2 시작 유형입니다.
작업 정의는 catsdef를 선택하고 이름은 cats입니다.
리스너 지정까지는 web이랑 같습니다.
대상 그룹은 새 대상 그룹 생성을 해줍니다. 대상 그룹 이름은 cats
경로 상태는 /cats* 상태 확인 경로는 /cats/로 지정합니다.
평가 순서는 지정해주셔야 하는데 1로 합니다. 1이면 가장 먼저 평가합니다.
4) Dogs 서비스 생성
dogs는 시작 유형을 FARGATE로 지정합니다.
배포 구성은 비슷합니다. 작업 정의는 dogsdef를 선택하고 서비스 이름은 dogs, 원하는 태스크 수는 2로 지정합니다.
FARGATE로 설정하면 네트워킹을 설정해 주어야 합니다. VPC는 기존것을 사용하고 서브넷은 PrivateSubnet 1, 2를 사용하고 보안 그룹은 ECS-ASG-SG으로 지정합니다.
그리고 퍼블릭 IP는 꺼짐으로 지정합니다.
기존 로드 밸런서 사용을 클릭하고 demogo-alb 체크
리스너도 기존 리스너 사용으로합니다.
대상 그룹은 새 대상 그룹 생성을 누르고 평가 순서는 2 이름은 dogs 상태 확인 경로는 /dogs/로 합니다.
무사히 6개의 태스크가 생성되었습니다.
대상 그룹도 3개가 되었습니다.
Status가 활성으로 바뀌었으면 이제 ALB로 돌아갑니다.
6. 확인
I ❤️ CATS를 누르면 고양이 사진이 랜덤으로 출력되고, I ❤️ DOGS를 누르면 강아지 사진이 랜덤으로 출력됩니다.
7. 리소스 정리
다른 리소스 보다 instance-profile은 명령어로 지워주세요. 그리고 IAM으로 가서 ECSTaskRole과 EC2instanceRole을 수동으로 제거해주세요
'[Cloud] > [AWS]' 카테고리의 다른 글
[AWS] Glue to Redshift 데이터 옮기기 (0) | 2024.09.24 |
---|---|
[AWS] iam instance profile 확인 명령어 (0) | 2024.09.08 |
[AWS] SNS와 Cloudwatch를 이용한 모니터링과 오토스케일링 (0) | 2024.09.07 |
[AWS] 서버리스 3-tier 어플리케이션 (1) | 2024.09.04 |
[AWS] ALB를 이용한 EC2 부하 분산 (0) | 2024.09.04 |