AWS CLI 사용법

사용자 계정 생성

  • 사용자 생성

  • 정책(Policy) - aws가 생성해놓은 정책(AWS관리형)도 있고, 사용자가 직접 생성한 정책도 있다. 특성한 리소스나 객체 등에 접근 혹은 사용할 수 있는 권한
  • 사용자, 역할(Role) - 위에서 만든 정책을 사용자나 역할에 부여할 수 있다.

ex) 'ec2가 s3에 접근할 수 있는 정책'을 생성해서 그 역할을 생성한 다음에 해당 역할을 ec2같은 리소스에 부여하면, 해당 ec2에서 s3에 접근이 가능하다.

 

  • 액세스키(아이디), 시크릿키(암호) 생성
     시크릿키는 절대 노출되면 안된다.


AWS CLI 생성

  • aws cli를 사용할 vm 클론

hostname : aws-cli
ip : 211.183.3.99 /24
root@aws-cli:~# apt update -y
root@aws-cli:~# apt install -y unzip
  • 리눅스 기반 cli 다운로드
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
  • 설치파일 실행
root@aws-cli:~# unzip awscliv2.zip
root@aws-cli:~# ./aws/install

#

  • 아까 생성한 사용자 계정(oolralra)을 VM에서 사용할 수 있도록 액세스키와 시크릿키 등록
root@aws-cli:~# aws configure


ECR(Elastic Container Registry)

aws가 제공하는 컨테이너 레지스트리 서비스

  • 이미지 빌드를 위한 도커엔진 설치
root@aws-cli:~# curl -fsSL https://get.docker.com -o get-docker.sh
root@aws-cli:~# chmod +x get-docker.sh
root@aws-cli:~# ./get-docker.sh
  • ECR에 push할 이미지를 다운로드
root@aws-cli:~# docker pull oolralra/ipnginx
root@aws-cli:~# aws ecr describe-repositories

root@aws-cli:~# aws ecr create-repository --repository-name ipnginx --region ap-northeast-2

# ecr 프라이빗 레지스트리 콘솔에서도 확인 가능

root@aws-cli:~# docker tag oolralra/ipnginx 741448938532.dkr.ecr.ap-northeast-2.amazonaws.com/ipnginx
root@aws-cli:~# docker push 741448938532.dkr.ecr.ap-northeast-2.amazonaws.com/ipnginx

# 레지스트리/레포지토리:태그 - 741448938532.dkr.ecr.ap-northeast-2.amazonaws.com/ipnginx:1

  • aws 로그인(aws configure)은 됐지만, 레지스트리(ECR)에는 로그인(docker login)이 안된 상태임의로 띄워서 확인

  • aws configure를 통해 aws는 로그인이 되었기에 그 정보를 토대로 ECR의 암호를 가져온다음 받아온 암호를 표준입력(stdin)
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin <본인레지스트리주소>
  • 레포(ipnginx)까지 긁어도 잘 로그인되는 것 확인
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 741448938532.dkr.ecr.ap-northeast-2.amazonaws.com/ipnginx
root@aws-cli:~# docker push 741448938532.dkr.ecr.ap-northeast-2.amazonaws.com/ipnginx

# push가 잘된것 확인

  • push 된 이미지로도 테스트
root@aws-cli:~# docker rmi -f 741448938532.dkr.ecr.ap-northeast-2.amazonaws.com/ipnginx
root@aws-cli:~# docker run -dp 8787:80 --name awstest 
741448938532.dkr.ecr.ap-northeast-2.amazonaws.com/ipnginx


* docker0 자동재시작 스크립트 docker0

sudo tee /root/check_ip_and_restart_docker.sh<<EOF
#!/bin/bash

if ! ip add | grep -q 172.17; then
systemctl restart docker
fi
EOF
root@host:~# chmod 777 /root/check_ip_and_restart_docker.sh
  • 스케쥴 관리
root@host:~# crontab -e
  • 2번 기본 vim 편집기
