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
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 된 이미지로도 테스트
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
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. 서비스 생성
- rapa-vpc가 있으신 분들은 거기서 하시고, 없으신 분들은 가용영역 az-a, az-b에 퍼블릭 서브넷 두개, 프라이빗 서브넷 두개를 만드셔서 해보세요.
- 도커허브가 리퀘스트 제한 걸렸으니까 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
- 클러스터 생성(기존 클러스터 사용 가능)
- 태스크 생성
'AWS Cloud School 8기 > AWS' 카테고리의 다른 글
85일차) 2025-04-30(EKS 클러스터, NLB) (3) | 2025.04.30 |
---|---|
67일차) 2025-04-04(ECR, ECS, Github, CICD-codebuild) (0) | 2025.04.04 |
38일차) 2025-02-21(Route53, S3-bucket, ACM, CloudFront) (1) | 2025.02.21 |
37일차) 2025-02-20(Auto-scaling, CloudWatch, 시작 템플릿) (0) | 2025.02.20 |
36일차) 2025-02-19(AWS-was/nginx, 커스텀AMI, ELB) (0) | 2025.02.19 |