반응형

토이 프로젝트로 혼자서 클라우드 서비스를 이용하여 웹 개발부터 배포까지 온 과정을 경험해 보았습니다.

이 과정을 단계별로 나누어서 정리해 보려고 합니다.!

많은 피드백은 감사합니다!

 

목차 

STEP 01) NCP 서버 

STEP 02) AWS RDS, S3

STEP 03) Web Application 개발

STEP 04) Jenkins pipeline 배포

STEP 05) Domain 등록

 


이번에는 AWS Route53 서비스를 이용해서 도메인을 등록해보겠습니다.

 

가비아에서 구매 한 도메인을 AWS Route53에 등록해보겠습니다.

Route53에서도 도메인 구매가 가능합니다

 

1. 호스팅 영역 > 호스팅 영역 생성

 

 

2. 도메인 정보 입력

  - 도메인 이름 : 구매한 도메인

  - EC2 퍼블릭 IP

  - 퍼블릭 호스팅 영역 : 인터넷에서 트래픽을 라우팅하고자 하는 방법을 지정하는 레코드를 포함합니다.

 

3. NameServer 등록

  - NS : 네임서버 레코드로 도메인에 대한 네임서버의 권한을 가지고 있는지 알려주는 레코드

  - SOA : 도메인의 정보를 가지고 있는 레코드

 

 

4. 가비아에 AWS 네임서버 등록

  - 호스팅업체의 네임서버를 사용해도 무방합니다.

 

가비아에 등록된 네임서버

5. 도메인과 EC2 인스턴스 IP 연결

  - 레코드 생성 클릭

 

 

레코드 이름 : 라우팅할 이름을 설정합니다.

레코드 유형 : ec2로 라우팅할 경우 ipv4로 라우팅합니다.

값 : ec2 인스턴스 퍼블릭 IP

TTL : DNS에 ip 주소를 저장하는 시간

 

 

레코드를 생성하면 시간이 조금 지나서 등록한 도메인으로 접속이 가능합니다!

Route53은 Free tier 사용하더라도 월별 호스팅 가격 및 쿼리(도메인을 통해서 AWS에 접속하는 횟수) 비용이 발생합니다.

  - Rout53 요금제

728x90
반응형
반응형

토이 프로젝트로 혼자서 클라우드 서비스를 이용하여 웹 개발부터 배포까지 온 과정을 경험해 보았습니다.

이 과정을 단계별로 나누어서 정리해 보려고 합니다.!

많은 피드백은 감사합니다!

 

목차 

STEP 01) NCP 서버 

STEP 02) AWS RDS, S3

STEP 03) Web Application 개발

STEP 04) Jenkins pipeline 배포

STEP 05) Domain 등록


이번에는 젠킨스 파이프라인을 구축해보도록 하겠습니다.

 

젠킨스 파이프라인 구성 순서

1. pipeline 구조 생성

2. github clone

3. gradle build

4. ssh를 이용해서 파일 전송 후 applicaton 기동

 

1. pipeline 구조 생성

젠킨스 파이프라인 구성에 앞서 구조부터 생성해보도록 하겠습니다.

 

1.1) pipeline 생성

Dashboard > 새로운 Item > name 작성하고 OK

 

 

1.2) 샘플을 실행 시켜봅시다. (Advanced Project Options 탭에서 우측상단의 Hello Wold 선택하고 저장)

 

1.3) 파이프라인 실행

  - 파이프라인 구조를 생성하고 샘플 Script를 실행해보았습니다. 이제 본격으로 파이프라인 구성을 해보도록 하겠습니다.

 

2. github clone

jenkins pipeline은 Pipeline Syntax를 이용해서 Script를 생성해서 구성합니다.

 

2.1) Pipeline Syntax > Sample Step(git: Git 선택 혹시 안보이신다면 jenkins관리에서 github plugin을 설치하시기 바랍니다.)

 

