[위드마켓 개발기] Config Server 배포하기

Doccimann·2022년 5월 17일
1

위드마켓 개발기

목록 보기
3/10
post-thumbnail

🥰 이거 보면서 글을 읽으시면 많은 도움이 됩니다!

Docker를 이용해서 스프링 프로젝트 배포하기

Spring Cloud config server 작성하기


🌈 본격적으로 글을 작성하기 이전에

이번 포스트에서는, 본격적으로 프로젝트를 구성하기 이전에 Config Server를 private subnet 안에 심어서 설정 정보를 최대한 보안을 유지하며 가져오도록 환경을 갖춰보도록 하겠습니다.

Spring Cloud config 자체는 이전에 많이 설명을 하였기 때문에 여기서는 많은 부분을 생략하도록 하겠습니다.


🔥 우선 config server의 yml 파일을 먼저 생성하겠습니다.

저는 아래와 같이 작성해주었습니다. (중요한 부분들은 모두 가렸습니다)

server:
  port: 9500

spring:
  cloud:
    config:
      server:
        git:
          uri: my-ssh-uri
          default-label: main
          ignore-local-ssh-settings: true
          private-key: |
            -----BEGIN EC PRIVATE KEY-----
			my private key
            my private key
            my private key
            -----END EC PRIVATE KEY-----
          host-key: my-host-key
          host-key-algorithm: ecdsa-sha2-nistp256
        encrypt:
          enabled: false

encrypt:
  key: my-encrypt-key

management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    shutdown:
      enabled: true

이후에 main 함수에다가 @EnableConfigServer 어노테이션을 달아주고 실행을 시켜봤습니다.

