Skip to content

Commit 9621d5e

Browse files
committed
Add: POCHAK 게시물
1 parent 9cc952b commit 9621d5e

57 files changed

Lines changed: 1032 additions & 6 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

_posts/2023-08-10-spring-data-dynamodb-localdatetime.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
title: LocalDateTime 저장 에러
33
date: 2023-08-10 18:20:00 +/-TTTT
4-
categories: [Spring, Spring Data DynamoDB]
4+
categories: [Project, POCHAK]
55
tags: [spring, dynamodb, troubleshooting] # TAG names should always be lowercase
66
---
77

_posts/2023-08-10-spring-data-dynamodb-partitionkey-and-sortkey.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
title: Partition Key와 Sort Key를 같이 사용할 때
33
date: 2023-08-10 18:20:00 +/-TTTT
4-
categories: [Spring, Spring Data DynamoDB]
4+
categories: [Project, POCHAK]
55
tags: [spring, dynamodb, troubleshooting] # TAG names should always be lowercase
66
---
77

_posts/2023-08-16-spring-data-dynamodb-query.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
title: Spring Data DynamoDB 쿼리 작업 정리
33
date: 2023-08-16 18:20:00 +/-TTTT
4-
categories: [Spring, Spring Data DynamoDB]
4+
categories: [Project, POCHAK]
55
tags: [spring, dynamodb] # TAG names should always be lowercase
66
---
77

