반응형

1. 시험환경

    ˙ AWS

    ˙ VPC, Subnet, NACL(Network Access Control List), Security Group, Routing, IGW, EC2

 

2. 목적

    ˙ AWS 콘솔에서 VPC, Subnet, NACL, 보안그룹 등을 이용하여 네트워크를 구성한다.

    ˙ Private Subnet에서 생성된 EC2에 접속하기 위한 AWS 네트워크 구성법을 알아보자. 

AWS 구성도

 

3. 적용

    ① VPC를 생성한다.

        - VPC 이름 : study-vpc

 

    ② VPC 안에서 서브넷(subnet) 2개를 생성한다.

        - 서브넷 이름 : study-public-subnet

        - 서브넷 이름 : study-private-subnet

 

    ③ 라우팅 테이블을 생성하고 명시적으로 서브넷에 연결한다.

        - 기본 라우팅 테이블 : study-private-routing

        - 라우팅 테이블 생성 : study-public-routing

 

    ④ Public Subnet에 인터넷 연결을 위한 인터넷 게이트웨이를 생성한다.

        - IGW : study-igw

 

    ⑤ NACL을 생성한다. (NACL은 stateless 성격을 갖으므로 Inbound/Outbound 모두 설정해야 한다.)

        - 기본 라우팅 테이블 : study-private-nacl

        - 라우팅 테이블 생성 : study-public-nael

        - 여기서는 모든 Inbound/Outbound를 허용하였다.

 

NACL 인바운드규칙 설정

 

    ⑥ 보안그룹(security group)을 설정한다.

        - ec2-public-sg : 모든 소스에 대하여 ssh 접속 포트 허용 설정

        - ec2-private-sg : 소스가 "ec2-public-sg"인 경우만 허용 설정 했음에 주의 (★중요)

보안그룹 생성

 

private 보안그룹의 인바운드는 public 보안그룹만 허용 설정

 

    ⑦ Public/Private 서브넷에서 각각 EC2를 생성한다.

Public Subnet 안에 있는 EC2는 외부 접속을 위해 퍼블릭 IP 할당

 

Private Subnet 안에 있는 EC2는 외부 접속 차단을 위해 프라이빗 IP만 할당

 

4. 결과

    ˙ Public 서브넷에 있는 EC2에 접속한 후 Private 서브넷에 있는 EC2를 접속한다.

 

반응형
반응형

1. 시험환경

    ˙ AWS

 

2. 목적

    ˙ AWS Lambda 서비스(함수)를 생성한다.

    ˙ AWS Lambda 함수를 트리거 하기위해 API Gateway를 생성한다.

    ˙ API Gateway에 등록한 URL에 의하여 AWS Lambda 서비스(함수)가 실행되는지 확인한다.

 

3. 적용

    ① AWS Lambda 함수를 생성한다.

 

    ② 람다함수의 코드를 생성하고 "Deploy" 버튼을 클릭한다.

        - Deploy 마다 Log Stream이 1개씩 생성되어 로그가 남겨진다.

 

    ③ AWS Lambda를 실행하기 위한 "트리거 추가" 버튼을 클릭한다.


    ④ 설정정보를 입력하고 "API 게이트웨이"를 생성한다.

 

    ⑤ AWS Lambda 함수에 API Gateway가 연동된 것을 확인한다.

 

    ⑥ API Gateway 기본 경로에 추가 경로 및 방식(ANY, GET, POST 등)을 구성할 수 있다.

 

    ⑦ API Gateway 기본경로에 AWS Lambda 서비스 연결을 설정한다.

 

    ⑧ API Gateway 세부정보에서 URL을 확인한다.

 

4. 결과

    ˙ 트리거 입력에 의하여 AWS Lambda 서비스가 호출되는지 확인한다.

        - URL : http://[API-Gateway-URL]/[기본경로]

 

반응형
반응형