2022-05-18 00:59:30.584  INFO 35921 --- [           main] .b.c.WIthMarketConfigServerApplicationKt : No active profile set, falling back to 1 default profile: "default"
2022-05-18 00:59:31.140  INFO 35921 --- [           main] o.s.cloud.context.scope.GenericScope     : BeanFactory id=873a9cf5-152e-3abc-954f-0041c88d17ad
2022-05-18 00:59:31.286  INFO 35921 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 9500 (http)
2022-05-18 00:59:31.291  INFO 35921 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2022-05-18 00:59:31.291  INFO 35921 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.62]
2022-05-18 00:59:31.347  INFO 35921 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2022-05-18 00:59:31.347  INFO 35921 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 732 ms
2022-05-18 00:59:31.797  INFO 35921 --- [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 16 endpoint(s) beneath base path '/actuator'
2022-05-18 00:59:31.840  INFO 35921 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 9500 (http) with context path ''
2022-05-18 00:59:31.853  INFO 35921 --- [           main] .b.c.WIthMarketConfigServerApplicationKt : Started WIthMarketConfigServerApplicationKt in 1.586 seconds (JVM running for 2.05)
2022-05-18 00:59:32.029  INFO 35921 --- [on(1)-127.0.0.1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2022-05-18 00:59:32.029  INFO 35921 --- [on(1)-127.0.0.1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2022-05-18 00:59:32.030  INFO 35921 --- [on(1)-127.0.0.1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms

정상적으로 동작하는 모습을 확인할 수 있습니다.

그러면 다음 차례는 Dockerfile 작성을 하면 됩니다.


🔥 Docker와 관련된 파일들을 작성해봅시다

Dockerfile은 아래와 같이 작성하면 됩니다. (저는 jdk 11을 기준으로 프로젝트를 생성했습니다)

FROM openjdk:11-jdk

ARG JAR_FILE=./build/libs/configserver-0.0.1-SNAPSHOT.jar

COPY ${JAR_FILE} app.jar

ENTRYPOINT ["java","-jar","/app.jar"]

그리고 docker-compose.yml은 아래와 같이 작성해주면됩니다.

version: "3"
services:
  web:
    image: nginx
    ports:
      - 80:80
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
    depends_on:
      - spring
  spring:
    build: .
    ports:
      - 9500:9500

이렇게 dockerfile과 docker-compose.yml을 작성해주게 되면 docker가 컨테이너 상에서 아래와 같이 동작을 하게 될겁니다.

  • nginx는 Http 요청을 받아서 수행한다
  • spring으로 작성된 application은 외부에서 9500번 포트로 들어오면 내부의 9500 포트로 포워딩해서 신호를 처리한다

다음으로 할 행동은, 이제 지금까지 작성한 내용들을 모두 github repository 상에 push를 해주고 private subnet 내부의 ec2에 밀어넣으면 됩니다.


🔥 이제 ec2 설정을 시작합시다

우선 ec2에 jdk, docker, docker-compose를 모두 설치합니다. 아래의 링크를 참고하시면 됩니다.

Docker를 이용해서 스프링 프로젝트 배포하기

설치를 모두 완료하셨다면, 프로젝트를 clone해서 받아오시면 되겠습니다.

프로젝트는 private repository로 존재할 것이기 때문에, ecdsa 기반의 pub key를 github에 등록을 시켜주시고, clone을 받아오시면 되겠습니다.

Config Server의 경우 매우 예민한 정보들을 담고있기 때문에 무조건 private repository로 작업을 하셔야합니다

clone을 받아오셨다면, 아래의 커맨드를 입력해줘서, 시스템이 시작할 때마다 docker를 무조건 실행하도록 설정합니다.

$ sudo systemctl enable docker

그리고 docker를 user 권한으로 실행할 수 있도록 아래의 커맨드를 입력합니다.

$ sudo usermod -aG docker ec2-user

다음으로, 프로젝트의 루트 폴더에서 아래의 커맨드를 입력하여 nginx 설정 파일을 생성합니다.

$ mkdir nginx
$ mkdir nginx/conf.d
$ cd nginx/conf.d
$ sudo vim app.conf
server {
    listen 80;
    access_log off;

    location / {
        proxy_pass http://spring:8080;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

위의 설정 파일을 통해 nginx는 80번 포트로 들어오는 패킷을 수신할 수 있습니다.

이제 본격적으로 프로젝트를 띄워보겠습니다.


🔥 프로젝트를 띄워봅시다

우선 프로젝트를 빌드하겠습니다.

$ sudo chmod + ./gradlew
$ ./gradlew build

docker를 실행하겠습니다.

$ systemctl start docker

docker-compose를 통해 프로젝트를 올립니다.

$ docker-compose up --build -d

이제 private subnet 내에서 제대로 동작하는지 체크를 해야합니다.

동일 vpc 내부에 있는 아무 public subnet의 ec2에 들어가서 GET 요청을 날려보겠습니다.

$ curl -X GET http://[IP]:9500/[name]/[profile]

예를 들어서, repository에 있는 yml 파일의 이름이 application-dynamo.yml인 경우. 아래와 같이 요청을 하면 됩니다.

$ curl -X GET http://[IP]:9500/application/dynamo

그러면 아래와 같이 응답이 오는 경우 성공입니다.

{
  "name": "application",
  "profiles": [
    "dynamo"
  ],
  "label": null,
  "version": "version",
  "state": null,
  "propertySources": [
    {
      "name": "git-ssh-address/application.yml",
      "source": {
        "aws.dynamo.credentials.access-key": "{cipher}encrypted-access-key",
        "aws.dynamo.credentials.secret-key": "{cipher}encrypted-secret-key"
      }
    }
  ]
}

🌲 글을 마치며

다음 포스트에서부터는 본격적으로 프로젝트를 작업하는 것에 관해서 포스트가 올라갈 예정입니다.

긴 글 읽어주셔서 감사합니다!

profile
Hi There 🤗! I'm college student majoring Mathematics, and double majoring CSE. I'm just enjoying studying about good architectures of back-end system(applications) and how to operate the servers efficiently! 🔥

0개의 댓글