220822

HyeonKi Jo·2022년 8월 22일
0

Cloud9

Cloud9 생성

Name environment

Configure setting

  • 새로운 EC2를 Cloud9 환경으로 생성한다.
  • t2.micro로 freetier환경으로 만들어준다.
  • Amazon Linus2를 사용한다.
  • 30분 미사용시 절전 옵션으로 cost를 절약할 수 있다.
  • Network를 세팅해준다.

IAM

사용자 추가

  • AWSCodeCommitFullAccess
  • AWSCodPipeline_FullAccess
  • 위 두가지 정책을 연결해준다.
  • CSV다운로드

보안 자격증명 다운로드

  • 사용자가 잘 생성되었다.


  • 여기서 CodeCommit에 대한 자격증명을 저장한다.

CodeComit

리포지토리 생성


  • 이름: codepipeline-repo
  • 빈 리포지토리가 생성되었다.

  • git clone해보면 빈 리포지토리가 잘 가져와졌다.
  • 아래 에러는 빈 리포지토리를 가져왔다는 warning이다.
  • git 명령어를 이용해 가져왔고, push할 수 있다.

빌드

index.html

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Sample Deployment</title>
  <style>
    body {
      color: #ffffff;
      background-color: #0188cc;
      font-family: Arial, sans-serif;
      font-size: 14px;
    }
    h1 {
      font-size: 500%;
      font-weight: normal;
      margin-bottom: 0;
    }
    h2 {
      font-size: 200%;
      font-weight: normal;
      margin-bottom: 0;
    }
  </style>
</head>
<body>
  <div align="center">
    <h1>Congratulations</h1>
    <h2>This application was deployed using AWS CodeDeploy.</h2>
    <p>For next steps, read the <a href="http://aws.amazon.com/documentation/codedeploy">AWS CodeDeploy Documentation</a>.</p>
  </div>
</body>
</html>
  • 위가 예시 코드지만, 예전에 생성했던 webpage를 가져와본다.
  • git clone https://github.com/jo1132/jo1132.github.io.git

appspec.yaml 생성

