Skip to content

Commit

Permalink
Add: POCHAK 게시물
Browse files Browse the repository at this point in the history
  • Loading branch information
5jisoo committed Jan 12, 2025
1 parent 9cc952b commit 9621d5e
Show file tree
Hide file tree
Showing 57 changed files with 1,032 additions and 6 deletions.
2 changes: 1 addition & 1 deletion _posts/2023-08-10-spring-data-dynamodb-localdatetime.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: LocalDateTime 저장 에러
date: 2023-08-10 18:20:00 +/-TTTT
categories: [Spring, Spring Data DynamoDB]
categories: [Project, POCHAK]
tags: [spring, dynamodb, troubleshooting] # TAG names should always be lowercase
---

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: Partition Key와 Sort Key를 같이 사용할 때
date: 2023-08-10 18:20:00 +/-TTTT
categories: [Spring, Spring Data DynamoDB]
categories: [Project, POCHAK]
tags: [spring, dynamodb, troubleshooting] # TAG names should always be lowercase
---

Expand Down
2 changes: 1 addition & 1 deletion _posts/2023-08-16-spring-data-dynamodb-query.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: Spring Data DynamoDB 쿼리 작업 정리
date: 2023-08-16 18:20:00 +/-TTTT
categories: [Spring, Spring Data DynamoDB]
categories: [Project, POCHAK]
tags: [spring, dynamodb] # TAG names should always be lowercase
---

Expand Down
2 changes: 1 addition & 1 deletion _posts/2023-09-11-spring-data-dynamodb-paging.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: Spring Data DynamoDB 페이징 정리
date: 2023-09-11 18:20:00 +/-TTTT
categories: [Spring, Spring Data DynamoDB]
categories: [Project, POCHAK]
tags: [spring, dynamodb] # TAG names should always be lowercase
---

Expand Down
102 changes: 102 additions & 0 deletions _posts/2024-08-25-cloud-sql-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
---
title: AWS RDS에서 GCP Cloud SQL로 마이그레이션 작업
date: 2024-08-25 18:30:00 +0900
categories: [Project, POCHAK]
tags: [backend, migration, cloudsql, gcp] # TAG names should always be lowercase
---

# Cloud SQL로 데이터베이스를 변경한 이유

창업지원단의 지원금을 받고 있기에 대부분의 서비스를 AWS에서 GCP로 옮기고 있는 상황입니다.

따라서 기존에 사용하던 AWS의 RDS에서 GCP의 Cloud SQL로 마이그레이션을 하기로 결정하였습니다.

# 작업 과정
## GCP Database Migration API 활성화하기

GCP에서 제공해주는 Database Migration API를 사용하여 작업을 시작해보겠습니다. <br>
먼저 Database Migration API를 검색하여 활성화를 시켜주어야 합니다.

아래 이미지는 이미 활성화된 모습입니다.

![img](/assets/img/2024-08-25-cloud-sql-migration/1.png)

## 연결 프로필 생성

그 뒤, 연결 프로필 `Connection profiles` 을 생성해주어야 합니다.

> 연결 프로필은 소스 데이터베이스 인스턴스(예: MySQL용 Amazon RDS)에 대한 정보를 저장하고, <br>
> Database Migration Service에서 대상 Cloud SQL 데이터베이스 인스턴스로 데이터를 마이그레이션하는 데 사용됩니다.
{: .prompt-tip }

<br>

`데이터베이스 마이그레이션 > 연결 프로필`에서 <br>
상단의 `+ 프로필 만들기` 버튼을 눌러 새로운 프로필을 만들어줍시다.

![img](/assets/img/2024-08-25-cloud-sql-migration/2.png)


다음과 같이 세팅해주었습니다.