1. 시험환경

    ˙ EC2, 대상그룹(Target Group)

    ˙ ALB(ELB)

    ˙ Route 53

    ˙ ACM(AWS Certificate Manager)

 

2. 목적

    ˙ ELB의 대상그룹(Target Group)을 생성하고 대상그룹 안에 EC2 인스턴스를 할당하는 방법을 알아보자.

    ˙ ELB 인스턴스를 생성하고 대상그룹(Target Group)을 설정하는 방법을 알아보자.

    ˙ Route 53에 도메인을 등록하고 ELB 인스턴스를 설정하는 방법을 알아보자.

    ˙ Route 53에 TLS(https) 인증서를 적용하는 방법을 알아보자.

    ˙ 아래와 같은 구성으로 개발한 웹서비스를 제공할 수 있는지 알아보자.

서비스 구성도

 

3. 적용

    ① 대상그룹(Target Group) 생성(create) 버튼을 클릭하여 이름 및 서비스 프로토콜/포트를 입력한다.

        - Traget group name : 대상 그룹 이름

        - Protocol, Port : EC2의 서비스 프로토콜 및 포트

 

    ② 대상그룹(Target Group)에 포함할 "running 상태의 EC2" 및 서비스 포트를 선택하고 대상그룹을 생성한다.

        - EC2의 Listening Port는 3000으로 설정하였다. (서비스 마다 다름)

대상그룹(Target Group)에 포함할 EC2(running) 선택
Target Group 생성 결과
설정 부분 (빨간색 박스)

 

    ③ ALB(Application Load Balancer)를 생성한다.

 

    ④ ALB 의 Listener/Forward 규칙을 설정한다.

        - Listener : HTTP / 80

        - Action : 대상그룹(Target Group) 선택

 

설정부분 (빨간색 박스)

 

    ⑤ Route 53에 등록된 도메인과 ELB를 연결한다.

        - 별칭 : 활성화

        - 트래픽 라우팅 대상 : ALB

설정부분 (빨간색 박스)

 

    ⑥ TLS(https)를 적용할 도메인 정보를 입력하여 인증서를 발급한다.

 

    ⑦ 도메인 소유권 인증을 위해 생성된 이름/값을 Route 53에서 CNAME으로 등록한다.

설정 부분 (빨간색 박스)

 

4. 결과

    ˙ DNS 도메인을 입력하여 서비스 되는지 확인한다.

 

반응형
반응형

1. 시험환경

    ˙ Github

    ˙ Ubuntu v20.04

    ˙ Docker, Docker Hub

    ˙ Spring Boot Project

 

2. 목적

    ˙ Github에서 Spring Boot Project를 다운로드(pull) 한다.

    ˙ Spring Boot Project가 정상적으로 빌드(build) 되어 결과 파일(war, jar)가 생성되는지 확인한다.

    ˙ build.gradle 파일에서 JIB 라이브러리 추가 및 JIB 영역을 작성한다.

    ˙ JIB을 이용하여 Spring Boot Project를 Docker Image 빌드 및 Docker Hub에 업로드(push) 한다.

    ˙ Docker Hub에서 다운로드(pull) 하고 컨테이너를 실행하여 동작여부를 확인한다.

 

3. 적용

    ① Spring Boot 프로젝트를 생성한다.

        - Git Clone 명령어 : git clone [repository] .

        - Repository :  https://github.com/silkWater/template-gradle-springboot.git

 

GitHub - silkWater/template-gradle-springboot

Contribute to silkWater/template-gradle-springboot development by creating an account on GitHub.

github.com

 

    ② 프로젝트 빌드(Gradle) 명령어 실행 후 BUILD SUCCESSFUL 및 결과 파일이 생성된 것을 확인한다.

        - JIB Build와 상관없이 해당 프로젝트의 빌드(Gradle Build)가 정상적으로 SUCCESS 되는지 확인하기 위한 단계이다.

        - Gradle 빌드 명령어 : $ gradle build --info

        - 빌드 파일 경로 : $ (pwd)/build/libs/[파일명].war

 

    ③ build.gradle 파일에서 JIB 라이브러리를 추가하고 빌드 명세(기존 Dockerfile 역활)를 작성한다.

        - plugins 추가 : id 'com.google.cloud.tools.jib' version '3.1.4'

        - 빌드 명세 작성 (기존 Dockerfile 역활) : jib { ... }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