version: 0.0
os: linux
files:
#  - source: /index.html
  - source: /*
    destination: /var/www/html/
hooks:
  BeforeInstall:
    - location: scripts/install_dependencies
      timeout: 300
      runas: root
    - location: scripts/start_server
      timeout: 300
      runas: root
  ApplicationStop:
    - location: scripts/stop_server
      timeout: 300
      runas: root
  • 어플리케이션의 사용자데이터처럼 bash명령어를 넣는것이다.
  • index.html을 /var/www/html/로 넣어 빌드하고
    아래 scripts/*폴더들로 hook을 생성한다.
  • 또, 그래서 scripts폴더를 생성하고 start_server, stop_server스크립트를 생성해준다.

스크립트 작성

-mkdir scripts
-cd scripts

vi install_dependencies

#!/bin/bash
yum install -y httpd

vi start_server

#!/bin/bash
systemctl start httpd

vi stop_server

#!/bin/bash
isExistApp = `pgrep httpd`
if [[ -n $isExistApp ]]; then
     systemctl stop httpd
fi

CodeCommit git에 push

  • git add .
  • git commit -m "dev-ops commit"
  • git push
  • push가 잘 되서 파일들이 올라왔다.

Code Deploy

역할 확인

  • 어제 생성했던 codedeploy-role2를 살펴보자
  • S3 Full Accesscodedeploy-ec2가 있다.
  • 모든 리전에서 s3 Get, List에 대한 허용해주는 정책이다.

인스턴스 생성

  • 이름: PRD-server
  • AMI: Amazon Linux2
  • t2.micro
  • 키 설정
  • 네트워크는 Public으로 선택해준다.
  • 보안그룹: dev-SG (80번포트만 열려있으면 됨)
  • 사용자 데이터
    • 사용자 데이터에서 에이전트를 설치해야한다.
    #!/bin/bash
    yum update -y
    yum install -y ruby
    curl -O https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install
    chmod +x ./install
    sudo ./install auto
    • ruby를 설치한다. codedeploy의 에이전트가 ruby로 작성된 것 같다.

애플리케이션 생성

  • Code Deploy로 이동해서 애플리케이션에 들어간다.


  • 애플리케이션을 만들면, 배포하는 방을 생성한 것이다.
  • 여기서 배포그룹을 생성해서 앞으로 배포할 애플리케이션을 넣어주는 것이다.

배포그룹 생성

  • 이름: my-DG
  • 서비스 역할
    • 이전에 만들었던 역할이 존재한다.
    • 이 역할이 어떤 역할이었는지 확인해본다.
    • AWSCodeDeployRole을 가지고있다.
    • 또, 모든 리전에서의 Codedploy와의 신뢰관계를 가지고있다.
  • 태그
    • EC2인스턴스가 만약 10개 이상일 떄, 각각의 인스턴스들에게 모두 일일이 배포하기는 힘들다.
    • 이때, 태그 그룹으로 애플리케이션을 배포해주면, 일일이 배포할 필요 없이 모두 배포할 수 있게된다.
  • 로드밸런서는 체크를 해제해준다.
  • 배포그룹이 잘 생성되었다.

파이프라인 Pipeline

파이프라인 생성

Step 1. 파이프라인 설정 선택

  • 역할을 자동으로 만들어준다.

Step 2. 소스 스테이지 추가

  • 소스 공급자
    • 파이프라인의 소스가 저장된 위치이다.
    • 아래 입력창을 클릭하면 AWS CodeCommit이 존재한다.
  • 리포지토리 이름은 위 AWS CodeCommit을 클릭했다면 아래에서도 클릭하면 자동으로 나온다.
  • 브랜치 이름
    • master
  • 기본값으로 두고 다음을 눌러준다.

Step3. 빌드 스테이지 추가

  • Jenkins에서 Maven을 이용한 것처럼 War파일로 빌드를 할 수 있다.
  • 그러나 지금 실습에서는 S3를 이용한 정적웹사이트를 사용할 것이기 떄문에 이 단계를 건너뛴다.

Step4. 배포 스테이지 추가

  • 배포는 방금 우리가 생성했던 AWS CodeDeploy로 배포한다.

확인

  • 아래 Source가 현재 파란색으로 되어잇다.
  • 파란색은 지금 작업중이고 이부분이 초록색이 되어야한다.
  • 초록색이 되었다.
  • 다시 Deloy가 작업중이다.
  • EC2 에 애플리케이션이 배포가 되는데, 현재 EC2에 S3접근 권한이 없어 Deploy가 실패할 것 같다.

EC2역할 수정

  • EC2에 codedeploy-ec2역할을 부여한다.
  • 아까 봤듯이 codedeploy-ec2역할에는 위와같은 정책이 연결되어 있다.

재시도

  • 실패한 deploy를 재시도한다.
  • S3에 들어가보면 Pipeline에서 생성한 S3버킷이 존재한다.
  • EC2가 이 S3버켓에 들어가서 자료를 가지고 다시 나올 수 있어야한다.
  • .... 너무 오래걸려 삭제하고 다시 실행한다.
  • 이름만 2를 붙혀주고 똑같이 실행한다.
  • ......

재시도2

  • 정리하고 다시시작해본다.
    • s3정리
    • 파이프라인 정리
    • PRD-server 인스턴스 종료

인스턴스 생성

  • 고급 세부 정보 -> IAM인스턴스 프로파일을 넣어준다.
  • 또 사용자데이터를 꼭 넣어준다.
#!/bin/bash
yum update -y
yum install -y ruby
curl -O https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto

파이프라인 생성



에러

  • appspec.yaml에서 - source: /*이 안먹히는 것 같다.
  • 이를 - source: /index.html로 바꿔주니
  • 위와같이 index.html만 나왔다.
  • 그러나 다른 js들이 없어 예쁘지 않은 모습이다.

모든 폴더를 옮기는 방법

  • 소스를 위와같이 /만 넣어주면 된다.
  • 이렇게 리포지토리에 push하면
  • pipeline에서 자동으로 Source -> Deploy로 빌드된다.
  • 잘 나온다!

정리

  • 파이프라인 삭제
  • 배포 -> 애플리케이션 삭제
  • 소스 -> 리포지토리
  • S3 정리
  • 인스턴스 종료
  • cloud9은 실습으로 계속 사용한다.

오후 회의

2022년 8월 22일 14:00~14:50

1. 건의 사항.

  • 시나리오 변경건 -> EKS 가 스타트업에서 다루기에 부담스러운 기술 및 요금이 아닌지. 만약 그렇다면, 스타트업이 아닌 엔터프라이즈로 시나리오 변경에 대해 논의(보류)

2. 진행 사항 공유.

  • 현기) AI/현재 GCP를 이용하여 이미지를 텍스트로 변환하는 작업 완료, S3에 이미지 업로드 후, Lambda를 이용해 GCP에 전달하여 결과 값 반환까지 진행완료.
    계획 - 결과 값을 RDS로 저장하는 부분.
  • 준성) Monitoring/ K8S 이용하여 Prometheus&Grafana 실습. Datadog Agent 실습.
    계획 - 로그인 개발 진행 중...
    회원DB 설계 (회원번호, 아이디, 비밀번호, 이름, 생년월일, 이메일, 알러지)
  • 시영) CI/CD/ AWS CodeSeries(AWS CodeCommit(Github) -> Codebuild 1)-> AWS ECR로 이미지, 2)-> AWS CodeDeploy로 배포) 실습 중.
    계획 - CodeDeploy 부분에서 CloudFormation, Codebuild 오류 해결 진행 중.., EKS 클러스터 구성.
  • 예진) Infra/ VPC 구축 및 NAT 인스턴스 생성, 보안 그룹 구성까지 CloudFormation을 이용하여 진행 완료. 진행하고 보니 비중이 적은 것 같아 추가로 어느 부분을 담당할 수 있을지 고민.
    계획 - 추가 작업 고민.. 및 로그인 기능이 구현이 되면 세션 클러스터링 기능 구현

3. 이슈

  • Fargate 사용하는 데 있어서 프리티어 적용이 안됨. 비용 추가됨. EC2(ECS)로 진행하고 Fargate 진행했다고 말하는 것이 맞을지.
  • S3 처음 생성할 때, 퍼블릭 엑세스로 진행하지 않았는데 업로드 등 진행됨. Root 계정으로 생성해서 그런가? 다른 계정 생성 후 진행해보도록 함.
  • 4명의 작업 내용을 하나의 Git(Github, CodeCommit...)에 업로드하여 한번에 개발 뿐만 아니라 인프라까지 CI/CD가 가능한지?
  • 22일 수업 내용을 어떻게 활용할 수 있을지.. (활용하기 어려운 듯)
  • GIthub private 는 최대 3인까지?! (현기님이 빠짐 ㅋ)
  • SQL 설계 부분 추후 논의 필요. (상품. 이미지. 알러지 등)
  • EKS 클러스터 구축할 때, 인스턴스 유형 어떻게 구성할지 고민 필요해보임. (사양 작은 인스턴스 유형으로 여러개? 사양 큰 인스턴스로 적게?)

교수님 컨펌 (전체 참여)

브로컬리 & 이거사조 팀

  • 주제 : 고객 맞춤 개인화 상품 추천 서비스를 제공하는(?) 스타트업의 식품 쇼핑몰 설계 및 구축 ( 시작 스토리 구성이 좋음 - 교수님)
    • 영양성분 (이미지) -> 텍스트 변환하여 상품 정보 저장. (GCP's Vision API)
    • 알러지 및 고객 구매 패턴 분석하여 개인화 상품 추천 서비스 제공.

ECS(DockerSwarm) vs EKS?

-> 공통 - 여러 노드를 하나로 사용하는 확장성 있는 자원공유 클러스터

  • 현업 -> 규모(컨테이너의 개수) -> 즉, 운영 확장성을 생각하여 EKS를 많이 사용, EKS가 보다 더 미래지향적, Terraform&Ansible 활용하여 구축 가능. but, 비쌈.
  • 하지만, 다른 팀들이 모두 EKS를 사용하니 스토리텔링만 좋다면, 차별화를 두어 ECS로 구성하는 것도 괜찮음.
  • 또한 K8S를 EKS 사용하지말고 직접 구축하여 비용 절약하는 방법도 존재함.
  • CloudFormation을 이용하면 AI/ML과 같은 최신 기술을 제외하면 90% 거의 대부분 사용 가능함.
  • 모니터링 Prometheus & Grafana 말고도 ELK 및 EFK 사용도 고려해보길.. (교수님)
  • 마지막 발표 관련 -> 총 30분 (25분 발표 + 5분 질의응답) 각 6분씩 골고루 안배할 수 있도록.
    • 시연 동영상을 보여줄 시간을 따로 주지 않으니 영상도 활용하여 정적->동적 발표를 통해 발표 어필. (지루함 Down)
    • 1차와 2차는 복습 느낌, 구축한 것 설명 느낌이라면, 최종은 Solutions Architect 로서, 스토리텔링이 중요하다고 생각함.
    • 고객사와 미팅을 통해서 고객사의 요구사항을 잘 반영, Why 그 서비스를 사용했는지, 어필하면 좋을듯함.
  • 다른 조와 다르게 draw.io 를 사용하지말고, https://www.cloudcraft.co/ 의 3D 다이어그램 사용하는 것도 좋아보임.
  • 아키텍처를 지금보다 더 풍성(?)하게 디테일하게 그려야 할 듯.

결정 사항 - EKS

프로젝트 실습

RDS 생성

  • 이름: rds-cocudeny2
  • 엔진: Mysql 8.0.23 (Freetier)
  • t2.micro
  • 가용영역 ap-northeast-2a
  • NEW-VPC
  • VPC 보안그룹 (3306 포트에 모든소스 오픈)
  • 퍼블릭액세스허용: 아니요
  • 암호: ttvhCb90QrEFRtkIMAfh

RDS와 연결하는 Python 코드 테스트

sql_test.py

import sys
import logging
import rds_config
import pymysql
#rds settings
rds_host  = "rds-instance-endpoint"
name = rds_config.db_username
password = rds_config.db_password
db_name = rds_config.db_name

logger = logging.getLogger()
logger.setLevel(logging.INFO)

try:
    conn = pymysql.connect(host=rds_host, user=name, passwd=password, db=db_name, connect_timeout=5)
except pymysql.MySQLError as e:
    logger.error("ERROR: Unexpected error: Could not connect to MySQL instance.")
    logger.error(e)
    sys.exit()

logger.info("SUCCESS: Connection to RDS MySQL instance succeeded")
def handler(event, context):
    """
    This function fetches content from MySQL RDS instance
    """

    item_count = 0

    with conn.cursor() as cur:
        cur.execute("create table Employee ( EmpID  int NOT NULL, Name varchar(255) NOT NULL, PRIMARY KEY (EmpID))")
        cur.execute('insert into Employee (EmpID, Name) values(1, "Joe")')
        cur.execute('insert into Employee (EmpID, Name) values(2, "Bob")')
        cur.execute('insert into Employee (EmpID, Name) values(3, "Mary")')
        conn.commit()
        cur.execute("select * from Employee")
        for row in cur:
            item_count += 1
            logger.info(row)
            #print(row)
    conn.commit()

    return "Added %d items from RDS MySQL table" %(item_count)

rds_config.py

#config file containing credentials for RDS MySQL instance
db_username = "username"
db_password = "passoword"
db_name = "database name" 
profile
Talking Potato

0개의 댓글