_posts/2023-09-11-spring-data-dynamodb-paging.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
title: Spring Data DynamoDB 페이징 정리
33
date: 2023-09-11 18:20:00 +/-TTTT
4-
categories: [Spring, Spring Data DynamoDB]
4+
categories: [Project, POCHAK]
55
tags: [spring, dynamodb] # TAG names should always be lowercase
66
---
77

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
---
2+
title: AWS RDS에서 GCP Cloud SQL로 마이그레이션 작업
3+
date: 2024-08-25 18:30:00 +0900
4+
categories: [Project, POCHAK]
5+
tags: [backend, migration, cloudsql, gcp] # TAG names should always be lowercase
6+
---
7+
8+
# Cloud SQL로 데이터베이스를 변경한 이유
9+
10+
창업지원단의 지원금을 받고 있기에 대부분의 서비스를 AWS에서 GCP로 옮기고 있는 상황입니다.
11+
12+
따라서 기존에 사용하던 AWS의 RDS에서 GCP의 Cloud SQL로 마이그레이션을 하기로 결정하였습니다.
13+
14+
# 작업 과정
15+
## GCP Database Migration API 활성화하기
16+
17+
GCP에서 제공해주는 Database Migration API를 사용하여 작업을 시작해보겠습니다. <br>
18+
먼저 Database Migration API를 검색하여 활성화를 시켜주어야 합니다.
19+
20+
아래 이미지는 이미 활성화된 모습입니다.
21+
22+
![img](/assets/img/2024-08-25-cloud-sql-migration/1.png)
23+
24+
## 연결 프로필 생성
25+
26+
그 뒤, 연결 프로필 `Connection profiles` 을 생성해주어야 합니다.
27+
28+
> 연결 프로필은 소스 데이터베이스 인스턴스(예: MySQL용 Amazon RDS)에 대한 정보를 저장하고, <br>
29+
> Database Migration Service에서 대상 Cloud SQL 데이터베이스 인스턴스로 데이터를 마이그레이션하는 데 사용됩니다.
30+
{: .prompt-tip }
31+
32+
<br>
33+
34+
`데이터베이스 마이그레이션 > 연결 프로필`에서 <br>
35+
상단의 `+ 프로필 만들기` 버튼을 눌러 새로운 프로필을 만들어줍시다.
36+
37+
![img](/assets/img/2024-08-25-cloud-sql-migration/2.png)
38+
39+
40+
다음과 같이 세팅해주었습니다.
41+
42+
1. 데이터베이스 엔진 : `MySQL`
43+
2. 연결 프로필 이름 : `mysql-rds` (편한 이름으로 변경 가능)
44+
3. 연결 프로필 ID : `mysql-rds` (편한 아이디로 변경 가능)
45+
4. 호스트 이름 또는 IP 주소 : {RDS IP 주소}
46+
5. 포트 : `3306` (MySQL 기본 포트 - 설정에 따라 변경될 수 있습니다.)
47+
6. 사용자 이름 : {MySQL 사용자 이름}
48+
7. 비밀번호 : {MySQL 비밀번호}
49+
8. 리전 : `asia-northeast3 (서울)` (저는 서울로 설정하였습니다.)
50+
51+
## 마이그레이션 작업 생성
52+
53+
`데이터베이스 마이그레이션 > 마이그레이션 작업`에서<br>
54+
상단의 `+ 마이그레이션 작업 만들기` 버튼을 눌러 새로운 마이그레이션 작업을 만들어줍시다.
55+
56+
![img](/assets/img/2024-08-25-cloud-sql-migration/3.png)
57+
58+
1. 소스 데이터베이스 엔진 : `MySQL`
59+
2. 대상 리전: `asia-northeast3 (서울)`
60+
3. 마이그레이션 작업 유형: 일회성
61+
62+
으로 설정하고 `저장하고 계속하기` 버튼을 클릭해줍니다.
63+
64+
<br>
65+
66+
다음으로 소스 연결 프로필로 아까 생성한 `mysql-rds`를 선택해줍니다. <br>
67+
다른건 기본 세팅으로 두고 진행하였습니다.
68+
69+
<br>
70+
71+
마이그레이션 대상 데이터베이스를 생성합니다. <br>
72+
비용을 위해 최소 사양으로 설정하였습니다!
73+
- `Enterprise`
74+
- 공유 코어 vCPU 1개, `0.614GB`
75+
- `HDD`, `10GB`
76+
- `MySQL 8.0.31`
77+
78+
<br>
79+
80+
대상 데이터베이스 생성이 완료되면, 다음으로 넘어가 연결 방법을 선택합니다.
81+
82+
연결 방법은 `IP 허용 목록` 으로 설정하고, `Destination IP Address`를 복사합니다.<br>
83+
복사한 AWS RDS 인스턴스의 보안그룹에 추가하여 접근이 가능하도록 설정해주어야 합니다.
84+
85+
<br>
86+
87+
모두 설정해준 뒤, 마이그레이션 작업을 시작해줍니다. <br>
88+
- 설정에 이상이 없다면 마이그레이션 작업이 시작됩니다.
89+
90+
![img](/assets/img/2024-08-25-cloud-sql-migration/4.png)
91+
_설정은 이 사진을 참고해주세요!_
92+
93+
약 13분 정도 작업이 진행되었고, <br>
94+
이후에 `Cloud SQL > (대상 인스턴스) > 작업`에 들어가서 <br>
95+
마이그레이션 작업 과정은 다음과 같이 확인할 수 있었습니다.
96+
97+
![img](/assets/img/2024-08-25-cloud-sql-migration/5.png)
98+
99+
100+
101+
# 참고자료
102+
- [Migrating to Cloud SQL from Amazon RDS for MySQL Using Database Migration Service](https://www.cloudskillsboost.google/focuses/17696?catalog_rank=%7B%22rank%22:1,%22num_filters%22:0,%22has_search%22:true%7D&parent=catalog&search_id=22626074)
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
---
2+
title: Jenkins에서 docker build시, docker.sock 권한 에러 발생 해결
3+
date: 2024-08-28 17:00:00 +0900
4+
categories: [Project, POCHAK]
5+
tags: [backend, infra, jenkins, troubleshooting] # TAG names should always be lowercase
6+
---
7+
8+
# 에러 상황
9+
10+
## 발생 위치
11+
12+
Jenkins에서 배포 과정을 실행하며 다음과 같은 오류가 발생하였습니다.
13+
14+
![error](/assets/img/2024-08-28-docker.sock-permission-error/1-error-img.png)
15+
_에러 발생!!_
16+
17+
- 에러가 발생한 파이프라인의 명렁어
18+
19+
``` bash
20+
$ docker build -f Dockerfile -t pochakgreen/pochak-dev .
21+
```
22+
23+
## 원인 확인
24+
25+
아래의 로그로 확인해봤을때, `docker.sock` 실행 과정에서 `permission denied` 권한 에러가 발생하였습니다.
26+
27+
에러 해결과정을 정리해보겠습니다!
28+
29+
- 로그
30+
31+
```
32+
jenkins@fbfbfcdce8e0:~/workspace/dev-pipeline$ docker build -f Dockerfile -t pochakgreen/pochak-dev .
33+
DEPRECATED: The legacy builder is deprecated and will be removed in a future release.
34+
Install the buildx component to build images with BuildKit:
35+
https://docs.docker.com/go/buildx/
36+
37+
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock:
38+
39+
...
40+
41+
: dial unix /var/run/docker.sock: connect: permission denied
42+
```
43+
44+
# 환경
45+
46+
## 호스트 환경
47+
- Ubuntu 20.04.6 LTS
48+
- Docker version 27.1.2
49+
- Jenkins Version 2.473 : 도커 컨테이너로 실행
50+
51+
## 도커 컨테이너
52+
53+
다음과 같은 명령어를 통해 도커 소켓을 마운트해서 Jenkins 컨테이너를 실행시키고 있습니다.
54+
55+
``` bash
56+
$ docker run \
57+
-itd --name jenkins \
58+
-p 9090:8080 \
59+
-v /var/run/docker.sock:/var/run/docker.sock \
60+
-v /usr/bin/docker:/usr/bin/docker jenkins/jenkins:jdk17
61+
```
62+
63+
# 해결 과정
64+
65+
## docker.sock의 권한 확인
66+
67+
먼저 docker container로 접속해서 `docker.sock`의 권한을 확인합니다.
68+
69+
```bash
70+
$ docker exec -it jenkins /bin/bash
71+
$ ls -al /var/run/
72+
```
73+
74+
`docker.sock` 파일의 그룹 권한이 이름이 없고 GID `998`로 설정되어 있는 것을 확인할 수 있습니다.
75+
76+
![check-permission](/assets/img/2024-08-28-docker.sock-permission-error/2-check-permission.png)
77+
78+
> 따라서 앞으로의 해결 과정은
79+
> 1. `docker` 그룹을 만들어서
80+
> 2. `jenkins` 유저를 `docker` 그룹에 넣어주고,
81+
> 3. `docker` 그룹에 `docker.sock` 실행권한을 부여해줄 예정입니다.
82+
{: .prompt-tip }
83+
84+
## `docker` 그룹 설정
85+
86+
먼저 젠킨스 컨테이너에 root 권한으로 접속합니다.
87+
88+
```bash
89+
$ docker exec -itu0 jenkins /bin/bash # root로 접속
90+
```
91+
92+
<br>
93+
94+
저는 기존에 docker 그룹이 없었기 때문에 새로 생성해 주었습니다.
95+
- 이미 존재할 경우 새로 생성할 필요 없음!
96+
97+
```bash
98+
$ groupadd docker
99+
```
100+
101+
<br>
102+
103+
그 뒤, `jenkins` 유저를 그룹에 넣어주고,<br>
104+
docker 그룹에 `docker.sock` 실행권한을 부여하였습니다.
105+
106+
```bash
107+
$ usermod -aG docker jenkins
108+
$ chown root:docker /var/run/docker.sock
109+
```
110+
111+
![group-setting](/assets/img/2024-08-28-docker.sock-permission-error/3-group-setting.png)
112+
113+
## `docker.sock` 실행권한 확인
114+
115+
다시 젠킨스로 접속하여 `docker.sock`의 권한을 확인하면, <br>
116+
docker 그룹에 실행 권한이 생긴걸 확인할 수 있습니다.
117+
118+
```bash
119+
$ docker exec -itu0 jenkins /bin/bash # 다시 jenkins로 접속
120+
$ ls -al /var/run/
121+
```
122+
123+
![permission](/assets/img/2024-08-28-docker.sock-permission-error/4-permission.png)
124+
125+
<br>
126+
127+
또한 아래의 명령어를 통해 `docker` 그룹 안에 `jenkins` 유저가 있는 것도 확인할 수 있습니다.
128+
129+
```bash
130+
$ cat /etc/group | grep docker
131+
```
132+
133+
![img](/assets/img/2024-08-28-docker.sock-permission-error/5-group.png)
134+
135+
## jenkins 재시작
136+
137+
이렇게 권한을 모두 확인하였음에도 "바로" jenkins 파이프라인을 실행시키면, 동일한 오류가 발생합니다.
138+
139+
<br>
140+
141+
재시작을 하지 않고, 파이프라인에 `id` 명령어를 통해 확인해보니, `jenkins` 유저에 `docker` 그룹이 빠져있는 것을 확인할 수 있었습니다.
142+
143+
![img](/assets/img/2024-08-28-docker.sock-permission-error/6-id.png)
144+
145+
> 참고로 터미널에서 jenkins 컨테이너에 접속해서 확인해봤을 때는 docker 그룹도 잘 나오는 상태였습니다.
146+
> ![img](/assets/img/2024-08-28-docker.sock-permission-error/7-terminal.png)
147+
{: .prompt-info }
148+
149+
<br>
150+
151+
따라서 jenkins 컨테이너를 재시작하고 다시 파이프라인을 실행하면,
152+
다음과 같이 `docker` 그룹도 확인할 수 있고,
153+
배포 과정도 정상적으로 수행됩니다!
154+
155+
![img](/assets/img/2024-08-28-docker.sock-permission-error/8-id.png)
156+
157+
![img](/assets/img/2024-08-28-docker.sock-permission-error/9-success.png)
158+
_해결 완료!_

0 commit comments

Comments
 (0)