220803

HyeonKi Jo·2022년 8월 3일
0
post-thumbnail

AWS SAA

EBS

  • EBS는 블록스토리지 서비스를 제공한다.
  • EC2와 연결(Attach)되어 하나의 VM 처럼 사용할 수 있는데, 다만 같은 가용영역안에 존재해야 한다.
  • SSD, HDD등 스토리지 유형을 선택할 수 있다.
  • SSD는 빠른만큼 비용이 비싸고, HDD는 느린만큼 비용이 저렴하다.
  • IOPS가 가장 빠른 스토리지 유형이다.
  • EC2가 삭제되어도 볼륨이 삭제되지 않는다.
  • EC2 설정에서 같이 삭제할 수 있도록 설정할 수 있다.

인스턴스 스토어

  • 인스턴스 볼륨은 EC2와 같이 붙어서 작동하는 스토리지이다.
  • 다만 EC2가 삭제되면, 인스턴스 스토어도 같이 사라진다.
  • 그래서 따로 남기려면 백업을 진행해야한다.
  • 대신 EC2에 붙어있기 떄문에 성능이 좋다.

S3

  • S3 Standard / Reduced Redendancy
    • 기본 S3유형
  • S3 Standard-IA
    • 빈번한 접근이 필요할 떄 사용한다. (다양한 가용 영역 사용)
  • S3 Intelligent-Tiering
    • 빈번한것도 아닌, 빈번하지 않은것도 아닌, 용도가 모호한 접근일 때, 비용을 저렴할 수 있도록 한다.
  • S3 One Zone - IA
    • Standard-IA와 유사하나, 가용 영역을 한 곳에서만 사용하는 것이다. 속도는 빠르지만, 가용성이 Standard-IA보다 떨어진다.
  • S3 Clacier
    • 빈번하지 않은 접근에서 사용한다. 매우 느리지만 저렴한 비용만 지불하면 된다.
  • S3 Glacier Deep Archive
    • S3 Glacier보다 더 느리다. 정보를 검색하는데에 반나절이 걸리지만, 매우 저렴한 비용만 지불하면 된다.

복습

CI/CD

  • 개발자가 github로 소스코드를 올림
  • jenkins에서 github의 변경을 리스닝하여 코드를 가져온다.
  • jenkins는 가져온 코드를 Maven API를 이용하여 Build한다.
  • Build하여 생성된 *.war파일을 Tomcat이 올라간 Dockerhost에 배포한다.

앤서블을 이용한 CI/CD

  • jenkins가 Maven을 통해 build하여 *.war파일을 생성
  • 그것을 ansible을 이용하여 Dockerhub로 푸시한다.
  • Docker host로 image를 pull 해서 container로 서비스한다.

앤서블

앤서블 인스턴스 생성

  • 이름: Ansible-server
  • AMI : Amazon Linux2
  • t2.micro
  • NEW-VPC-PUBLIC-SUBNET-2A
  • 보안그룹: dev-SG
  • 사용자 데이터
#!/bin/bash
timedatectl set-timezone Asia/Seoul
hostnamectl set-hostname ansible-server
amazon-linux-extras install -y ansible2
amazon-linux-extras install docker -y
systemctl enable --now docker
curl https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
usermod -a -G docker ec2-user

  • poweroff 버튼을 누르면 절전모드로 진입하게 한다.
  • 무료라고 한다.
  • 참고, 세부 CloudWatch모니터링은 SAA문제에 자주 나오는 문제이다.
  • EC2모니터링은 보통 5분 간격으로 모니터링 하게 된다.
  • 세부 모니터링은 간격 5분을 1분으로 줄이는 기능이다.
  • 그러나 추가 비용이 지출될 것이다.

Route53에서 레코드 생성

  • andible 을 Route53에 등록하여 도메인주소를 만들어준다.

SSH설정

  • sudo passwd ec2-user
    • ec2-user 계정 비밀번호를 설정해준다.
  • sudo vi /etc/ssh/sshd_config
    • ec2 인스턴스를 키 없이 암호로 접속할 수 있도록 설정한다.
  • sudo systemctl restart sshd
    • sshd재부팅

ansible 세팅

도커 호스트와 연결

  • vi /etc/ansibl/hosts
    • 도커 호스트의 IP주소를 넣어준다.
  • ansible all -m ping
    • ansible 에서 SSH 로 도커 호스트에 접속해서 잘 작동이 되는지 확인해주는 명령어
  • 퍼미션 에러로 접속할 수 없다.
  • ansible all -m ping -k
    • 이번에는 접속하는데에 -k옵션을 줘서 비밀번호를 입력하여 ping테스트가 성공하였다.
  • ssh-keygen -t rsa
    • rsa 방식으로 키를 생성
  • ssh-copy-id [privateip]
  • key를 도커 호스트에 옮겨준다.
  • 그리고 -k옵션 없디 ansible all -m ping명령어를 입력해본다.
  • SUCCESS, 성공적으로 잘 연결되어줬다.

기본 명령어

  • ansible all -m command -a uptime
    • 도커 호스트의 실행시간 표시
  • ansible all -m command -a "docker ps -a"
    • 앤서블의 호스트(도커호스트)에 docker ps -a명령을 주어 실행하였다.

