Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

쟝이의 세상

AWS EKS 사용 - Docker 컨테이너 구축, ECR에 이미지 푸시 본문

수업내용

AWS EKS 사용 - Docker 컨테이너 구축, ECR에 이미지 푸시

zyangee 2024. 10. 21. 10:16
📎 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에 컨테이너 이미지가 올라가는 것을 볼 수 있다.