* * * * * /root/check_ip_and_restart_docker.sh


ECR = VPC 외부에 존재하는 AWS의 서비스

  • NAT GW : 모든 트래픽, 권장
  • VPC endpoint : 저렴, 단일 서비스, 번거로움


ECS(Elastic Container Service)

aws가 제공하는 컨테이너 서비스

서비스

어떤 task를 어떤 클러스터에 생성해서 어떻게 배포할지 정의(ELB)

태스크

사전에 '컨테이너 이미지 + 포트 + 리소스 + 설정' 정의

ECS 클러스터

  • 여러개의 EC2 : 저렴, 고정적 요청일
  • Fargate(Serverless) : 비용, 불특정/간헐적 서비스 요청일때


ECS 클러스터 생성

♨ 실패하면, 다시 한번 더 생성해보기 

  • ECR에서 레지스트리/레포지토리 복사후 붙여넣기

# 나머지는 기본값으로 두고 생성


서비스 생성

  • 기본 VPC의 퍼블릭 서브넷 : 가용영역은 A,C

  • 컨테이너(태스크)가 서비스를 제공하는 포트를 열어줘야함

 


  • 접속주소를 알기위해 서비스를 클릭해서 들어가거나, 바로 로드밸런서 탭으로 가기

  • 두개의 태스크에 로드밸런싱 되는걸 확인


 만약, 태스크가 실패한다면, 이미지에 문제가 있을 확률이 가장 큼 ♨ 

# 이런 경우엔 ECR 이미지로 docker run을 해서 일단 컨테이너 잘 뜨는지 확인

# 태스크가 안뜬다면 일단 타겟그룹으로 가서 해당 태스크들이 정상상태인지 확인


# 클러스터의 인프라를 Fargate로 컨테이너를 띄우면, 따로 인프라 내부에 컨테이너 네트워크를 생성하는게 아니라 vpc에 EC2와 같은 대역에 컨테이너가 생성된다.

  • 태스크 생성시 Fargate 방식의 네트워크 모드 = awsvpc

  • 서비스 삭제

# 삭제할땐 서비스를 삭제


실습)

현재 클러스터에 curl <alb의주소>를 했을때 ecs test 라는 문구가 뜨도록 서비스 및 태스크를 구성해보세요.
task 수는 2개로 하세요.


1. 이미지를 빌드하기 위해 index.html과 Dockerfile 작성

root@aws-cli:~# echo ecr test > index.html
root@aws-cli:~# vi Dockerfile

# tag 탭에서 이미지경로를 복사

FROM public.ecr.aws/nginx/nginx:alpine
COPY index.html /usr/share/nginx/html/index.html
#파일은 파일, 폴더는 폴더
#CMD는 이미 구성되어있으므로 불필요
  • 레포지토리 생성 (이름 : mynginx)
aws ecr create-repository --repository-name mynginx --region ap-northeast-2

  • 본인 레지스트리 주소를 ECR 환경변수로 지정
root@aws-cli:~# export ECR=741448938532.dkr.ecr.ap-northeast-2.amazonaws.com
  • 앞으로 이 vm에서 $ECR로 찾아갈 수 있음
root@aws-cli:~# echo $ECR 741448938532.dkr.ecr.ap-northeast-2.amazonaws.com
741448938532.dkr.ecr.ap-northeast-2.amazonaws.com 741448938532.dkr.ecr.ap-northeast-2.amazonaws.com
root@aws-cli:~# docker build -t $ECR/mynginx:1 .
root@aws-cli:~# docker rm -f $(docker ps -qa)


root@aws-cli:~# docker run -dp 5959:80 --name mytest $ECR/mynginx:1
a082c25d9cdeac6c7e5a9da42fda2edd76e57cd837aa52e3ff2d5323fbc680a6

  • 이미지로 컨테이너를 띄워서 잘 되는지 확인