Jenkins와 연결하기위한 세팅

  • sudo mkdir /opt/docker
    • opt디렉토리에 docker 폴더를 만든다.
  • sudo chown -R ec2-user:ec2-user /opt/docker
    • jenkins에서 수정할 수 있도록 사용권한을 ec2-ucer로 준다.

Jenkin와 연결


  • 여기서 추가를 눌러 새로운 SSH Server를 연결해준다.
  • 이렇게 추가후 오른쪽 아래 TEST를 눌러 접속 테스트를 해준다.
  • Success가 나오면 성공이다.

새 프로젝트 생성

  • 이름: Copy_Atifacts_onto_Ansibe
  • Copyfrom: BuildAndDeployOnContainer
    • 기존 있는 프로젝트를 복사해 가져온다.
  • Maven Project로 생성해준다.

General

git

  • 지금 gitlab을 올리지 않았기 때문에 github의 주소를 넣어준다.

빌드 유발

  • 현재 잠깐 테스트를 위해 Poll SCM을 꺼준다.

빌드 후 조치

확인

  • git 주소를 잘못 넣어줬던 1번 시도는 실패했고, 2번시도에서 성공했다.

ansible server 에서 docker 시작하기

  • cd /opt/docker
    • 아까 도커작업을 한 디렉토리로 가준다.

vi dockerfile

FROM tomcat:9
RUN cp -R /usr/local/tomcat/webapps.dist/* /usr/local/tomcat/webapps
COPY ./*.war /usr/local/tomcat/webapps
  • docker build -t tomcat_ansible .
    • -t옵션으로 tomcat_ansible이라는 이름을 준다.
    • .으로 현재 위치의 dockerfile로 빌드한다는 것을 명시
  • docker run -d -p 8080:8080 --name tomcat-container tomcat_ansible
    • 방금 생성한 이미지로 컨테이너를 시작한다.
    • 컨테이너를 삭제할 때는 위와같이 삭제해준다.

앤서블 인벤토리 정의

  • sudo vi /etc/ansible/hosts
[docker-host]
192.168.8.114

[ansible-server]
192.168.10.42
  • host들을 정의하는 것이다.
    • docker-host, ansible-server라는 이름으로 그룹을 지워줬다.
  • 이렇게 정의한 후에는 반드시 ansible all -m ping명령어로 연결이 되는지 확인해줘야한다.
  • 위 도커 호스트는 아까 등록해준만큼, 바로 Success지만,
  • 우리 스스로의 ping에 에러가 출력되었다.
  • ssh-copy-id 192.168.10.42
  • 우리 스스로에게 ssh-key를 복사해주고, 다시 ansible all -m ping을 실행하면 드디어 접속이 된다.

Ansible로 build

  • cd /opt/docker
  • docker login

vi build.yaml

- hosts: ansible-server

  tasks: 
  - name: create docker image 		#작업할떄 출력되는 설명텍스트
    command: docker build -t jo1132/mytomcat:v1.0 .  # bash와 command가 있다.
    args:
      chdir: /opt/docker   			# 작업폴더를 여기로 하겠다.

  - name: push docker image
    command: docker push jo1132/mtomcat:v1.0

  • 잘 빌드되었다.
  • 도커 허브에서 jo1132/tomcat이 잘 push되었다.

Jenkins 프로젝트 구성 수정

  • 이제 빌드 유발을 새로 만들어준다.
  • 또 빌드 후 수정에서 내용을 추가해준다.
cd /opt/docker
ansible-playbook build.yaml
  • 위 설정으로, Jenkins에서 계속 리스닝하여, ansible-playbook을 실행하고, ansible에서 dockerhub에 push할 것이다.
  • 확인하기 위해 도커허브의 mytomcat 레포지토리를 지워본다.

  • 생성되었다.

ansible에서 docker container 띄우기

vi deploy.yaml

- hosts: docker-host
  tasks:
    - name: remove container
      command: docker rm -f docker-container
    - name: remove image
      command: docker rmi -f jo1132/mytomcat:v1.0
    - name: create container
      command: docker run -d -p 8080:8080 --name docker-container jo1132/mytomcat:v1.0
  • 현재 도커에서 실행하는 컨테이너와, 이미지를 모두 삭제한다.
  • 그 후, 다시 도커 컨테이너를 실행한다.
  • 도커 내부에서 image를 삭제했으니, dockerhub에서 이미지를 가져올 것이다.

Jenkins수정

cd /opt/docker;
ansible-playbook build.yml;
sleep 10;
ansible-playbook deploy.yml
  • Execcomand에 위 내용을 추가해준다.
  • 빌드가 성공했다.
  • 빌드가 성공하고 성공적으로 커밋되었다.

오후강의

hello-world

  • git bash를 시작한다.
  • cd ~
  • rm -rf hello-world
    • 새로 clone해오기 위해 기존 디렉토리를 지운다.
  • git clone https://github.com/jo1132/hello-world.git
    • hello-world를 새로 clone해온다.
  • vi webapp/src/main/webapp/index.jsp
    • index.jsp를 조금 수정해준다.
  • git add index.jsp
  • git commit -m "index.jsp text fix"
  • git push origin master
    • 수정사항을 push해준다.
  • Jenkins에서 자동으로 빌드하고 있다.
  • 잘 빌드 되었다.
profile
Talking Potato

0개의 댓글