쟝이의 세상
AWS EKS 사용 - Docker 컨테이너 구축, ECR에 이미지 푸시 본문
📎 EKS 구성도주황색 선
: Deploment로 생성된 pod는 HPA(Horizontal Pod Autoscaler)에 의해 리소스 사용량에 따라 auto scaling 되는 것을 표현
파란색 선
: ALB(AWS에서 제공하는 로드 밸런서 유형 중 하나)를 통해 타겟 그룹에 속한 EC2 인스턴스에 트래픽이 분산, auto scaling 그룹은 부하에 따라 인스턴스를 동적으로 조정하는 것을 표현
📎 실행 과정
1) 사용자 생성 및 액세스 키 생성
2) 2a 인스턴스 접속
3) eksctl / kubectl 설치
4) AWS CLI 사용할 때 필요한 인증 정보 및 기본 설정 구성
5) Docker 설치
6) dockerfile 과 index.html 파일 생성
7) image build & docker run
8) 도커 컨테이너 IP 접속 / 인스턴스 IP:Port번호 접속
9) ECR 정책 생성
10) ECR 로그인 & image tag & image push
📌 사용자 생성 및 액세스 키 생성
AWS CLI를 사용하기 위해서는 access key 필요(사용자 생성, access key 발급)
AWS CLI를 통해 AWS 리소스를 관리하는 이유
→ AWS CLI를 사용하면 AWS Management Console에 로그인하지 않고도 명령줄에서 직접 AWS 서비스와 리소스를 관리할 수 있다.
✔️ 사용자 생성
IAM > 사용자 > 사용자 생성

입력 구분 | 입력 내용 | |
1단계 - 사용자 세부 정보 지정 |
사용자 이름 | jihyang |
☑️ AWS Management Console에 대한 사용자 액세스 권한 제공 | ||
☑️ IAM 사용자를 생성하고 싶음 | ||
콘솔 암호 | 사용자 지정 암호 [암호 입력] |
|
⬜️ 사용자는 다음 로그인 시 새 암호를 생성해야 합니다 (체크 해제) | ||
2단계 - 권한 설정 | 권한 옵션 | ☑️ 직접 정책 연결 |
권한 정책 | ☑️ AmazonSSMManagedInstanceCore ☑️ AmazonS3ReadOnlyAccess ☑️ AmazonS3FullAccess |
→ 생성된 후 ".csv 파일 다운로드"
✔️ 액세스 키 생성
생성한 사용자 클릭 > 오른쪽 상단 "액세스 키 만들기"

입력 구분 | 입력 내용 | |
1단계 - 액세스 키 모범 사례 및 대안 |
사용 사례 | ☑️ Command Line Interface(CLI) |
☑️ 위의 권장 사항을 이해했으며 액세스 키 생성을 계속하려고 합니다. | ||
2단계 - 설명 태그 설정 | 설명 태그 값 | EC2 instance access for development |
→ 액세스 키 생성한 후 ".csv 파일 다운로드"
** 다운로드 한 .csv 파일들은 따로 저장해두기

📌 EKS 클러스터 관리를 위한 환경 설정
1️⃣ 인스턴스 접속
- eksctl 설치
$ curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
$ sudo mv /tmp/cksctl /usr/local/bin
👇🏻 eksctl 버전 확인
[ec2-user@ip-10-250-1-212 yum.repos.d]$ eksctl version
0.193.0
- kubectl 설치
#디렉토리 이동
$ cd /usr/local/bin
#kubectl 설치
$ sudo curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.21.2/2021-07-05/bin/linux/amd64/kubectl
#kubectl 실행권한 부여
$ sudo chmod +x ./kubectl
#디렉토리 생성, 파일 복사, 환경변수 추가
$ sudo mkdir -p $HOME/bin && sudo cp ./kubectl $HOME/bin/kubectl && export PATH=$PATH:$HOME/bin
👇🏻 kubectl 버전 확인
[ec2-user@ip-10-250-1-212 bin]$ kubectl version --short --client
Client Version: v1.21.2-13+d2965f0db10712
2️⃣ AWS CLI 구성
→ ubuntu Linux EC2에서 aws 관리할 수 있도록 CLI 통한 로그인
(참고: accessKeys.csv 파일)
- AWS CLI를 사용할 때 필요한 인증 정보 및 기본 설정 구성
$ aws configure
AWS Access Key ID [None]: AKIAXTORPUUL5CB5PXST
AWS Secret Access Key [None]: 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
Default region name [None]: ap-northeast-2
Default output format [None]: json
- 현재 설정된 AWS CLI 구성 정보 출력
$ aws configure list
Name Value Type Location
---- ----- ---- --------
profile <not set> None None
access_key ****************PXST shared-credentials-file
secret_key ****************4Be3 shared-credentials-file
region ap-northeast-2 config-file ~/.aws/config
- 현재 AWS에 로그인된 사용자의 신원 반환 (권한이 올바르게 설정되었는지 확인할 때 유용)
$ aws sts get-caller-identity
{
"UserId": "AIDAXTORPUUL7A6AE2ROE",
"Account": "522814727447",
"Arn": "arn:aws:iam::522814727447:user/jihyang"
}
- 현재 계정의 S3 버킷 목록 확인
(버킷: 클라우드에서 데이터를 저장하는 컨테이너 역할)
$ aws s3 ls
2024-10-16 03:15:45 zyangee-as-demo
3️⃣ 도커 설치 및 컨테이너 이미지 생성
- 도커 설치 및 서비스 실행
#Docker 설치
$ sudo dnf install docker
#Docker 서비스 실행
$ sudo systemctl start docker
$ sudo systemctl enable docker
$ sudo systmeclt status docker