2.2) github repository url을 작성하시고 배포할 Branch를 선택합니다.

 

2.3) 첫 Jenkins 세팅이라면 Credentials 없으실텐데요. 아래 Add > Jenkins 클릭하시면 아래와 같은 창이 나옵니다.

    - Kind를 Username with password를 선택 후 Password에는 github token을 넣어줍니다. github token 발급은 바로 아래에서 설명드리겠습니다.

    - ID는 중복되지 않도록 작성하시면 됩니다.

 

2.4) github token 발급

github > Settings > 오르쪽 카테고리에서 Developer settings 선택

 

 

Note - token을 구분할 수 있도록 작성하고 Expiration으로 토큰의 기간을 정한다.

Select scopes - 필요한 권한을 체크한다.(저는 repo, admin:repo_hook 체크)

repo : repository 권한

admin:repo_hook : webhook에 필요한 hook 권한

 

Generate token을 클릭하면 token이 발급됩니다.

아래와같이 발급된 토큰을 복사해서 사용하면됩니다. 토큰 기간만료 또는 분실시 같은 방법으로 토큰을 발급받으면 됩니다.

 

 

다시 jenkins로 위에서 추가한 Credentials를 선택하고 Generate Pipeline Script 클릭하면 Script가 생성됩니다.

 

 

Syntax에서 생성한 Script를 pipeline으로 가져와서 그대로 붙여줍니다.

 

 

github clone에 성공하였습니다!

 

 

3. gradle build

build stage를 추가하도록 하겠습니다.

  - build는 clone으로 가져온 소스에 포함되어 있는 gradle wrapper를 이용합니다. 자신의 소스코드에 맞게 위치를 지정해서 gradle          build를 해주시면 됩니다.

 

 

build까지 성공하였습니다! 애플리케이션이 배포되기까지 거의 다 왔습니다!

 

 

4. ssh를 이용해서 파일 전송 후 applicaton 기동

빌드된 파일을 전달하기위해서는 jenkins에 publish over ssh plugin이 설치되어있어야 합니다.

 

플러그인이 설치되면 Dashboard > Jenkins 관리 > Configure System으로 이동해서 Publish over SSH에 서버 정보를 입력하면 됩니다.

 

저는 AWS EC2 서버를 사용하고있습니다.

EC2 접속에 필요한 pem 키를 Key에 붙여넣어줍니다.

Name : syntax에서 참조될 이름

Hostname : private ip

Username : ec2에서 사용되는 username

Remote Dircetory : 베이스 디렉토리(참고, 이 디렉터리 기준으로 파일이 전송되고, 스크립트가 실행된다.)

 

 

모두 작성하시고 Test Configuration를 클릭하시면 문제 없으면 Success가 표시됩니다.

 

Pipeline Syntax로 돌아가서 Step : sshPublisher: Send build artifacts over SSH 선택

Souce files : 빌드된 파일 위치입니다.

Remove prefix : 소스파일에서 원본 파일의 디렉토리를 어디까지 포함할 것인지 설정입니다.(여기서는 jar 파일 하나만 선택되도록 설정)

Remote directory : 위에서 선택된 jar 파일을 해당 디렉터리 아래에 위치시킵니다.

Exec command : 파일을 전송한 다음 실행할 shell

 

마지막으로 Pipeline에 stage를 추가해서 위 script를 붙여줍니다.

 

최종 pipeline script