1. 데이터베이스 엔진 : `MySQL`
2. 연결 프로필 이름 : `mysql-rds` (편한 이름으로 변경 가능)
3. 연결 프로필 ID : `mysql-rds` (편한 아이디로 변경 가능)
4. 호스트 이름 또는 IP 주소 : {RDS IP 주소}
5. 포트 : `3306` (MySQL 기본 포트 - 설정에 따라 변경될 수 있습니다.)
6. 사용자 이름 : {MySQL 사용자 이름}
7. 비밀번호 : {MySQL 비밀번호}
8. 리전 : `asia-northeast3 (서울)` (저는 서울로 설정하였습니다.)

## 마이그레이션 작업 생성

`데이터베이스 마이그레이션 > 마이그레이션 작업`에서<br>
상단의 `+ 마이그레이션 작업 만들기` 버튼을 눌러 새로운 마이그레이션 작업을 만들어줍시다.

![img](/assets/img/2024-08-25-cloud-sql-migration/3.png)

1. 소스 데이터베이스 엔진 : `MySQL`
2. 대상 리전: `asia-northeast3 (서울)`
3. 마이그레이션 작업 유형: 일회성

으로 설정하고 `저장하고 계속하기` 버튼을 클릭해줍니다.

<br>

다음으로 소스 연결 프로필로 아까 생성한 `mysql-rds`를 선택해줍니다. <br>
다른건 기본 세팅으로 두고 진행하였습니다.

<br>

마이그레이션 대상 데이터베이스를 생성합니다. <br>
비용을 위해 최소 사양으로 설정하였습니다!
- `Enterprise`
- 공유 코어 vCPU 1개, `0.614GB`
- `HDD`, `10GB`
- `MySQL 8.0.31`

<br>

대상 데이터베이스 생성이 완료되면, 다음으로 넘어가 연결 방법을 선택합니다.

연결 방법은 `IP 허용 목록` 으로 설정하고, `Destination IP Address`를 복사합니다.<br>
복사한 AWS RDS 인스턴스의 보안그룹에 추가하여 접근이 가능하도록 설정해주어야 합니다.

<br>

모두 설정해준 뒤, 마이그레이션 작업을 시작해줍니다. <br>
- 설정에 이상이 없다면 마이그레이션 작업이 시작됩니다.

![img](/assets/img/2024-08-25-cloud-sql-migration/4.png)
_설정은 이 사진을 참고해주세요!_

약 13분 정도 작업이 진행되었고, <br>
이후에 `Cloud SQL > (대상 인스턴스) > 작업`에 들어가서 <br>
마이그레이션 작업 과정은 다음과 같이 확인할 수 있었습니다.

![img](/assets/img/2024-08-25-cloud-sql-migration/5.png)



# 참고자료
- [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)
158 changes: 158 additions & 0 deletions _posts/2024-08-28-docker.sock-permission-error.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
---
title: Jenkins에서 docker build시, docker.sock 권한 에러 발생 해결
date: 2024-08-28 17:00:00 +0900
categories: [Project, POCHAK]
tags: [backend, infra, jenkins, troubleshooting] # TAG names should always be lowercase
---

# 에러 상황

## 발생 위치

Jenkins에서 배포 과정을 실행하며 다음과 같은 오류가 발생하였습니다.

![error](/assets/img/2024-08-28-docker.sock-permission-error/1-error-img.png)
_에러 발생!!_

- 에러가 발생한 파이프라인의 명렁어

``` bash
$ docker build -f Dockerfile -t pochakgreen/pochak-dev .
```

## 원인 확인

아래의 로그로 확인해봤을때, `docker.sock` 실행 과정에서 `permission denied` 권한 에러가 발생하였습니다.

에러 해결과정을 정리해보겠습니다!

- 로그

```
jenkins@fbfbfcdce8e0:~/workspace/dev-pipeline$ docker build -f Dockerfile -t pochakgreen/pochak-dev .
DEPRECATED: The legacy builder is deprecated and will be removed in a future release.
Install the buildx component to build images with BuildKit:
https://docs.docker.com/go/buildx/
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock:
...
: dial unix /var/run/docker.sock: connect: permission denied
```

# 환경