- kubectl 자동완성 기능 추가
$ echo "source <(kubectl completion bash)" >> ~/.bashrc
$ source ~/.bashrc
- 도커파일 생성
$ cd ~
$ mkdir dockerfile-folder
$ cd dockerfile-folder
$ vi dockerfile
👇🏻 dockerfile 내용 확인
FROM nginx:latest
MAINTAINER "jihyang <wlgid1129@naver.com>"
COPY ./index.html /usr/share/nginx/html/index.html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
$ vi index.html
👇🏻 index.html 내용 확인
<html>
<head>
<title>Amazon S3 Homepage Connected Success !!!</title>
<style>
body {margin-top: 40px; background-color: #333;}
</style>
</head>
<body>
<div style=color:white;text-align:center>
<h1>Amazon S3 Homepage Connected Success !!!</h1>
<h2>Congratulations!</h2>
<p><em>Your application is now running on a container in Amazon S3.</em></p>
</div>
</body>
</html>
$ cd ~
#생성한 dockerfile-folder 디렉토리를 /root로 이동
$ sudo mv dockerfile-folder/ /root

- 도커 이미지 빌드
$ sudo su
#root 사용자로 로그인하여 실행하기
cd ~/dockerfile-folder
#Docker build
docker build -t ecs-nginx .

4️⃣ 도커 컨테이너 실행
- 도커 컨테이너 실행
docker run -d --name nginx-container -p 8000:80 d4519a03c368

- 도커 컨테이너 내부에서 실행 중인 웹 서버 서비스 실행
docker inspect [container ID]
curl [container IPAddress]

👇🏻 외부에서 접속하기 위한 보안그룹 인바운드 규칙 추가

보안 그룹 규칙 ID | 유형 | 포트 범위 | 소스 |
- | 사용자 지정 TCP | 8000 | Anywhere IPv4 |
👇🏻 인바운드 규칙 추가 결과 확인

- 외부에서 접속


5️⃣ ECR 정책 생성
ECR(Elastic Container Registry): Docker 컨테이너 이미지를 관리하고 배포하는 AWS 서비스 (Docker 이미지의 저장소 역할)
→ 개발자들이 애플리케이션을 쉽게 구축하고 배포할 수 있도록 지원
- 정책 생성
(IAM > 정책 > 정책 생성)

입력 구분 | 입력 내용 | |
1단계 - 권한 지정 | 정책 편집기 | <JSON> { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecr:GetAuthorizationToken", "ecr:BatchCheckLayerAvailability", "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:InitiateLayerUpload", "ecr:UploadLayerPart", "ecr:CompleteLayerUpload", "ecr:PutImage" ], "Resource": "*" } ] } |
2단계 - 검토 및 생성 | 정책 이름 | ecr_GetAuthorization |
<< ECR에 대한 특정 권한을 부여 >>
- ecr:GetAuthorizationToken : ECR에 대한 인증 토큰을 가져오는 작업(ECR에 이미지를 푸시하거나 풀할 때 필요)
- ecr:BatchCheckLayerAvailability : 이미지의 레이어가 ECR에 있는지 확인하는 작업
- ecr:GetDownloadUrlForLayer : 특정 레이어에 대한 다운로드하기 위한 URL을 가져오는 작업
- ecr:BatchGetImage : 특정 이미지를 가져오는 작업
- ecr:InitiateLayerUpload : 이미지 레이어의 업로드를 시작하는 작업
- ecr:UploadLayerPart : 이미지 레이어의 일부를 업로드하는 작업
- ecr:CompleteLayerUpload : 레이어 업로드를 완료하는 작업
- ecr:PutImage : 이미지를 ECR에 저장하는 작업
👉 주로 CI/CD 환경에서 ECR을 활용할 때 해당 권한이 필요
- 엔터티 연결
("연결"버튼 클릭 > s3fullaccess 선택)

6️⃣ ECR에 로그인하여 이미지 푸시
- ECR에 로그인
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 522814727447.dkr.ecr.ap-northeast-2.amazonaws.com
→ 서울 리전의 ECR에 대한 로그인 비밀번호를 가져오고, IAM 사용자가 ECR에 인증할 수 있는 비밀번호를 반환
앞 명령어의 출력을 뒤 명령어의 입력으로 전달
Docker 로그인
--username AWS (ECR에 로그인할 때 사용되는 고정된 사용자 이름)
--password-stdin 522814727447.dkr.ecr.ap-northeast-2.amazonaws.com
(앞의 숫자는 AWS 계정의 ID, 숫자 뒤의 URL은 아시아 태평양 지역의 ECR 엔드포인트)
- 이미지 태깅
docker tag ecs-nginx:latest 522814727447.dkr.ecr.ap-northeast-2.amazonaws.com/ecs-nginx:latest
→ 522814727447.dkr.ecr.ap-northeast-2.amazonaws.com/ecs-nginx
: ECR에 저장될 이미지 이름

👇🏻 레파지토리 생성
(ECS > 리포지토리 > 리포지토리 생성)

- 도커 푸시
docker push 522814727447.dkr.ecr.ap-northeast-2.amazonaws.com/ecs-nginx:latest

정상적으로 AWS ECR에 컨테이너 이미지가 올라가는 것을 볼 수 있다.
'수업내용' 카테고리의 다른 글
AWS EKS 클러스터와 Kubernetes 노드에서 kubelet 설정 (0) | 2024.10.24 |
---|---|
AWS EKS 사용 - 클러스터와 노드 그룹 생성, IAM 정책 설정 (0) | 2024.10.23 |
AWS에서 애플리케이션 로드 밸런서를 사용하여 EC2 인스턴스 관리, 배포 (0) | 2024.10.18 |
AWS에서 웹 애플리케이션 배포하기 위한 프로세스 (0) | 2024.10.16 |
Kubernetes(Ingress) (0) | 2024.10.04 |