Amazon Web Services 한국 블로그

AWS CLI를 사용한 리전간 DB 파라미터 그룹 복사하기

Amazon Relational Database Service (RDS) 는 클라우드에서 관계형 데이터베이스를 손쉽게 설정, 운영 및 확장할 수 있는 관리형 서비스입니다. RDS를 사용하면 데이터베이스 패치 작업, 백업, 특정 시점으로의 복원 등의 복잡한 관리 절차를 자동화 할 수 있습니다.

AWS에서 글로벌 서비스를 진행할 때, 하나의 리전(Region)에서 운영 중인 서비스를  전 세계로 확장하기 위해 데이터베이스를 다른 리전으로 복사해야 하는 경우가 있습니다. 이때 스냅샷(Snapshot)을 생성하여 대상 리전에 복사 후 해당 스냅샷으로부터 새로운 데이터베이스 인스턴스를 만들면 글로벌 서비스가 가능합니다.

RDS의 Snapshot을 다른 리전으로 옮긴 후, 복원하여 사용하시기 위해서는 몇 가지 사전 작업이 필요합니다.

  • 보안 그룹 (Security Groups)생성
  • DB 옵션 그룹 생성
  • DB 서브넷 그룹 생성
  • DB 파라미터 그룹 생성

위의 정보들은 특정 리전에만 국한된 것이기에, 복사하려는 대상 리전에 미리 생성하여 준비 시켜두어야 합니다.

특히, 이중에 기존에 운영 중인 서비스와 동일한 환경과 성능을 보장하기 위해서는 파라미터 그룹을 일치화 시켜야 합니다. 대상이 MySQL의 경우에는 콘솔에서 설정할 수 있는 파라미터들이 300여개에 달하기에 이를 하나하나 비교해가며 수동으로 작업하는 것은 쉽지 않습니다.

(이 글이 작성되는 시점에는 아직 리전간 파라미터 그룹 복사 기능이 지원되지 않으므로) AWS Command-Line Interface(CLI)를 활용하여 다른 리전에서 복사한 스냅샷으로부터 데이터베이스를 생성 후 기존에 사용 중이던 파라미터 그룹과 일치화 시키는 방법에 대해서 알아보고자 합니다.

참고로 한번의 명령으로 최대 20개의 파라미터 값만 변경 가능합니다. 따라서, 설명의 편의를 위해 20개 이하의 파라미터 값 변경을 기준으로 진행하도록 하겠습니다. 20개 이상의 파라미터 값 변경은 반복 실행하는 스크립트 작성을 통해 가능합니다.

1. 환경 설정
우리는 AWS CLI를 활용한 DB 파라미터 그룹 복사 방법을 확인 하기 위해 동경(ap-northeast-1) 리전의 RDS에서 파라미터 그룹을 ‘src-pg’ 라는 이름으로 생성한 뒤 다음과 같이 파라미터를 수정하도록 하겠습니다.

Parameter src-pg default.mysql5.6
innodb_flush_log_at_trx_commit 0 <engine-default>
slow_query_log 1 <engine-default>
innodb_support_xa 0 <engine-default>
long_query_time 60 <engine-default>
character_set_server utf8 <engine-default>

2. 복사 대상 DB 파라미터 그룹 정보 확인
우리의 아이디어는 describe-db-parameters를 통해 파라미터 그룹의 정보를 출력 후, 대상 리전의 RDS에서 생성한 파라미터 그룹에 앞서 출력한 원본 파라미터 그룹의 정보를 modify-db-parameter-group를 통하여 업데이트 하는 것입니다.

수정된 파라미터 중 하나를 선택하여 어떠한 포맷과 형태로 정보들이 출력 되는지 확인 해 봅니다.

$ aws rds describe-db-parameters --db-parameter-group-name src-pg --query "Parameters [? ParameterName == 'long_query_time']"

결과는 JSON 포맷으로 다음과 같이 나옵니다.