pipeline {
    agent any

    stages {
        stage('github clone') {
            steps {
                git credentialsId: 'tutorial-jenkins-token', url: 'https://github.com/kgc0120/daily_special.git'
            }
        }
        
        stage('build'){
            steps{
                sh'''
                    echo build start
                    ./gradlew clean bootJar
                '''
            }
        }
        
        stage('publish over ssh'){
            steps{
                sshPublisher(publishers: [sshPublisherDesc(configName: 'aws-daily-special'
                , transfers: [sshTransfer(cleanRemote: false
                , excludes: ''
                , execCommand: 'sh /dailySpecial/app/nonstop/deploy.sh'
                , execTimeout: 120000, flatten: false, makeEmptyDirs: false
                , noDefaultExcludes: false
                , patternSeparator: '[, ]+'
                , remoteDirectory: '/app/nonstop/springboot-webservice/build/libs'
                , remoteDirectorySDF: false
                , removePrefix: 'build/libs', sourceFiles: 'build/libs/*.jar')]
                , usePromotionTimestamp: false
                , useWorkspaceInPromotion: false
                , verbose: false
                )])
            }
        }
    }
}

 

pipeline을 실행시켜보면 서버 배포까지 정상적으로 성공하였습니다!!

 

 

정말 시행착오도 많았고 길었던 Jenkins pipeline 구축이었습니다... ㅜ

다음번에는 github webhooke을 이용해서 소스코드를 push 하면 젠킨시가 자동으로 배포되도록 해보겠습니다.

728x90
반응형
반응형

토이 프로젝트로 혼자서 클라우드 서비스를 이용하여 웹 개발부터 배포까지 온 과정을 경험해 보았습니다.

이 과정을 단계별로 나누어서 정리해 보려고 합니다.!

많은 피드백은 감사합니다!

 

목차 

STEP 01) NCP 서버 

STEP 02) AWS RDS, S3

STEP 03) Web Application 개발

STEP 04) Jenkins pipeline 배포

STEP 05) Domain 등록

 

 


 

* Web Application 개발은 앞에서 살펴보았던 AWS 서비스를 사용하는 방법만 소개하도록 하겠습니다.

 

개발 환경

 - SpringBoot 2.6.6

 - Mariadb 2.7.5

 - Gradle 7.4.1

 

1. RDS 연결(yml 설정)

  - 이전 RDS 설정 확인

spring:
  datasource:
    url: jdbc:mariadb://rds end point 주소 + prot + schema name
      예) jdbc:mariadb://rds.amazonaws.com:3306/rdstest
    driver-class-name: org.mariadb.jdbc.Driver
    username: admin
    password: 패스워드

 

2. S3 연결

  - 이전 S3 설정 확인

1.  spring cloud starter 의존성 추가

  - build.gradlew

implementation 'io.awspring.cloud:spring-cloud-starter-aws:2.3.1'

 

2. yml 설정

cloud:
  aws:
    credentials:
      access-key: access key
      secret-key: secret key
    s3:
      region: ap-northeast-2
      endpoint: s3-bucket

 

  - access key, secrey key 새 액세스 키 만들기로 생성

 

 

- region, endpoint 작성

  endpoint는 :::뒤에 복/붙

 

AwsS3Config.java

 

package com.bumblebee.dailyspecial.domain.aws;

import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author bumblebee
 */
@Configuration
public class AwsS3Config {

    @Value("${cloud.aws.credentials.access-key}")
    private String accessKey;

    @Value("${cloud.aws.credentials.secret-key}")
    private String secretKey;

    @Value("${cloud.aws.s3.region}")
    private String region;

    @Bean
    public AmazonS3Client amazonS3Client() {
        BasicAWSCredentials awsCreds = new BasicAWSCredentials(accessKey, secretKey);
        return (AmazonS3Client) AmazonS3ClientBuilder.standard()
                .withRegion(region)
                .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
                .build();
    }

}

 

AwsS3Service.java

 

package com.bumblebee.dailyspecial.domain.aws;

import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.bumblebee.dailyspecial.domain.comutils.CommonUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;

/**
 * @author bumblebee
 */
@Slf4j
@RequiredArgsConstructor
@Service
public class AwsS3Service {

    private final AmazonS3Client amazonS3Client;

    @Value("${cloud.aws.s3.endpoint}")
    private String bucketName;

