지식 공유 📚

    [AWS] rsync 말고 datasync ! - EFS Data 이전

    EFS (Elastic File System) 은 AWS 의 파일 시스템 서비스입니다. EBS, S3 처럼 데이터를 저장할 수 있습니다. 하지만 각각 쓰임의 목적이 다르기 때문에 자신의 목적에 맞게 잘 사용하여야 합니다. EFS S3 EBS 사용 케이스 프라이빗 이미지 레지스트리 엔터프라이즈급 데이터 백업 웹 서비스 및 컨텐츠 EC2 의 부팅 볼륨 그리고 AWS DataSync 를 이용하면 저장소의 데이터들을 다른 곳으로 옮길 수 있습니다. 같은 VPC 내 저장소는 물론 다른 VPC, 교차 계정 모두 가능합니다. ✅ 다른 VPC, 교차 계정은 서로의 VPC 가 Peering 되거나 TGW 로 sharing 된 상태여야 합니다 자세한 동작 방식은 확인하려며 여기를 눌러주세요 그럼 간단하게 한번 DataSy..

    [Kubernetes] User Account 랑 Service Account 가 다른거였어?

    쿠버네티스를 공부하면서 처음 User Account 와 Service Account 를 접했을 때 단순히 쿠버네티스 API 서버에게 자격 증명하는 리소스인가보다 하고 넘어갔던 적이 있습니다. 이해가 안되서 그냥 넘어갔던.. 그래서 User Account 랑 Service Account 는 비슷한거 !! 같은 거 !! 라는 생각을 가지고 있었죠.. 하지만 이 둘은 분명 다릅니다. 쿠버네티스에는 쿠버네티스 내에 존재하는 자원에 대한 접근을 위한 2가지의 account 타입이 존재합니다. User Account Service Account 쿠버네티스 공식 문서에는 이와 같이 나와있습니다. 사용자 어카운트는 사람을 위한 것이다. 서비스 어카운트는 파드에서 실행되는 프로세스를 위한 것이다. 100% 맞는 말이지만..

    [K8S] EKSCTL 를 이용한 EKS 구성

    🔗 eksctl 깃헙 🔗 eksctl 공식 문서 🔗 eksctl config file example eksctl 설치 curl --silent --location "(uname -s)_arm64.tar.gz" | tar xz -C /tmp sudo mv /tmp/eksctl /usr/local/bin eksctl version EKS 구성 eks 는 아마존의 쿠버네티스 서비스이며, eksctl 은 eks 를 쉽게 구성할 수 있도록 도와주는 커맨드 툴 eksctl 공식 문서는 굉장히 친절한 편이라고 생각 💡 eksctl 은 EKS 를 위한 커맨트 툴이므로 aws configure 가 된 상태여야 함 aws 로그인 aws configure 1. Using Config Files (가장 기본) apiVersi..

    [AWS] S3 퍼블릭 액세스 차단을 활성화 하면서 객체에 접근하는 방법을 알아보자!!

    S3는 퍼블릭 액세스 차단 기능을 이용하여 버킷 내 객체에 대한 접근을 제한 할 수 있습니다. 퍼블릭 액세스 차단을 활성화 하게 되면 자원을 안전하게 보호할 수 있지만, 외부에서 접근이 불가능해 s3 객체에 접근할 수 없습니다. 따라서 S3는 퍼블릭 액세스 차단을 하면서 외부에서 접근할 수 방법을 제공해주는데, 그 방법에 대해 알아보고자 합니다. Pre-Signed-URL 을 이용하여 S3 객체 업로드(PUT)/다운로드(GET) 하기 Pre-Signed-URL 을 이용하여 S3 객체 업로드(PUT)를 진행하고, 다운로드는 서버를 프록시로 두어 서버에서 S3에 접근하여 다운로드(GET)하기 Pre-Signed-URL 을 이용하여 S3 객체 업로드(PUT)를 진행하고, 다운로드는 goofys를 사용하여 S3..

    [Kotlin] 데이터 집합 표현에 data 한정자를 사용하라

    이 글의 내용은 [이펙티브 코틀린]을 참고합니다. 때로는 데이터를 한꺼번에 전달해야 할 때가 있습니다. 아래 코드처럼 말이죠. data class Player( val id: Int, val name: String, val points: Int ) val player = Player(0, "Gecko", 9999) data 한정자는 아래의 함수들을 자동으로 생성해줍니다. toString equals 와 hashCode copy componentN(component1, component2 등) toString 클래스의 이름과 기본 생성자 형태로 모든 프로퍼티와 값을 출력 해줍니다. 주로 로그 출력이나 디버깅 할때 사용합니다. println(player) // Player(id=0, name=Gecko, p..

    [Spring] Security +Google Oauth2 + JWT 구현하기 (4) - JWT 재발급 해주기

    이어서 계속 구현해보겠습니다. 구현 자체가 목적이므로 자세한 설명을 생략합니다. JWT 생성하기 JWT에 권한 추가해주기 생성한 JWT에 대해 인증/인가 하기 JWT 재발급 해주기 (진행) 구현 AuthController @RestController @RequestMapping("/auth") class AuthController( private val authService: AuthService ) { /** * token 생성해서 보내주기 */ @GetMapping("/login") fun login(@AuthenticationPrincipal oAuth2User: OAuth2User): ResponseEntity { return ResponseEntity.ok(authService.login(oAu..

    [Spring] Security +Google Oauth2 + JWT 구현하기 (3) - 생성한 JWT에 대해 인증/인가 하기

    이어서 계속 구현해보겠습니다. 구현 자체가 목적이므로 자세한 설명을 생략합니다. JWT 생성하기 JWT에 권한 추가해주기 생성한 JWT에 대해 인증/인가 하기 (진행) JWT 재발급 해주기 구현 JwtFilter class JwtFilter( private val jwtProvider: JwtProvider ) : OncePerRequestFilter() { override fun doFilterInternal( request: HttpServletRequest, response: HttpServletResponse, filterChain: FilterChain ) { val jwt = jwtProvider.resolveToken(request) if (StringUtils.hasText(jwt) && ..

    [Spring] Security +Google Oauth2 + JWT 구현하기 (2) - JWT에 권한 추가해주기

    이어서 계속 구현해보겠습니다. 구현 자체가 목적이므로 자세한 설명을 생략합니다. JWT 생성하기 JWT에 권한 추가해주기 (진행) 생성한 JWT에 대해 인증/인가 하기 JWT 재발급 해주기 구현 @Component class JwtProvider( private val memberRepository: MemberRepository ) { companion object { private const val AUTHORITIES_KEY = "auth" private const val BEARER_TYPE = "bearer" private const val ACCESS_TOKEN_EXPIRE_TIME = (1000 * 60 * 30) private const val REFRESH_TOKEN_EXPIRE_TIME..

    [Spring] Security +Google Oauth2 + JWT 구현하기 (1) - JWT 생성하기

    이번 글에서는 Spring Security + Google Oauth2 + JWT를 구현해보겠습니다. 구현 자체가 목적이므로 자세한 설명을 생략합니다. 진행하기 앞서 Google Oauth2 Client_ID, Client_Secret는 개인적으로 받으시길 바랍니다 :) 아래와 같은 순서로 진행됩니다. JWT 생성하기 (진행) JWT에 권한 추가해주기 생성한 JWT에 대해 인증/인가 하기 JWT 재발급 해주기 이번 글에서는 JWT 생성하는 부분에 대해 진행합니다. 구현 build.gradle.kts import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { id("org.springframework.boot") version "2.6.8" id("..

    [Kotlin] 제네릭 타입과 variance 한정자를 활용하라

    재사용을 위한 과도한 유연성 다양한 타입에 동일한 로직을 적용하기 위해 코드 재사용을 과도하게 하려는 경우가 있습니다. 파라미터를 전부 Any로 받는 것이 대표적인 예시입니다. open class Car class K3 : Car() class Avante : Car() //“차에 대한 설명서” 함수 fun getInstruction(car: Array) { println("car = ${car.size}") } 많이 극단적인 예제이기는 합니다.. open class Fruit class Apple : Fruit() fun main() { val k3 = K3("k3", "기아") val avante = Avante("아반떼", "현대") val fruits: Array = arrayOf(Apple())..

    [Java] 스프링을 왜 사용할까?(2) - OCP와 DIP 해결 By 순수 자바

    지난 포스팅에서는 OCP와 DIP가 위배 되는 경우에 대해서 알아보았습니다. 이번에는 스프링이 아닌 순수 자바로 해결해보겠습니다. 잠깐 지난 글의 클래스 다이어그램을 살펴보겠습니다. public class DriverImpl implements Driver{ Car car = new K3(); Engine engine = new Electronic(); @Override public void findOwnCarDetail() { car.findCarName(); car.findCarBrand(); engine.WayToMove(); } } DriverImpl 역할에 구현체가 직접 new 키워드로 선언 되어 있습니다. 이럴 경우 얼핏보면 OCP와 DIP를 잘 지킨 것 같지만 사실 아니라고 지난 포스팅에서 ..

    [Java] 스프링을 왜 사용할까?(1) - OCP와 DIP의 위배

    바늘과 실처럼 자바하면 바로 떠오르는 것이 있습니다. 바로 "객체 지향 언어" 라는 것입니다. "객체 지향"이란 레고라고 생각할 수 있습니다. 레고 블록들을 조립하여 우리는 무엇이든 만들 수 있습니다. 레고를 이용해서 동물원을 만들었다고 생각해보겠습니다. 동물원에는 레고로 만들어진 사자도 있고, 호랑이도 있고, 코끼리도 있고, 제가 좋아하는 판다도 있습니다. 하지만 슬프게도 더 이상 호랑이가 인기가 없어서 고릴라 레고로 바꾸고 싶습니다. 이럴 경우 우리는 쉽게 동물원에서 호랑이 레고를 빼고 고릴라 레고를 넣어주면 됩니다. 여기서 호랑이, 고릴라가 객체가 되는 것입니다. 호랑이를 뺀 다고 해서 기존에 있던 사자나 판다 레고는 전혀 영향이 없습니다. 만약 라이거 레고를 만들고 싶다고, 호랑이와 사자를 마구잡..

    [Kubernetes] CKA Certification 취득 후기 및 Tips

    새해 목표 중 하나였던 'CKA Cer 취득'을 달성하면서 순조롭게 새해를 시작하네요 CKA를 어떻게 준비하고 어떻게 취득을 했는지에 대해 간단하게 설명해보려고 합니다! 설명하면서 그때 그때 Tip에 대해서도 설명합니다 목차 CKA란? CKA 접수 방법 CKA 공부 방법 CKA 실제 시험 응시 CKA 취득 후기 Tips CKA란? 요약하자면 CKA(Certified Kubernetes Administrator)는 Kubernetes 관리자로서 K8S를 수행할 수 있는 기술, 지식 및 역량을 갖추고 있음을 보증하는 자격증입니다. 리눅스 파운데이션에서 발급해주며 CKAD, CKA, CKS로 등급이 나뉩니다. 3개는 각각 별도의 시험이며 CKAD(쉬움), CKA(보통), CKS(어려움)으로 보시면 됩니다. 또..

    [Docker] Mysql 컨테이너 sql-mode 관련 설정 with ONLY_FULL_GROUP_BY 에러 해결하기

    도커 허브에 올라온 공식 MySql 컨테이너를 실행하면 언제 어디서든 아주 쉽게 동일한 MySql 환경을 구축할 수 있습니다. MySql 컨테이너는 8 버전으로 진행했습니다. 공식 도커 허브에 나와있는 설명대로 하면 1분도 안되서 MySql 환경을 누구나 만들 수 있습니다. 하지만 단순히 아래와 같은 명령어로 컨테이너를 만들면 안되고 볼륨도 마운트 해야하고 MySql에서의 시간, 시스템 환경 변수 등도 설정해주어야 합니다. $ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag 그 중 이번 글에서 sql-mode 라는 MySql에서 사용되는 시스템 변수에 대해 알아보겠습니다. sql-mode란? MySql에 저장될 데..

    [Linux] VM을 NFS로 사용하기

    NFS란 무엇인가요? 공유된 원격 호스트의 파일을 로컬에서 사용할 수 있도록 개발된 파일 시스템을 네트워크 파일 시스템(Network File System, NFS)이라고 합니다. 전통적인 유닉스 환경에서는 오랫동안 네트워크에서 자료를 공유하는 방법으로 NFS를 사용했습니다. NFS 서버가 파일을 공유하면 NFS 클라이언트가 공유한 디렉터리를 마운트해서 원격 호스트(NFS 서버)의 파일을 사용합니다. NFS는 손쉽게 파일을 공유할 수 있다는 장점이 있지만 보안에 취약하다는 단점이 있습니다. NFS로 공유한 파일에는 일반적인 소유권과 접근 권한이 그대로 적용됩니다. 원격 시스템에서 어떤 사용자가 파일 소유자와 같은 UID로 공유 디렉터리에 접근해서 파일을 마음대로 사용할 수 있습니다. 루트 권한이 부여된 ..

    [K8S] 파일(.yaml)에서 문자열 검색 한 후 그 문자열의 라인 넘버 가져오기

    설명은 필요없고 결론만 알고 싶은 분들을 위한 $ sed "$(grep -n 'image:' nginx.yaml | grep -Eo '^[^:]+')s/nginx:1.0/nginx:2.0/g" nginx.yaml 본문의 기능이 필요한 상황 예시 위 이미지는 개발자가 코드를 커밋한 후 자동으로 k8s cluster에 배포되기 까지의 과정을 파이프라인으로 도식화한 이미지입니다. 개발자가 운영 중인 서비스에 새로운 기능을 추가하거나 버그를 수정 했다고 가정해봅시다. 그렇게 될 경우 GitOpsRepo의 있는 컨테이너 이미지의 버전 또한 바꿔주어야 합니다. 그렇게 될 경우 젠킨스에서 GitOps Repo에 push를 할 때 새롭게 만든 컨테이너 이미지의 버전으로 수정해줘야 합니다. 그래야 argoCD에서 git..

    [K8S]unable to fetch the kubeadm-config ConfigMap: failed to get config map: UnauthorizedTo see the stack trace of this error execute with --v=5 or higher 에러

    만약 kubeadm을 통해 master에 node join을 시도할 경우 아래와 같이 오류가 난다면 ubuntu@node:~$ sudo kubeadm join 192.168.241.92:6443 --token 4rlhh1.4dehcs172qy9enyj --discovery-token-ca-cert-hash sha256:b5347bb4959f63e6100142700db4b7d69ea0d860c332265a1748cef29698f814 [preflight] Running pre-flight checks [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd"..

    [Kubernetes] kubeadm 이용하여 k8s Cluster 배포하기(공식문서 위주)

    AWS EKS 나 GCP GKE를 이용하면 어렵지 않게 쿠버네티스 클러스터를 구축할 수 있지만 퍼블릭 클라우드를 이용하지 않고 온프레미스 환경에서 쿠버네티스 클러스터를 구축하기란 쉬운 일은 아닙니다. (최소 저한테는 ㅜㅜ) 그래서 이번 글에서는 k8s 공식 문서를 보고 온프레미스 환경에서 클러스터를 구축해보겠습니다. 클러스터 구축에 초점을 맞춰서 k8s 와 k8s 내 오브젝트들에 대한 설명을 생략하겠습니다. 또한 마스터 노드와 워커 노드에서 수행할 행위가 다르므로 각 부분마다 표시하겠습니다. 그리고 반드시 진행 순서는 지켜주셔야 합니다. 만약 설치 하시다가 잘못된 느낌이 든다면 kubeadm reset 명령어를 통해 리셋해주시고 다시 진행하시기 바랍니다. 우선 미리 준비되어야 할 환경은 아래와 같습니다...

    [Network] netstat 명령어를 이용한 라우팅 테이블 확인

    https://reboot.co.kr/13.html 1.라우팅 테이블이란 내 PC를 가지고 할수 있는 일은 다음과 같다. 1) 옆자리에 앉아 있는 사람과 IPX로 스타크래프트를 한다. 2) 미국에 있는 마이크로 소프트사의 홈페이지에 접속한다 reboot.co.kr 1.라우팅 테이블이란 내 PC를 가지고 할수 있는 일은 다음과 같다. 1) 옆자리에 앉아 있는 사람과 IPX로 스타크래프트를 한다. 2) 미국에 있는 마이크로 소프트사의 홈페이지에 접속한다. 3) 기타 .. 그렇다면, 어떻게해서 내 PC는 옆자리와 미국의 PC를 구분해서 찾아나가게 되는것일까 ? 옆에있는 PC는 당연히 옆에 있으니까 바로 연결되는것이다라고 생각하는 분은 PC의 마음을 헤아리지 못한것이다. PC는 자신의 라우팅 테이블을 가지고 다..

    [Linux] Add Directory to $PATH in Linux

    When you type a command on the command line, you’re basically telling the shell to run an executable file with the given name. In Linux, these executable programs like ls , find , file and others, usually live inside several different directories on your system. Any file with executable permissions stored in these directories can be run from any location. The most common directories that hold ex..

    [Jenkins] How to use SED in a Jenkins Pipeline

    How to use SED in a Jenkins Pipeline how to use sed in jenkinsfile devopsian.net Have you ever had a task to update a single line in a file? There few utilities to help with that task, and I find sed superior on the alternatives. sed is a stream editor, with which you can modify files. It’s a great utility in your toolbox. If you’re unfamiliar with it, here’s a [link for a quick intro. I had to ..

    [Docker] 컨테이너 설정 오류로 인한 실행불가 상태에서 컨테이너 수정하기

    톰캣 이미지가 설치된 컨테이너를 run으로 실행할 경우 docker run --name tomcat8 -i -t -d -p 8088:8080 tomcat-set1 톰캣이 자동으로 실행되면서 발생한 오류로 Docker 컨테이너가 실행되지 않았다. 아래 명령어로 컨테이너 에러 로그를 열어 보았고 docker logs -t CONTAINER ID 원인은 톰캣 실행시 server.xml에 설정한 경로가 존재하지 않아서 였다. server.xml을 수정해야 하는데 컨테이너 자체가 실행되지 않기 때문에 방법을 고민하다가 결국 구글에 검색해보니 스택오버플로우의 이 글의 답변 중 적절한 해결 방법을 찾았다. 해결방법 컨테이너는 정지 상태에 있지만 안에 있는 파일을 호스트OS로 복사할 수 있었다. 파일을 복사해와서 안에..

    [Jenkins]젠킨스 파이프라인 정리 - Scripted 문법

    보호되어 있는 글입니다.

    [Docker] 컨테이너 시간 변경 방법

    docker 컨테이너 시간바꾸기 -컨테이너 접속 후 # dpkg-reconfigure tzdata - 한국 서울 기준 6(Asia) -> 68(Seoul) 선택 # date로 변경된 시간 확인 후 docker 재시작

    [Linux] dig 명령어와 사용법

    dig (domain information groper) 란? dig는 네트워크 관리 도구 중 하나로 DNS (Domain Name System) 를 질의할 수 있는 도구입니다. nslookup 도구를 사용하여 DNS 를 질의할 수 있지만, 보다 더 편한 인터페이스와 사용법을 제공합니다. 이와 더불어 IDN (Internationalized Domain Name) 쿼리를 지원합니다. (nslookup도 지원) dig 설치 최근 OS들에는 dig 커맨드가 기본으로 설치되어 있습니다. 만약, dig 커맨드가 없을 경우 아래의 방법으로 설치하면 됩니다. Mac brew install dig Windows 첫 번째 방법으로는, ISC 다운로드 에 접속하여 다운로드 할 수 있습니다. windows dig 설치 두..

    [K8S] EKS 클러스터 인증(authenfication) 및 권한(authorization) 설정하기

    쿠버네티스 API 요청 과정 간단하게 API Server에 접근하기 까지 프로세스를 보면, 첫번째, 요청을 보냈을 때 인증(Authentication) 과정을 거친다. "너는 k8s cluster에 등록된 사용자가 맞는거지?" 두번째, 인증 과정을 통과한 후 인가(Authorization) 과정을 거친다. "등록된 사용자는 맞고 이 액션을 할 수 있는 권한은 있니?" 세번째, 인증과 인가를 통과하게 되면 Admission Control을 거친다. "너가 보낸 요청을 적절한지 확인해볼까?" 이 과정을 무사히 마치면 "요청 승인"이 된다. 하지만 만약 한 과정이라도 적절치 않다면 "요청 반려"가 된다. 그럼 본격적으로 AWS EKS를 이용하여 만든 클러스터에 최초 생성한 IAM 사용자가 아닌 새롭게 만든 I..

    [Kubernetes] 쿠버네티스 Docker Hub-Private Image 가져오는 방법

    쿠버네티스 Docker Hub-Private Image 가져오는 방법 Private Image를 가져와야 할 때 쿠버네티스의 secret을 이용하면 됩니다. 이 글에서는 Docker Hub을 기준으로 작성 합니다. 우선 Private Image 가져오는 방법인 만큼 아래와 같이 이미 Docker Hub에 이미지가 등록되어 있다는 가정하에 진행 합니다. 쿠버네티스 매니페스트 파일 작성 저는 아래와 같이 간단한 Deployment를 설정해주는 매니페스트 파일(.yaml)을 작성 하였습니다. Private Image를 가져와서 사용할 매니페스트 파일을 vi편집기로 여신 후 spec.template.spec.ImagePullSecrets.name 필드에 임의의 값을 설정 해줍니다. 이 값은 이후 생성할 secr..

    [Kubernetes] Cert manager Kubernetes 통신 암호화 및 자동화

    Cert-manager란? Cert-manager는 Kubernetes 내부에서 HTTPS 통신을 위한 인증서를 생성하고, 또 인증서의 만료 기간이 되면 자동으로 인증서를 갱신해주는 역할을 하는 Certificate manager controller입니다. 쉽게 말해 Kubernetes 내에서 외부에 존재하는 Issuers를 활용하거나 selfsigned Issuer를 직접 생성해서 생성하여 Certificate를 생성하고, 이때 생성된 Certificate를 관리하며 인증서의 만료 시간이 가까워지면 인증서를 자동으로 갱신해줍니다. Cert-manager가 사용하는 외부에 존재하는 Issuer는 아래의 이미지와 같은데, 대표적인 Issuer로 무료로 사용되고 있는 let's enscrypt를 많이 사용하..

    [MySQL] 덤프 / 임포트 하기 Dump / Import

    Import $ mysql -u계정 -p 데이터베이스명 파일을 저장할 위치/파일명 ex) $ mysqldump -uroot -p1234 databasename > dump.sql 특정 테이블만 dump하기 (임포트는 어차피 똑같이 테이블을 DB에 import 하는거니까 위와 동일) $ mysqldump -u 계정 -p 데이터베이스명 테이블명 > 파일을 저장할 위치/파일명 ex) $ mysqldump -uroot -p1234 databasename tablename > dump.sql 특정 조건에 부합되는 rows만 dump하..

    [MySQL] MySQL 권한

    1. MySQL의 기본테이블 MySQL은 처음 설치시에 'mysql'이라는 데이타베이스를 생성한다. 이 데이타베이스는 db,host,user, tables_priv,columns_priv, function라는 기본테이블을 가지고 있다. 이 테이블들은 MySQL의 권한과 관련이 있다. 2. MySQL의 기본테이블과 권한 (1) user테이블 : 전체서버에 적용되는 권한정보를 포함하고 있다. (2) host테이블 : 호스트전체에 대한 서버의 접근권한을 부여한다. (3) db테이블 : 각각의 데이타베이스에 접근 권한을 설정한다. (4) tables_priv : 테이블에 대한 접근권한을 설정한다. (5) columns_priv : 행에 대한 접근 권한을 설정한다. (6) function : 사용자정의 mysql..