[
    {
        "Description": "Defines what MySQL considers long queries",
        "DataType": "float",
        "IsModifiable": true,
        "AllowedValues": "0-31536000",
        "Source": "user",
        "ParameterValue": "60",
        "ParameterName": "long_query_time",
        "ApplyType": "dynamic"
    }
]

파라미터 정보들을 업데이트 하기 위해서는 modify-db-parameter-group명령을 사용합니다. 이 때 --generate-cli-skeleton 옵션을 주게 되면 업데이트를 위해 입력하여야 하는 데이터의 구조를 확인할 수 있습니다.

$ aws rds modify-db-parameter-group --generate-cli-skeleton

결과는 아래와 같이 파라미터를 업데이트 하기 위한 기본 구조가 출력 됩니다.

{
    "DBParameterGroupName": "",
    "Parameters": [
        {
            "ParameterName": "",
            "ParameterValue": "",
            "Description": "",
            "Source": "",
            "ApplyType": "",
            "DataType": "",
            "AllowedValues": "",
            "IsModifiable": true,
            "MinimumEngineVersion": "",
            "ApplyMethod": ""
        }
    ]
}

앞서 describe-db-parameters를 통하여 출력된 정보들과 비교해보면 거의 동일하며, MinimumEngineVersion과 ApplyMethod 가 추가되어 있는것을 확인할 수 있습니다. ApplyMethod 는 꼭 필요한 정보이며 MinimumEngineVersion 은 선택사항 입니다.

이를 통해 기존 출력된 정보에 ApplyMethod 만 추가하여 업데이트 한다면 원하는 파라미터 그룹을 다른 리전에서도 그대로 사용할 수 있다는 것을 알 수 있습니다.

ApplyMethod는 immediate와 pending-reboot 값 중 하나를 가질 수 있습니다. immediate는 변경 사항을 RDS 인스턴스에 즉시 적용하는 것을 의미하며, pending-reboot 은 인스턴스가 재시작 될 때 적용되는 것을 의미 합니다. 각 정보는 파라미터 종류와 운영 환경에 맞게 결정되어야 하겠지만, 이 글에서는 immediate로 지정하여 진행하도록 하겠습니다.

3. 복사하려는 파라미터 그룹 정보 출력
대상 파라미터 그룹에 업데이트 하기 위한, 복사하려는 파라미터 그룹 정보를 파일에 출력해 보겠습니다. 다만, 불필요하게 모든 파라미터 정보를 출력하지 않고, 수정된 파라미터만 출력하기 위해 --source 옵션을 사용하도록 하겠습니다.

$ aws rds describe-db-parameters --db-parameter-group-name src-pg --source user > src-pg.json

아래와 같은 결과가 src-pg.json 파일에 출력됩니다.