root@aws-cli:~# curl localhost:5959
ecr test
  • ECR에 push
root@aws-cli:~# docker push $ECR/mynginx:1

* 이미지를 빌드할때 태그는 꼭 latest말고 1,2,3,4 혹은 1.0, 1.1 이런식으로 가져가기

- 나중에 CI/CD할때 이 개념이 반드시 필요함

- ECR에 이미지를 push하면 내용이 달라졌어도 똑같인 태그명인 경우 업데이트가 제대로 되지 않을때가 부지기수

 

2. 태스크 정의

 

3. 서비스 생성

 


  1. rapa-vpc가 있으신 분들은 거기서 하시고, 없으신 분들은 가용영역 az-a, az-b에 퍼블릭 서브넷 두개, 프라이빗 서브넷 두개를 만드셔서 해보세요.
  2. 도커허브가 리퀘스트 제한 걸렸으니까 gallery.ecr.aws 이미지 받아서 하세요.
    - maven은 비슷한거 찾아서 하세요!
    - openjdk의 aws버전 = corretto

♨ Docker Hub의 익명 사용자 이미지 풀 제한(unauthenticated pull rate limit) 초과

Docker Hub에 로그인

docker login

# 토큰이 만료된 경우 다시 docker login 후 ECR에 push

 

♨ AWS ECR에 로그인할 때 받은 인증 토큰이 만료

denied: Your authorization token has expired. Reauthenticate and try again.
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin <본인레지스트리주소>

실습2)

https://github.com/oolralra/sb_code.git

이 코드를 ECS에 배포해보세요. task 수는 2개로 하세요.
curl <alb의주소>를 했을때, 앱의 메인화면이 뜨도록 서비스 및 태스크를 구성해보세요. 

 

https://eitherwho.tistory.com/80

 

56일차) 2025-03-20(앱 배포-java/js, 컨테이너화, dockerignore)

무중단 고가용성 앱 배포, 서비스를 끊기지 않게 제공다양한 앱 배포웹어플리케이션웹에서 동작하는 어플리케이션웹어플리케이션 프레임워크앱 제작 가이드 또는 툴자바 - spring(java + tomcat 서

eitherwho.tistory.com

풀이)

root@aws-cli:~# git clone https://github.com/oolralra/sb_code.git
root@aws-cli:~# cd sb_code/
root@aws-cli:~/sb_code# vi Dockerfile
FROM public.ecr.aws/docker/library/maven:3.6.3-openjdk-8-slim
WORKDIR /app
COPY . .
RUN mvn clean package
CMD ["java","-jar","target/springbootApp.jar"]

  • ECR 로그인 토큰
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 741448938532.dkr.ecr.ap-northeast-2.amazonaws.com/sb_code
root@aws-cli:~/sb_code# export ECR=741448938532.dkr.ecr.ap-northeast-2.amazonaws.com
root@aws-cli:~/sb_code# docker build -t $ECR/sb_code:1 .
root@aws-cli:~/sb_code# docker run -dp 5757:8085 --name sbapp $ECR/sb_code:1

  • 멀티스테이지로 변경
root@aws-cli:~/sb_code# vi Dockerfile
FROM public.ecr.aws/docker/library/maven:3.6.3-openjdk-8-slim AS build
WORKDIR /app
COPY . .
RUN mvn clean package

FROM public.ecr.aws/amazoncorretto/amazoncorretto:8
WORKDIR /app
COPY --from=build /app/target/springbootApp.jar app.jar
CMD ["java","-jar","app.jar"]
root@aws-cli:~/sb_code# docker build -t $ECR/sb_code:2 .
root@aws-cli:~/sb_code# docker rm -f sbapp
root@aws-cli:~/sb_code# docker run -dp 5757:8085 --name sbapp $ECR/sb_code:2

root@aws-cli:~/sb_code# docker push $ECR/sb_code:2
  • 클러스터 생성(기존 클러스터 사용 가능)

  • 태스크 생성