plugins {
        id 'org.springframework.boot' version '2.7.1'
        id 'io.spring.dependency-management' version '1.0.11.RELEASE'
        id 'java'
        id 'war'
        id 'com.google.cloud.tools.jib' version '3.1.4'
}
 
group = 'com.boot.template'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
 
configurations {
        compileOnly {
                extendsFrom annotationProcessor
        }
}
 
repositories {
        mavenCentral()
}
 
dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-web'
        compileOnly 'org.projectlombok:lombok'
        annotationProcessor 'org.projectlombok:lombok'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
        implementation 'javax.servlet:jstl'
        implementation "org.apache.tomcat.embed:tomcat-embed-jasper"
}
 
tasks.named('test') {
        useJUnitPlatform()
}
 
jib {
        from {
                image = 'adoptopenjdk/openjdk11:alpine-jre'
        }
        to {
                image = 'silkwater/boot-template'
                tags = ['1.0']
        }
        container {
                entrypoint = ['java''-Dspring.profiles.active=template''-jar''template-0.0.1-SNAPSHOT.war']
                // mainClass = 'com.test.StartApplication'
                jvmFlags = ['-Xms512m''-Xmx512m''-Xdebug''-XshowSettings:vm''-XX:+UnlockExperimentalVMOptions''-XX:+UseContainerSupport']
                ports = ['8080']
 
                environment = [SPRING_OUTPUT_ANSI_ENABLED: "ALWAYS"]
                labels = [version:project.version, name:project.name, group:project.group]
                creationTime = 'USE_CURRENT_TIMESTAMP'
                format = 'Docker'
        }
        extraDirectories {
                paths {
                        path {
                                from = file('build/libs')
 
                        }
                }
        }
}
cs

 

     Docker Hub에 업로드(push) 권한을 얻는다.

        - $ docker login

 

    JIB 명세에 의하여 Spring Boot 프로젝트를 docker image 빌드 및 정의된 Repository로 업로드(push) 한다.

        - Gradle JIB 빌드 명령어 : $ ./gradlew jib

 

    JIB(to)에서 지정한 Repository에 Docker Image가 업로드(push) 되었는지 확인한다.

        - Docker Hub Repository 전/후 비교

 

     Docker Hub로부터 이미지를 다운로드(pull) 받아 실행한다.

        - docker pull [repository]/[image]:[tag]

 

4. 결과

    ˙ HTTP 접속하여 서비스가 동작하는지 확인한다.

반응형
반응형

1. 시험환경

    ˙ Github

    ˙ Ubuntu v20.04

    ˙ Docker, Docker Hub

    ˙ Spring Boot Project

 

2. 목적

    ˙ Github에서 Spring Boot Project를 다운로드(pull) 한다.

    ˙ Spring Boot Project가 정상적으로 빌드(build) 되어 결과 파일(war, jar)가 생성되는지 확인한다.

    ˙ Dockerfile을 이용하여 Spring Boot Project를 Docker Image로 빌드한다.

    ˙ Docker Image를 Docker Hub에 업로드(push) 한다.

    ˙ Docker Hub에서 다운로드(pull) 하고 컨테이너를 실행하여 동작여부를 확인한다.

 

3. 적용

    ① Spring Boot 프로젝트를 생성한다.

        - Git Clone 명령어 : git clone [repository] .

        - Repository :  https://github.com/silkWater/template-gradle-springboot.git

 

GitHub - silkWater/template-gradle-springboot

Contribute to silkWater/template-gradle-springboot development by creating an account on GitHub.