{
    "Parameters": [
        {
            "Description": "The server's default character set.",
            "DataType": "string",
            "IsModifiable": true,
            "AllowedValues": "big5,dec8,cp850,hp8,koi8r,latin1,latin2,swe7,ascii,ujis,sjis,hebrew,tis620,euckr,koi8u,gb2312,greek,cp1250,gbk,latin5,armscii8,utf8,ucs2,cp866,keybcs2,macce,macroman,cp852,latin7,utf8mb4,cp1251,utf16,cp1256,cp1257,utf32,binary,geostd8,cp932,eucjpms",
            "Source": "user",
            "ParameterValue": "utf8",
            "ParameterName": "character_set_server",
            "ApplyType": "dynamic"
        },
...

4. 파라미터 정보 추가하기
앞서 살펴본바와 같이 ApplyMethod는 필수이기 때문에 각 파라미터 정보에 추가하도록 하겠습니다. 먼저 파이썬(Python)을 활용한 방법입니다.

$ cat src-pg.json | python -c 'import sys,json; data=json.loads(sys.stdin.read()); map(lambda x: x.update({"ApplyMethod":"immediate"}), data["Parameters"]); print json.dumps(data)' | python -m json.tool > dest-pg.json

두번째는 jq를 사용(설치 필요) 하는 방법입니다.

$ cat src-pg.json | jq '.Parameters[] |= . + {"ApplyMethod": "immediate"}' > dest-pg.json

이제 dest-pg.json 파일을 출력해보면 다음과 같이 ApplyMethod 가 추가된 것을 확인할 수 있습니다.

{
    "Parameters": [
        {
            "AllowedValues": "big5,dec8,cp850,hp8,koi8r,latin1,latin2,swe7,ascii,ujis,sjis,hebrew,tis620,euckr,koi8u,gb2312,greek,cp1250,gbk,latin5,armscii8,utf8,ucs2,cp866,keybcs2,macce,macroman,cp852,latin7,utf8mb4,cp1251,utf16,cp1256,cp1257,utf32,binary,geostd8,cp932,eucjpms",
            "ApplyMethod": "immediate",
            "ApplyType": "dynamic",
            "DataType": "string",
            "Description": "The server's default character set.",
            "IsModifiable": true,
            "ParameterName": "character_set_server",
            "ParameterValue": "utf8",
            "Source": "user"
        },
....

5. 대상 리전에 파라미터 그룹 생성 및 업데이트
이제 복사할 대상 리전에 dest-pg 라는 이름의 기본 값을 가진 파라미터 그룹을 생성하겠습니다.

$ aws rds create-db-parameter-group --db-parameter-group-family MySQL5.6 --db-parameter-group-name dest-pg --description "This is a destination parameter group" --region us-east-1

결과는 다음과 같이 파라미터 그룹명을 포함한 정보가 출력 됩니다.

{
    "DBParameterGroup": {
        "DBParameterGroupName": "dest-pg",
        "DBParameterGroupFamily": "mysql5.6",
        "Description": "This is a destination parameter group"
    }
}

여기서는 명시적으로 –-region 이라는 옵션을 통하여 파라미터 그룹이 생성될 리전(us-east-1, Virginia)을 지정하였습니다.

앞서 만든 대상 리전의 파라미터 그룹에 원본 파라미터 그룹 정보를 업데이트를 합니다. --cli-input-json 옵션을 사용하여 앞서 원본 파라미터 그룹 정보에ApplyMethod 를 추가한 json 파일을 지정합니다.

$ aws rds modify-db-parameter-group --region us-east-1 --db-parameter-group-name dest-pg --cli-input-json file://dest-pg.json

정상적으로 완료되면 파라미터 그룹명이 출력 됩니다.

{
    "DBParameterGroupName": "dest-pg"
}

원본 파라미터 그룹과 대상 파라미터 그룹이 동일한지 diff를 사용하여 확인할 수 있습니다.

$ diff -s <(aws rds describe-db-parameters --db-parameter-group-name src-pg --source user) <(aws rds describe-db-parameters --region us-east-1 --db-parameter-group-name dest-pg --source user)

동일하다면, 다음과 같은 결과가 출력되며 완료된 것을 확인할 수 있습니다.

$ Files /dev/fd/?? and /dev/fd/??? are identical

지금까지 AWS CLI를 사용하여 리전간 RDS 파라미터 그룹을 복사하는 방법에 대해서 알아 보았습니다. 이외에도 다양한 방법으로 가능하겠지만, 앞서 살펴본 바와 같이 CLI를 활용한다면 몇 가지 명령어를 사용해 어렵지 않게 수행 할 수 있을 뿐만 아니라 자동화 할 수 있음을 확인 할 수 있습니다.

AWS CLI는 지속적으로 업데이트 되고 있으며, 새롭게 추가되는 새로운 명령어들과 기능들을 업무에 적용함으로써 작업 능률 향상을 꾀할 수 있을 것입니다. 이러한 점이 AWS의 매력 중 하나가 아닐까 생각합니다.

본 글은 아마존웹서비스 코리아의 솔루션즈 아키텍트가 국내 고객을 위해 전해 드리는 AWS 활용 기술 팁을 보내드리는 코너로서, 이번 글은 김필중 솔루션즈 아키텍트께서 작성해주셨습니다.