    public String uploadFileV1(String category, MultipartFile multipartFile) {
        validateFileExists(multipartFile);

        String fileName = CommonUtils.buildFileName(category, multipartFile.getOriginalFilename());

        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setContentType(multipartFile.getContentType());

        try (InputStream inputStream = multipartFile.getInputStream()) {
            amazonS3Client.putObject(new PutObjectRequest(bucketName, fileName, inputStream, objectMetadata)
                    .withCannedAcl(CannedAccessControlList.PublicRead));
        } catch (IOException e) {
//            throw new FileUploadFailedException();
        }

        return amazonS3Client.getUrl(bucketName, fileName).toString();
    }

    private void validateFileExists(MultipartFile multipartFile) {
        if (multipartFile.isEmpty()) {
//            throw new EmptyFileException();
        }
    }

}

 

AwsS3Config class에 amazonS3Client 메소드를 @Bean으로 등록합니다.

파일을 업로드가 필요한 로직에 AwsS3Service class에서 uploadFIleV1 메소드를 이용해서 S3에 업로드 합니다.

예)

awsS3Service.uploadFileV1("Img", multipartFile);

 

그 외 다운로드 및 다중 업로드 기능도 제공하고 있습니다.

 

참조

  - Springboot로 S3 파일 업로드하기

728x90
반응형
반응형

토이 프로젝트로 혼자서 클라우드 서비스를 이용하여 웹 개발부터 배포까지 온 과정을 경험해 보았습니다.

이 과정을 단계별로 나누어서 정리해 보려고 합니다.!

많은 피드백은 감사합니다!

 

목차 

STEP 1) NCP 서버 

STEP 2) AWS RDS, S3

STEP 3) Web Application 개발

STEP 04) Jenkins pipeline 배포

STEP 05) Domain 등록


AWS(Amazon Web Services)

  - 아마존 클라우드 서비스

  - 현재 클라우드 컴퓨팅 분야에서 세계 1위

  - 다양한 클라우드 자원을 1년간 무료로 경험해 볼 수 있다.

  - 많은 국내 IT 기업에서도 사용 중이다.

 

* 이번 장에서는 Web Application를 만드는데 필요한 객체 스토리지 서비스(S3)를 AWS에서 사용하는 방법을 알아보겠습니다. 

S3

S3는 AWS(Amazon Web Service)에서 제공하는 인터넷 스토리지 서비스입니다.
S3(Simple Storage Service) 를 뜻합니다.

 

장점

  • 높은 내구도를 자랑하며 정보를 안전하게 저장 할 수 있습니다.
  • 저렴한 비용으로 사용이 가능합니다(ec2에 이미지, 영상등을 저장하며 비용이 만만치 않습니다.)
  • 보안성이 뛰어납니다 ( SSL을 통하여 데이터 전송과 암호화를 하므로 해킹 걱정이 적습니다.)
  • 속도가 빠릅니다 (각 지역에 맞게 선택하며, 업/다운로드 시 지역시간 최소화를 위한 멀티 파트 업로드를 지원합니다.)

 

1. Amazon S3에서 버킷 만들기를 선택합니다.

 

 

2. S3 버킷 만들기

  - 버킷 이름과 AWS 리전을 선택합니다.

 

3. ACL 활성화됨을 선택합니다.

  - 비활성화를 하게 되면 개발 당시 파일 업로드할 때 400 에러가 발생된 경험이 있습니다.

 

4. 퍼블릭 액세스 차단은 맨 마지막 임의의 퍼블릭 버킷 또는 엑세스 지점 정책을 ... 제외하고 체크 하도록 하겠습니다.

  - 모든 퍼블릭 액세스 차단을 권장하고 있습니다.

 

5.  버킷 버전 관리 및 기본 암호화 운영할 때는 활성화를 하는 게 유지 보수 측면에서나 보안상 좋습니다.

 

6. 생성된 버킷에 이미지를 업로드해 보겠습니다.

 

7. 파일 추가 후 업로드 클릭

 

 

8. 객체 URL 복사 후 접근!

 

 