github.com

 

    ② 프로젝트 빌드(Gradle) 명령어 실행 후 BUILD SUCCESSFUL 및 결과 파일이 생성된 것을 확인한다.

        - Gradle 빌드 명령어 : $ gradle build --info

        - 빌드 파일 경로 : $ (pwd)/build/libs/[파일명].war

 

    ③ 프로젝트의 최상위 디렉토리에서 Dockerfile을 작성한다.

    ④ Dockerfile에 의하여 Spring Boot 프로젝트를 docker image로 빌드한다.

       - Gradle 빌드 명령어 : $ docker build -t [repository:tag] .

 

    ⑤ Docker Hub에 업로드(push) 권한을 얻는다.

        - $ docker login

 

    ⑥ DockerHub에 이미지를 업로드(push) 한다.

        - $ docker push [repository:tag]

 

    ⑦ Docker Hub의 지정한 Repository에 Docker Image가 업로드(push) 되었는지 확인한다.

        - Docker Hub Repository 전/후 비교

 

 

    ⑧ Local PC의 docker image를 삭제하고 Docker Hub로부터 이미지를 다운로드(pull) 받는다.

    ⑨ 도커(docker) 컨테이너(container)를 실행한다.

 

4. 결과

    ˙ HTTP 접속하여 서비스가 동작하는지 확인한다.

 

반응형
반응형

1. 시험환경

    ˙ 우분투(ubuntu) v20.04

    ˙ AWS AMI : 사용자 생성

    ˙ AWS ECR(Elastic Container Registry)

 

2. 목적

    ˙ AWS ECR(Elastic Container Registry) 저장소(repository)를 생성한다.

        - 참고: https://languagestory.tistory.com/211 ①~⑥

    ˙ AWS CLI 사용을 위한 사용자로 IAM user를 등록한다.

        - 참고: https://languagestory.tistory.com/211~⑩

    ˙ Docker Image를 생성한 ECR 저장소에 업로드(push) 한다.

    ˙ ECR 저장소에 등록된 이미지를 다운로드(pull) 받는다.

 