## 호스트 환경
- Ubuntu 20.04.6 LTS
- Docker version 27.1.2
- Jenkins Version 2.473 : 도커 컨테이너로 실행

## 도커 컨테이너

다음과 같은 명령어를 통해 도커 소켓을 마운트해서 Jenkins 컨테이너를 실행시키고 있습니다.

``` bash
$ docker run \
-itd --name jenkins \
-p 9090:8080 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker jenkins/jenkins:jdk17
```

# 해결 과정

## docker.sock의 권한 확인

먼저 docker container로 접속해서 `docker.sock`의 권한을 확인합니다.

```bash
$ docker exec -it jenkins /bin/bash
$ ls -al /var/run/
```

`docker.sock` 파일의 그룹 권한이 이름이 없고 GID `998`로 설정되어 있는 것을 확인할 수 있습니다.

![check-permission](/assets/img/2024-08-28-docker.sock-permission-error/2-check-permission.png)

> 따라서 앞으로의 해결 과정은
> 1. `docker` 그룹을 만들어서
> 2. `jenkins` 유저를 `docker` 그룹에 넣어주고,
> 3. `docker` 그룹에 `docker.sock` 실행권한을 부여해줄 예정입니다.
{: .prompt-tip }

## `docker` 그룹 설정

먼저 젠킨스 컨테이너에 root 권한으로 접속합니다.

```bash
$ docker exec -itu0 jenkins /bin/bash # root로 접속
```

<br>

저는 기존에 docker 그룹이 없었기 때문에 새로 생성해 주었습니다.
- 이미 존재할 경우 새로 생성할 필요 없음!

```bash
$ groupadd docker
```

<br>

그 뒤, `jenkins` 유저를 그룹에 넣어주고,<br>
docker 그룹에 `docker.sock` 실행권한을 부여하였습니다.

```bash
$ usermod -aG docker jenkins
$ chown root:docker /var/run/docker.sock
```

![group-setting](/assets/img/2024-08-28-docker.sock-permission-error/3-group-setting.png)

## `docker.sock` 실행권한 확인

다시 젠킨스로 접속하여 `docker.sock`의 권한을 확인하면, <br>
docker 그룹에 실행 권한이 생긴걸 확인할 수 있습니다.

```bash
$ docker exec -itu0 jenkins /bin/bash # 다시 jenkins로 접속
$ ls -al /var/run/
```

![permission](/assets/img/2024-08-28-docker.sock-permission-error/4-permission.png)

<br>

또한 아래의 명령어를 통해 `docker` 그룹 안에 `jenkins` 유저가 있는 것도 확인할 수 있습니다.

```bash
$ cat /etc/group | grep docker
```

![img](/assets/img/2024-08-28-docker.sock-permission-error/5-group.png)

## jenkins 재시작

이렇게 권한을 모두 확인하였음에도 "바로" jenkins 파이프라인을 실행시키면, 동일한 오류가 발생합니다.

<br>

재시작을 하지 않고, 파이프라인에 `id` 명령어를 통해 확인해보니, `jenkins` 유저에 `docker` 그룹이 빠져있는 것을 확인할 수 있었습니다.

![img](/assets/img/2024-08-28-docker.sock-permission-error/6-id.png)

> 참고로 터미널에서 jenkins 컨테이너에 접속해서 확인해봤을 때는 docker 그룹도 잘 나오는 상태였습니다.
> ![img](/assets/img/2024-08-28-docker.sock-permission-error/7-terminal.png)
{: .prompt-info }

<br>

따라서 jenkins 컨테이너를 재시작하고 다시 파이프라인을 실행하면,
다음과 같이 `docker` 그룹도 확인할 수 있고,
배포 과정도 정상적으로 수행됩니다!

![img](/assets/img/2024-08-28-docker.sock-permission-error/8-id.png)

![img](/assets/img/2024-08-28-docker.sock-permission-error/9-success.png)
_해결 완료!_
Loading

0 comments on commit 9621d5e

Please sign in to comment.