AccessDenied 에러 발생..

 

9. 버킷 > 권한 탭 > 버킷 정책 설정

  9.1 ) 퍼블릭 액세스 차단 모두 해체 후 저장

 

  9.2 ) 버킷 정책 편집 > 정책 생성기

 

 

  - Select Type of Policy : S3 Bucket Policy 

  - Principal : *

  - Actions : GetObject

  - Amazon Resource Name(ARN) : 버킷 > 속성 탭 > Amazon 리소스 이름(ARN) /* (이름 뒤에 /* 붙여줍니다.)

  9.3 ) Generate Policy 후 JSON 복사 > 버킷 정책에 붙여넣기 후 저장

 

10. 객체 URL 접근 이미지 출력!

 

728x90
반응형
반응형

토이 프로젝트로 혼자서 클라우드 서비스를 이용하여 웹 개발부터 배포까지 온 과정을 경험해 보았습니다.

이 과정을 단계별로 나누어서 정리해 보려고 합니다.!

많은 피드백은 감사합니다!

 

목차 

STEP 01) NCP 서버 

STEP 02) AWS RDS, S3

STEP 03) Web Application 개발

STEP 04) Jenkins pipeline 배포

STEP 05) Domain 등록


AWS(Amazon Web Services)

  - 아마존 클라우드 서비스

  - 현재 클라우드 컴퓨팅 분야에서 세계 1위

  - 다양한 클라우드 자원을 1년간 무료로 경험해 볼 수 있다.

  - 많은 국내 IT 기업에서도 사용 중이다.

 

* 이번 장에서는 Web Application를 만드는데 필요한 Database(RDS)를 AWS에서 사용하는 방법을 알아보겠습니다. 

RDS

Amazon Relational Database Service(RDS)를 사용하면 클라우드에서 관계형 데이터베이스를 간편하게 설정, 운영 및 확장할 수 있습니다. 시간 소모적인 데이터베이스 관리 작업을 관리하는 한편, 효율적인 비용으로 크기를 조정할 수 있는 용량을 제공하므로 사용자는 애플리케이션과 비즈니스에 좀 더 집중할 수 있습니다.

장점

  • 관리 부담 감소 사용 편의성 ...
  • 성능 범용(SSD) 스토리지 ...
  • 확장성 즉각적인 컴퓨팅 규모 조정 ...
  • 가용성 및 내구성 자동 백업 ...
  • 보안 저장 데이터 및 전송 데이터 암호화 ...
  • 관리 효율성 모니터링 및 지표 ...
  • 비용 효율성 사용한 만큼만 비용 지불

[AWS RDS 생성 방법]

1. 왼쪽 상단에 서울 region를 선택하고 데이터베이스 생성을 클릭합니다.

  - AWS는 여러 region이 있지만 아무래도 가장 가까운 region를 선택하는 게 네트워크 속도상 이점이 있습니다.

 

 

2. 아래와 같이 프리 티어로 MariaDB를 생성하도록 하겠습니다.

  - DB 인스턴트 식별자 : 생성할 DB의 이름이라고 생각하시면 됩니다.

  - 마스터 사용자 이름 / 마스터 암호 : DB 접속에 필요한 관리자 ID, PW입니다.

 

 

3. 생성하고 조금 기다리게 되면 아래와 같이 정말 쉽게 데이터베이스가 생성되었습니다.

 

 

4.  생성된 db를 클릭하게 되면 아래와 같이 여러 정보들을 확인 할 수 있습니다.

  - 모니터링을 통해서 cpu나 스토리지 상황을 확인 할 수 있고, 로그 및 이벤트 탭에서 이벤트 발생된 로그를 확인 할 수 있습니다.

 

 

5. DB가 생성되었으니 접속을 한 번 해보도록 하겠습니다.

  - DBeaver라는 DB tool를 이용해서 접속 테스트를 진행하였습니다.

  - Server Host에 위에서 생성한 DB의 엔드포인트를 작성하고 마스터 계정으로 접속 테스트를 합니다.

 

 

Test Connection 실행 화면

 

AWS RDS를 이용해서 몇 분 만에 손쉽게 데이터베이스를 생성해서 접속해 보았습니다.

다음으로 AWS S3를 생성하는 방법을 알아보겠습니다.

 

728x90
반응형
반응형

토이 프로젝트로 혼자서 클라우드 서비스를 이용하여 웹 개발부터 배포까지 온 과정을 경험해 보았습니다.

이 과정을 단계별로 나누어서 정리해 보려고 합니다.!

많은 피드백은 감사합니다!

 

목차 

STEP 01) NCP 서버 

STEP 02) AWS RDS, S3

STEP 03) Web Application 개발

STEP 04) Jenkins pipeline 배포

STEP 05) Domain 등록


1. NCP(Naver CLoud Platform)

  - 네이버 클라우드 서비스로 1년간 Free Tier 서비스를 이용할 수 있습니다.

  - 네이버 클라우드 서비스를 사용해 보고 싶어서 서버는 NCP Sorver를 선택

  - 네이버 클라우드 서비스라서 언어가 매우 친숙함.

 

https://www.ncloud.com/

 

NAVER CLOUD PLATFORM

cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification

www.ncloud.com

 

2. NCP에서는 다양항 클라우드 서비스를 제공합니다.

  - Free Tier에서는 아래 설명과 같이 Micro Server를 1년간 무료로 1대를 제공합니다. 

  - Compute > Server 선택

  - NCP server guide(https://guide.ncloud-docs.com/docs/compute-server-prep)

 

 

3. Server > 서버 생성

 

 

4. 서버 이미지 선택에서 서버 타입 Micro 선택 후 centos-7.8-64 선택  

 

 

5. 서버 설정 탭에서 Free Tier 서버에 맞게 설정 후 다음

  - 본 이미지는 Micro 타입 서버를 이미 1개 생성해서 하나 더 생성할 수 없어서 Compact 타입으로 설정 후 진행하였습니다.

  - SSD 서버는 Micro 타입 서버를 지원하지 않습니다.

 

 

6. 인증키 설정에서 서버에 접속할 관리자 비밀번호를 생성합니다.

  - 항상 인증키는 안전한 곳에 저장!

 

 

7. 네트워크 접근 설정은 생성 할 서버에 대한 방화벽 설정이라고 생각하시면 될 것 같습니다. 

 

 

8. ACG 설정에서 접근 소스는 접속에 허용될 ip 대역을 의미합니다.

  - 웹 서비스를 접근할 8080 포트를 허용합니다.

  - 서버 ssh에 접근되는 22 포트를 허용합니다. (서버 접근은 myip로 하여 보안을 강화하는 게 좋습니다.)

 

 

9. 이제 생성된 서버에 접근해보도록 하겠습니다.

  ssh에 접근에 많이 사용되는 tool인 putty를 이용해 보도록 하겠습니다.

  ncp에 새로 생성된 서버를 클릭해 보시면 포트 포워딩 정보에 서버 접속용 공인 ip와 외부 포트가 있습니다.

  해당 정보를 아래 위치에 작성하고 Open!

  [MacOS putty 참고 블로그]

   - https://velog.io/@wlgus2134/MAC-PUTTY-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0

 

putty

10. 리눅스 관리자 계정은 root이고, password는 위에서 입력한 관리자 비밀번호로 접속이 가능합니다!

 

 

NCP 클라우드 플랫폼을 이용해서 아주 간편하게 Web Server를 구동시킬 수 있는 서버 한 대가 생성되었습니다!

공인 ip를 발급받아야지 저희가 구동시킨 Web Server에 접근할 수 있습니다.

다음 Step에서 Application를 개발하고 진행하도록 하겠습니다.

 

 

728x90
반응형

+ Recent posts