3. 적용

    ① 우분투(ubuntu) 리눅스 환경에서 AWS-CLI 패키지를 설치한다.

        - sudo apt install awscli

 

    ② 설치완료 후 동작 여부를 확인한다.

        - $ aws cli

 

    ③ AWS CLI 사용을 위해 IAM 사용자를 등록한다. (참고: https://languagestory.tistory.com/211)

        - Access Key, Secret Key, reging, type(json)을 차례대로 입력한다.

 

    ④ 등록한 AWS ECR에 권한(pull) 획득을 위해 AWS-ECR과 Docker 로그인한다.

        - $ aws  ecr  get-login-password  --region  [region]  |  docker  login  --username  AWS  --password-stdin  [ECR URL]

 

    ⑤ DockerHub에서 nginx 이미지를 다운로드(pull) 한다.

 

    ⑥ 다운받은 이미지를 AWS ECR Repository에 push하기 위해 tag명을 생성한다.

        - $ docker  tag   [기존 REPOSITORY:TAG]   [신규 REPOSITORY:TAG]

 

    ⑦ AWS ECR로 업로드(push) 한다.

        - $ docker  push  [업로드 이미지 REPOSITORY : tag]

 

4. 결과

    ˙ ECR Repository에 도커 이미지가 등록된 것을 확인한다.

 

    ˙ Local PC에서 Docker Image를 삭제(rmi)하고 AWS ECR에 등록된 이미지를 다운로드(pull) 받는다.

        - $ docker  pull  [repository/image:tag]

 

반응형
반응형

1. 시험환경

    ˙ 우분투(ubuntu) v20.04

    ˙ AWS IAM 사용자 생성

    ˙ AWS ECR(Elastic Container Registry)

 

2. 목적

    ˙ ECR 저장소(repository)를 생성한다.

    ˙ AWS CLI 사용을 위한 사용자로 IAM user를 등록한다.

    ˙ Docker Image를 생성한 ECR 저장소에 업로드(push) 한다.

    ˙ ECR 저장소에 등록된 이미지를 다운로드(pull) 받는다.

 

3. 적용

    ① AWS ECR(Elastic Container Registry) 서비스에서 "시작하기" 버튼을 클릭한다.

 

    ② private 저장소로 설정하고 레포지토리 이름을 등록한다.

        - 저장소(repository) 이름 : my-repo-nginx

 

    ③ 저장소(repository) 설정값은 비활성으로 한다. (과금 연관)

 

    ④ 등록한 이름으로 저장소(repository)가 생성되었다.

 

    ⑤ 저장소(repository)를 클릭하고 "푸시 명령 보기" 버튼을 클릭한다.

 

    ⑥ ECR Repository에 Push/Pull 하기 위한 명령어를 확인할 수 있다.


    ⑦ AWS CLI 접근권한을 갖기 위한 사용자를 생성한다.

 

    ⑧ 사용자 이름을 입력한다.

 

    ⑨ 생성할 사용자의 권한을 부여한다.

        - 여기에서는 빠른 테스트를 위해 관리자권한을 부여하였다.

 

    ⑩ 사용자를 생성한다.

 

4. 결과

    ˙ Docker 이미지를 저장하기 위한 ECR Repository를 생성하였다.

    ˙ AWS CLI 명령어를 통해 ECR Repository에 이미지 등록 권한을 갖는 IAM 사용자를 생성하였다.

    ˙ 다음 포스팅에서 ECR 저장소에 이미지를 pull/push 하기 위한 방법을 알아보자.

        - https://languagestory.tistory.com/212

 

 

 

반응형
반응형

1. 시험환경

    ˙ 우분투(ubuntu) 리눅스 v20.04

    ˙ docker

 

2. 목적

    ˙ 컨테이너(container)안에서 생성된 파일 및 데이터는 컨테이너 종료(rm)와 함께 삭제된다.

    ˙데이터 저장 전용 컨테이너(container)와 호스트(Host)를 이용하여 복합 저장소를 구성한다.

        - 여러 컨테이너(container)안에서 생성된 파일을 데이터 저장 전용 컨테이너(container)에 마운트한다.

        - 데이터 저장 전용 컨테이너(container)를 영구적인 저장소(volume)에 보관하기 위해 호스트에 마운트한다.

 

3. 적용

    ① -v 옵션과 함께 컨테이너(container)를 실행하면 Container의 저장소가 Host의 경로로 마운트 된다.

        - 마운트 target 경로 : Host의 $(pwd)/docker-nginx-html

        - 마운트 source  경로 : Container의 /usr/share/nginx/html

 

    --volumes-from  옵션과 함께 컨테이너(container)를 실행하면 지정경로를 다른 컨테이너(container, 데이터 저장 전용)에 마운트한다.

        - $ docker run -d --volumes-from [container(저장소)]  [image] 

 

    ③ nginx 컨테이너(conatiner) 안에 진입하여 파일을 생성한다.

        - "stupefied_joliot" 컨테이너(container) : test1.txt 파일 생성

        - "confident_heyrovsky" 컨테이너(container) :  test2.txt 파일 생성

 

    ④ 데이터 저장 전용 컨테이너(my-ubuntu)에 진입하여 다른 컨테이너(nginx)에서 생성한 파일이 저장되었는지 확인한다.

        - 마운트 경로 : /usr/share/nginx/html은 nginx 실행을 위해 미리 정의된 경로이다.

 

 

    ⑤ 생성된 모든 컨테이너를 삭제한다.

        - 모든 컨테이너 삭제 명령어 : $ docker rm $(docker ps -a -q)

 

4. 결과

    ˙ 컨테이너(conatiner)가 삭제되어도 Host 마운트 경로에 파일이 남아있는 것을 확인할 수 있다.

 

반응형

+ Recent posts