{"id":2990,"date":"2025-03-19T17:42:20","date_gmt":"2025-03-19T08:42:20","guid":{"rendered":"https:\/\/manvscloud.com\/?p=2990"},"modified":"2025-03-19T17:42:20","modified_gmt":"2025-03-19T08:42:20","slug":"ncloud-cloud-db-for-postgresql-%eb%b0%b1%ec%97%85-to-object-storage-%ea%b4%80%eb%a6%ac%ed%98%95-%eb%8d%b0%ec%9d%b4%ed%84%b0%eb%b2%a0%ec%9d%b4%ec%8a%a4-%eb%b0%b1%ec%97%85%ec%9d%b4-%ec%8b%a4%ed%8c%a8","status":"publish","type":"post","link":"https:\/\/manvscloud.com\/?p=2990","title":{"rendered":"[NCLOUD] Cloud DB for PostgreSQL \ubc31\uc5c5 to Object Storage (\uad00\ub9ac\ud615 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ubc31\uc5c5\uc774 \uc2e4\ud328\ud55c\ub2e4\uba74?)"},"content":{"rendered":"\n<p>\uc548\ub155\ud558\uc138\uc694 MANVSCLOUD \uae40\uc218\ud604\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc9c0\ub09c \ud3ec\uc2a4\ud305\uc5d0\uc11c \uc6b0\ub9ac\ub294 \uad00\ub9ac\ud615 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \ubc31\uc5c5 \uc131\uacf5\/\uc2e4\ud328 \uc5ec\ubd80\ub97c Slack\uc73c\ub85c \uc54c\ub9bc\uc744 \ubc1b\uc744 \uc218 \uc788\ub3c4\ub85d \uae30\ub2a5\uc744 \uad6c\ud604\ud574\ubcf4\uc558\uc2b5\ub2c8\ub2e4. \ubc31\uc5c5 \uc54c\ub9bc\uc744 \ud1b5\ud574 \ubb38\uc81c \uc0c1\ud669\uc744 \ube60\ub974\uac8c \uc778\uc9c0\ud560 \uc218 \uc788\uac8c \ub418\uc5c8\uc9c0\ub9cc \uc5ec\uc804\ud788 \ubc31\uc5c5 \uc2e4\ud328 \uc790\uccb4\ub294 \ud574\uacb0\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. \uc774\uc81c \uc774\uc5b4\uc11c \ubc31\uc5c5 \uc2e4\ud328 \ubb38\uc81c\ub97c \uc5b4\ub5bb\uac8c \uadfc\ubcf8\uc801\uc73c\ub85c \ud574\uacb0\ud560 \uc218 \uc788\uc744\uc9c0 \uc774\uc57c\uae30\ud574\ubcf4\uace0\uc790 \ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading has-white-color has-vivid-green-cyan-background-color has-text-color has-background has-link-color wp-elements-39ab8e8ff2cbfa37eaa64fc66eef7db0\"> \uc798 \ub9cc\ub4e4\uc5b4\uc9c4 \uc258 \uc2a4\ud06c\ub9bd\ud2b8 \ud558\ub098<\/h3>\n\n\n\n<p>\uc624\ub298\ub3c4 \uc5ed\uc2dc PostgreSQL\uc744 \uae30\uc900\uc73c\ub85c \uc791\uc131\ud558\uba70 <strong>pg_dump<\/strong> \uc720\ud2f8\ub9ac\ud2f0\ub97c \uc774\uc6a9\ud560 \uac83\uc785\ub2c8\ub2e4. \uc774\uc804 \ud3ec\uc2a4\ud305\uc5d0\uc11c Cloud Functions\uc744 \ud65c\uc6a9\ud588\uc9c0\ub9cc \uc774\ubc88\uc5d0\ub294 \ub2e4\ub978 \uc811\uadfc \ubc29\uc2dd\uc744 \ucde8\ud558\uaca0\uc2b5\ub2c8\ub2e4. Cloud Functions\uc758 \uacbd\uc6b0 TimeOut \uc124\uc815\uac12\uc774 \uc9e7\uc740 \ud3b8\uc774\ub77c \ubc31\uc5c5 \ubc0f \uc5c5\ub85c\ub4dc \uc2dc\uac04 \uc18c\uc694\uac00 \uae38\uc5b4\uc9c0\uba74 \ubc31\uc5c5 \uc2e4\ud328\ub85c \uc774\uc5b4\uc9c8 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc774\ubc88\uc5d0\ub294 \uc11c\ubc84\uc5d0\uc11c \uc9c1\uc811 \uc258 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc2e4\ud589\uc2dc\ud0a4\ub294 \ubc29\uc2dd\uc73c\ub85c \uc900\ube44\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\ucd94\uac00\ub85c \uc81c\uac00 \uc791\uc131\ud55c \uc258 \uc2a4\ud06c\ub9bd\ud2b8\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ud328\uc2a4\uc6cc\ub4dc\ub97c \uc9c1\uc811 \uc2a4\ud06c\ub9bd\ud2b8\uc5d0 \ud558\ub4dc\ucf54\ub529\ud558\uac70\ub098 \ud658\uacbd\ubcc0\uc218\ub85c \ub178\ucd9c\uc2dc\ud0a4\uc9c0 \uc54a\uae30 \uc704\ud574 Secret Manager\ub97c \uc0ac\uc6a9\ud558\ub294 \uae30\uc900\uc73c\ub85c \uc791\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc774\ub294 \ubcf4\uc548 \ubaa8\ubc94 \uc0ac\ub840\ub97c \ub530\ub974\ub294 \uc811\uadfc\ubc95\uc73c\ub85c \ubbfc\uac10\ud55c \uc790\uaca9 \uc99d\uba85\uc744 \uc548\uc804\ud558\uac8c \uad00\ub9ac\ud560 \uc218 \uc788\uac8c \ud574\uc90d\ub2c8\ub2e4. Secret Manager\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\uc9c0 \uc54a\ub2e4\uba74 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc801\uc808\ud788 \uc218\uc815\ud558\uc5ec \ub2e4\ub978 \ubcf4\uc548 \ubc29\uc2dd\uc744 \ud65c\uc6a9\ud574\uc8fc\uc138\uc694.<\/p>\n\n\n\n<ul>\n<li><strong>\uc0ac\uc804 \uc900\ube44 \ubc0f \ud655\uc778 \uc0ac\ud56d<\/strong><\/li>\n<\/ul>\n\n\n\n<p>\uc774 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc2e4\ud589\ud558\uae30 \uc804\uc5d0 \uc544\ub798 \ub124 \uac00\uc9c0 \ud56d\ubaa9\uc744 \ud655\uc778\ud574\uc8fc\uc138\uc694:<\/p>\n\n\n\n<p>1. <strong>Ubuntu 22.04 \uae30\uc900 pg_dump \uc0ac\uc6a9\uc744 \uc704\ud55c \uc900\ube44<\/strong>: PostgreSQL \ud074\ub77c\uc774\uc5b8\ud2b8 \ub3c4\uad6c \uc124\uce58\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apt install postgresql-client<\/pre>\n\n\n\n<p>2. <strong>AWS CLI \uc124\uce58 \ubd88\ud544\uc694<\/strong>: \uc774 \uc2a4\ud06c\ub9bd\ud2b8\ub294 AWS CLI \uc5c6\uc774\ub3c4 Object Storage\uc640 \ud1b5\uc2e0\ud560 \uc218 \uc788\ub3c4\ub85d \uc791\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4. curl \uba85\ub839\uc744 \ud65c\uc6a9\ud558\uc5ec \uc9c1\uc811 API \ud638\ucd9c\uc744 \uc218\ud589\ud569\ub2c8\ub2e4. (\ubb3c\ub860 \uc124\uce58\uac00 \ub418\uc5b4\uc788\uc5b4\ub3c4 \uc815\uc0c1 \ub3d9\uc791\ud569\ub2c8\ub2e4.)<\/p>\n\n\n\n<p>3. <strong>\ub124\ud2b8\uc6cc\ud06c \uc5f0\uacb0 \uc124\uc815<\/strong>: \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc2e4\ud589\ud558\ub294 \uc11c\ubc84\uc5d0\uc11c Cloud DB\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc788\ub3c4\ub85d ACG(Access Control Group) \uc124\uc815\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. <\/p>\n\n\n\n<p>4. <strong>\ud658\uacbd \ubcc0\uc218 \uc124\uc815<\/strong>: \ub2e4\uc74c \ud658\uacbd \ubcc0\uc218\ub97c \ubbf8\ub9ac \uc124\uc815\ud574\ub450\uc5b4\uc57c \ud569\ub2c8\ub2e4.<br>&#8211; <strong>ACCESS_KEY, SECRET_KEY<\/strong> : Secret Manager GetValue \uad8c\ud55c \ubc0f Object Storage Upload \uad8c\ud55c\uc774 \uc788\ub294 API \ud0a4<br>&#8211; <strong>SECRET_ID<\/strong> : Secret Manager\uc758 ID<\/p>\n\n\n\n<ul>\n<li><strong>\ubc31\uc5c5 \uc2a4\ud06c\ub9bd\ud2b8<\/strong><br>: \uc544\ub798\ub294 PostgreSQL \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \ubc31\uc5c5 \ubc0f \uc555\ucd95\ud558\uace0 Object Storage\uc5d0 \uc5c5\ub85c\ub4dc\ud558\ub294 \uc804\uccb4 \uc258 \uc2a4\ud06c\ub9bd\ud2b8\uc785\ub2c8\ub2e4<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#!\/bin\/bash\n\n# Secret Manager\uc5d0\uc11c \ube44\ubc00\ubc88\ud638 \uac00\uc838\uc624\uae30 \ud568\uc218\nget_db_password() {\n    # \ud658\uacbd \ubcc0\uc218 \ud655\uc778\n    if [ -z \"$ACCESS_KEY\" ] || [ -z \"$SECRET_KEY\" ] || [ -z \"$SECRET_ID\" ]; then\n        echo \"\ud544\uc694\ud55c \ud658\uacbd \ubcc0\uc218\uac00 \uc124\uc815\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.\"\n        echo \"\ub2e4\uc74c \ud658\uacbd \ubcc0\uc218\ub97c \uc124\uc815\ud574\uc8fc\uc138\uc694: ACCESS_KEY, SECRET_KEY, SECRET_ID\"\n        exit 1\n    fi\n\n    # \ud604\uc7ac \uc2dc\uac04\uc744 \ubc00\ub9ac\ucd08\ub85c \ubcc0\ud658\n    TIMESTAMP=$(date +%s%3N)\n\n    # API \ud638\ucd9c \uc815\ubcf4\n    API_HOST=\"secretmanager.apigw.ntruss.com\"\n    REQUEST_URL=\"\/api\/v1\/secrets\/${SECRET_ID}\/values\"\n    REQUEST_METHOD=\"GET\"\n\n    # \uc11c\uba85 \uc0dd\uc131 (API Gateway signature v2)\n    create_signature() {\n        local method=$1\n        local url=$2\n        local timestamp=$3\n        local access_key=$4\n        local secret_key=$5\n        \n        # \uc11c\uba85 \ub300\uc0c1 \ubb38\uc790\uc5f4 \uc0dd\uc131\n        local message=\"${method} ${url}\n${timestamp}\n${access_key}\"\n        \n        # Base64\ub85c \uc778\ucf54\ub529\ub41c HMAC-SHA256 \uc11c\uba85 \uc0dd\uc131\n        local signature=$(echo -n \"${message}\" | openssl dgst -sha256 -hmac \"${secret_key}\" -binary | base64)\n        \n        echo ${signature}\n    }\n\n    # \uc11c\uba85 \uc0dd\uc131\n    SIGNATURE=$(create_signature ${REQUEST_METHOD} ${REQUEST_URL} ${TIMESTAMP} ${ACCESS_KEY} ${SECRET_KEY})\n\n    # API \ud638\ucd9c\n    response=$(curl -s \\\n        -H \"x-ncp-apigw-timestamp:${TIMESTAMP}\" \\\n        -H \"x-ncp-iam-access-key:${ACCESS_KEY}\" \\\n        -H \"x-ncp-apigw-signature-v2:${SIGNATURE}\" \\\n        -H \"Content-Type:application\/json\" \\\n        \"https:\/\/${API_HOST}${REQUEST_URL}\")\n\n    # \uc751\ub2f5\uc5d0\uc11c active\uc758 cdbPassword \ucd94\ucd9c\n    password=$(echo \"${response}\" | python -c '\nimport json, sys\ntry:\n    data = json.load(sys.stdin)\n    if data[\"code\"] == \"SUCCESS\":\n        active_json = json.loads(data[\"data\"][\"decryptedSecretChain\"][\"active\"])\n        print(active_json[\"cdbPassword\"])\n    else:\n        print(\"Error: \" + json.dumps(data), file=sys.stderr)\n        sys.exit(1)\nexcept Exception as e:\n    print(f\"Error parsing response: {e}\", file=sys.stderr)\n    print(sys.stdin.read(), file=sys.stderr)\n    sys.exit(1)\n')\n\n    # \uc624\ub958 \ud655\uc778\n    if [ $? -ne 0 ]; then\n        echo \"\ube44\ubc00\ubc88\ud638 \uac00\uc838\uc624\uae30 \uc2e4\ud328\"\n        exit 1\n    fi\n\n    echo \"$password\"\n}\n\n# \uba54\uc778 \ubc31\uc5c5 \uc2a4\ud06c\ub9bd\ud2b8\nmain() {\n    # \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc5f0\uacb0 \uc815\ubcf4\n    DB_HOST=\"pg-32lqva.vpc-cdb-kr.ntruss.com\"\n    DB_USER=\"manvscloud\"\n    DB_PORT=\"15432\"\n    DB_NAME=\"manvscloud\"\n    BUCKET_NAME=\"manvscloud-psql-backup\"\n\n    # Secret Manager\uc5d0\uc11c DB \ube44\ubc00\ubc88\ud638 \uac00\uc838\uc624\uae30\n    echo \"Secret Manager\uc5d0\uc11c \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ube44\ubc00\ubc88\ud638\ub97c \uac00\uc838\uc624\ub294 \uc911...\"\n    DB_PASSWORD=$(get_db_password)\n    \n    if [ -z \"$DB_PASSWORD\" ]; then\n        echo \"\ub370\uc774\ud130\ubca0\uc774\uc2a4 \ube44\ubc00\ubc88\ud638\ub97c \uac00\uc838\uc624\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4.\"\n        exit 1\n    fi\n    echo \"\ube44\ubc00\ubc88\ud638\ub97c \uc131\uacf5\uc801\uc73c\ub85c \uac00\uc838\uc654\uc2b5\ub2c8\ub2e4.\"\n\n    # \ud604\uc7ac \ub0a0\uc9dc\uc640 \uc2dc\uac04 \uc815\ubcf4 \uac00\uc838\uc624\uae30\n    CURRENT_DATE=$(date +\"%Y%m%d%H%M\")\n    YEAR=$(date +\"%Y\")\n    MONTH=$(date +\"%m\")\n    DAY=$(date +\"%d\")\n\n    # \ubc31\uc5c5 \ud30c\uc77c \uacbd\ub85c \ubc0f \uc774\ub984 \uc124\uc815\n    BACKUP_DIR=\"\/tmp\"\n    BACKUP_FILE=\"${DB_NAME}_${CURRENT_DATE}.sql\"\n    COMPRESSED_FILE=\"${BACKUP_FILE}.gz\"\n    OBJECT_PATH=\"${YEAR}\/${MONTH}\/${DAY}\/${COMPRESSED_FILE}\"\n\n    # \ubc31\uc5c5 \ub514\ub809\ud1a0\ub9ac\uac00 \uc5c6\uc73c\uba74 \uc0dd\uc131\n    mkdir -p ${BACKUP_DIR}\n    echo \"PostgreSQL \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ubc31\uc5c5\uc744 \uc2dc\uc791\ud569\ub2c8\ub2e4...\"\n\n    # pg_dump\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ubc31\uc5c5\n    PGPASSWORD=\"${DB_PASSWORD}\" pg_dump -h ${DB_HOST} -U ${DB_USER} -p ${DB_PORT} -d ${DB_NAME} -F p > ${BACKUP_DIR}\/${BACKUP_FILE}\n\n    # \ubc31\uc5c5 \uc131\uacf5 \uc5ec\ubd80 \ud655\uc778\n    if [ $? -ne 0 ]; then\n        echo \"\ub370\uc774\ud130\ubca0\uc774\uc2a4 \ubc31\uc5c5 \uc2e4\ud328\"\n        exit 1\n    fi\n    echo \"\ub370\uc774\ud130\ubca0\uc774\uc2a4 \ubc31\uc5c5\uc774 \uc644\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ud30c\uc77c \uc555\ucd95\uc744 \uc2dc\uc791\ud569\ub2c8\ub2e4...\"\n\n    # \ubc31\uc5c5 \ud30c\uc77c \uc555\ucd95\n    gzip -f ${BACKUP_DIR}\/${BACKUP_FILE}\n\n    # \uc555\ucd95 \uc131\uacf5 \uc5ec\ubd80 \ud655\uc778\n    if [ $? -ne 0 ]; then\n        echo \"\ubc31\uc5c5 \ud30c\uc77c \uc555\ucd95 \uc2e4\ud328\"\n        exit 1\n    fi\n    echo \"\ud30c\uc77c \uc555\ucd95\uc774 \uc644\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4. NAVER Cloud Object Storage\uc5d0 \uc5c5\ub85c\ub4dc\ub97c \uc2dc\uc791\ud569\ub2c8\ub2e4...\"\n\n    # curl\uc744 \uc0ac\uc6a9\ud558\uc5ec Object Storage\uc5d0 \uc5c5\ub85c\ub4dc\n    echo \"curl\uc744 \uc0ac\uc6a9\ud558\uc5ec Object Storage\uc5d0 \uc5c5\ub85c\ub4dc\ud569\ub2c8\ub2e4...\"\n    \n    # S3 \ub0a0\uc9dc \ud615\uc2dd (RFC 1123)\n    DATE=$(date -u +\"%a, %d %b %Y %H:%M:%S GMT\")\n    \n    # \uc5c5\ub85c\ub4dc\ud560 \ud30c\uc77c \uacbd\ub85c\n    FILE_PATH=\"${BACKUP_DIR}\/${COMPRESSED_FILE}\"\n    \n    # Content-Type \uacb0\uc815\n    CONTENT_TYPE=\"application\/gzip\"\n    \n    # \ubc84\ud0b7\uacfc \uc624\ube0c\uc81d\ud2b8 \uc774\ub984\n    RESOURCE=\"\/${BUCKET_NAME}\/${OBJECT_PATH}\"\n    \n    # \uc11c\uba85 \uc0dd\uc131\uc744 \uc704\ud55c \ubb38\uc790\uc5f4\n    STRING_TO_SIGN=\"PUT\\n\\n${CONTENT_TYPE}\\n${DATE}\\n${RESOURCE}\"\n    \n    # HMAC-SHA1 \uc11c\uba85 \uc0dd\uc131\n    SIGNATURE=$(echo -en \"${STRING_TO_SIGN}\" | openssl sha1 -hmac \"${SECRET_KEY}\" -binary | base64)\n    \n    # curl\uc744 \uc0ac\uc6a9\ud558\uc5ec \ud30c\uc77c \uc5c5\ub85c\ub4dc\n    UPLOAD_RESULT=$(curl -s -X PUT \\\n        -T \"${FILE_PATH}\" \\\n        -H \"Host: kr.object.ncloudstorage.com\" \\\n        -H \"Date: ${DATE}\" \\\n        -H \"Content-Type: ${CONTENT_TYPE}\" \\\n        -H \"Authorization: AWS ${ACCESS_KEY}:${SIGNATURE}\" \\\n        \"https:\/\/kr.object.ncloudstorage.com${RESOURCE}\")\n    \n    # \uc5c5\ub85c\ub4dc \uc131\uacf5 \uc5ec\ubd80 \ud655\uc778 (HTTP \uc0c1\ud0dc \ucf54\ub4dc\ub85c \ud655\uc778)\n    CURL_EXIT_CODE=$?\n    if [ ${CURL_EXIT_CODE} -ne 0 ]; then\n        echo \"Object Storage \uc5c5\ub85c\ub4dc \uc2e4\ud328: curl \uc624\ub958 (\ucf54\ub4dc: ${CURL_EXIT_CODE})\"\n        echo \"\uc751\ub2f5: ${UPLOAD_RESULT}\"\n        exit 1\n    fi\n    \n    # \uc5c5\ub85c\ub4dc\uac00 \uc131\uacf5\uc801\uc73c\ub85c \uc644\ub8cc\ub418\uc5c8\ub294\uc9c0 \ud655\uc778\n    # (curl\uc774 \uc131\uacf5\uc801\uc73c\ub85c \uc644\ub8cc\ub418\uba74 \ube48 \uc751\ub2f5\uc744 \ubc18\ud658\ud568)\n    if [[ -n \"${UPLOAD_RESULT}\" &amp;&amp; \"${UPLOAD_RESULT}\" == *error* ]]; then\n        echo \"Object Storage \uc5c5\ub85c\ub4dc \uc2e4\ud328: ${UPLOAD_RESULT}\"\n        exit 1\n    fi\n    echo \"\ubc31\uc5c5 \ud30c\uc77c\uc774 \uc131\uacf5\uc801\uc73c\ub85c NAVER Cloud Object Storage\uc5d0 \uc5c5\ub85c\ub4dc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\"\n    echo \"\uacbd\ub85c: ${BUCKET_NAME}\/${OBJECT_PATH}\"\n\n    # \uc784\uc2dc \ubc31\uc5c5 \ud30c\uc77c \uc815\ub9ac\n    rm -f ${BACKUP_DIR}\/${COMPRESSED_FILE}\n    echo \"\uc784\uc2dc \ud30c\uc77c\uc774 \uc815\ub9ac\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ubc31\uc5c5 \ud504\ub85c\uc138\uc2a4\uac00 \uc644\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\"\n}\n\n# \uc2a4\ud06c\ub9bd\ud2b8 \uc2e4\ud589\nmain\n<\/pre>\n\n\n\n<p>\uc2e4\uc81c \ud658\uacbd\uc5d0 \ub9de\uac8c \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc218\uc815\ud558\uc5ec \uc0ac\uc6a9\ud558\uc2dc\ub824\uba74 <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\"><strong>main() <\/strong>\ud568\uc218 \uc2dc\uc791 \ubd80\ubd84\uc5d0 \uc788\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc5f0\uacb0 \uc815\ubcf4\uc640 \ubc84\ud0b7 \uc815\ubcf4\ub97c \ubcc0\uacbd<\/mark>\ud574\uc8fc\uc154\uc57c \ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">main() {\n    # \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc5f0\uacb0 \uc815\ubcf4\n    DB_HOST=\"example.vpc-cdb-kr.ntruss.com\"\n    DB_USER=\"manvscloud\"\n    DB_PORT=\"15432\"\n    DB_NAME=\"manvscloud\"\n    BUCKET_NAME=\"manvscloud-psql-backup\"<\/pre>\n\n\n\n<p>\ubc31\uc5c5\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \uc644\ub8cc\ub418\uba74 \uc9c0\uc815\ud55c Object Storage\uc5d0 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ubc31\uc5c5\uc774 \uc788\uc5b4\uc57c\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"732\" height=\"314\" src=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2025\/03\/16021256\/cdb_psql_obj_bak.png\" alt=\"\" class=\"wp-image-3003\" srcset=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2025\/03\/16021256\/cdb_psql_obj_bak.png 732w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2025\/03\/16021256\/cdb_psql_obj_bak-300x129.png 300w\" sizes=\"(max-width: 732px) 100vw, 732px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\"># \uc2a4\ud06c\ub9bd\ud2b8 \ub3d9\uc791 \ubc29\uc2dd \uc0c1\uc138 \uc124\uba85<\/h4>\n\n\n\n<p>\uc774 \uc2a4\ud06c\ub9bd\ud2b8\ub294 \ud06c\uac8c \ub2e4\uc74c\uacfc \uac19\uc740 \uc21c\uc11c\ub85c \ub3d9\uc791\ud569\ub2c8\ub2e4:<\/p>\n\n\n\n<ol>\n<li><strong>Secret Manager\uc5d0\uc11c \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ube44\ubc00\ubc88\ud638 \uac80\uc0c9<\/strong>:\n<ul>\n<li>NAVER Cloud Secret Manager API\ub97c \ud638\ucd9c\ud558\uc5ec \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ube44\ubc00\ubc88\ud638\ub97c \uc548\uc804\ud558\uac8c \uac00\uc838\uc635\ub2c8\ub2e4.<\/li>\n\n\n\n<li>API \ud638\ucd9c \uc2dc \uc801\uc808\ud55c \uc11c\uba85\uc744 \uc0dd\uc131\ud558\uc5ec \uc778\uc99d\uc744 \uc218\ud589\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li>\uc751\ub2f5\uc5d0\uc11c Python \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc774\uc6a9\ud574 \ube44\ubc00\ubc88\ud638 \uac12\uc744 \ucd94\ucd9c\ud569\ub2c8\ub2e4.<br><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\ub370\uc774\ud130\ubca0\uc774\uc2a4 \ubc31\uc5c5 \uc0dd\uc131<\/strong>:\n<ul>\n<li>pg_dump \uba85\ub839\uc5b4\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \ubc31\uc5c5\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li>\ubc31\uc5c5 \ud30c\uc77c\uc740 \uc784\uc2dc \ub514\ub809\ud1a0\ub9ac(\/tmp)\uc5d0 \uc800\uc7a5\ub429\ub2c8\ub2e4. (DB \ubc0f \ubcfc\ub968 \uc6a9\ub7c9\uc5d0 \ub530\ub77c \uacbd\ub85c \ubcc0\uacbd \ud544\uc218)<\/li>\n\n\n\n<li>\ub0a0\uc9dc\uc640 \uc2dc\uac04\uc744 \ud3ec\ud568\ud55c \ud30c\uc77c\uba85\uc73c\ub85c \uc0dd\uc131\ud558\uc5ec \ubc31\uc5c5 \ubc84\uc804 \uad00\ub9ac\uac00 \uc6a9\uc774\ud558\uac8c \ud569\ub2c8\ub2e4.<br><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\ubc31\uc5c5 \ud30c\uc77c \uc555\ucd95<\/strong>:\n<ul>\n<li>\uc0dd\uc131\ub41c SQL \ubc31\uc5c5 \ud30c\uc77c\uc744 gzip\uc73c\ub85c \uc555\ucd95\ud558\uc5ec \uc6a9\ub7c9\uc744 \uc904\uc785\ub2c8\ub2e4.<br><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Object Storage\uc5d0 \uc5c5\ub85c\ub4dc<\/strong>:\n<ul>\n<li>AWS S3 \ud638\ud658 API\ub97c \ud1b5\ud574 NAVER Cloud Object Storage\uc5d0 \ubc31\uc5c5 \ud30c\uc77c\uc744 \uc5c5\ub85c\ub4dc\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li>\ub144\/\uc6d4\/\uc77c \ud615\uc2dd\uc758 \ud3f4\ub354 \uad6c\uc870\ub85c \uc800\uc7a5\ud558\uc5ec \ubc31\uc5c5 \ud30c\uc77c\uc744 \uccb4\uacc4\uc801\uc73c\ub85c \uad00\ub9ac\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li>curl\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc9c1\uc811 API \ud638\ucd9c\uc744 \uc218\ud589\ud558\ubbc0\ub85c AWS CLI\uac00 \ud544\uc694\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<br><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\uc815\ub9ac \ubc0f \uc644\ub8cc<\/strong>:\n<ul>\n<li>\uc5c5\ub85c\ub4dc\uac00 \uc644\ub8cc\ub41c \ud6c4 \uc784\uc2dc \ud30c\uc77c\uc744 \uc0ad\uc81c\ud558\uc5ec \ub514\uc2a4\ud06c \uacf5\uac04\uc744 \ud655\ubcf4\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>\uc774\uc81c \uc791\uc131\ub41c \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc2e4\ud589\ud558\uc5ec \ud14c\uc2a4\ud2b8\ud574\ubcf4\uace0 \uc815\uc0c1\uc801\uc73c\ub85c \uc2e4\ud589\ub41c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \ubc29\ubc95\uc73c\ub85c \uc790\ub3d9\ud654\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p><strong>1) Crontab\uc744 \ud65c\uc6a9\ud55c \uc815\uae30 \ubc31\uc5c5 \uc2a4\ucf00\uc904\ub9c1<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \ub9e4\uc77c \uc0c8\ubcbd 2\uc2dc\uc5d0 \ubc31\uc5c5 \uc2a4\ud06c\ub9bd\ud2b8 \uc2e4\ud589\n0 2 * * * \/path\/to\/backup_script.sh >> \/var\/log\/db_backup.log 2>&amp;1<\/pre>\n\n\n\n<p><strong>2) \uae30\uc874 \uc54c\ub9bc \uc2dc\uc2a4\ud15c\uacfc\uc758 \ud1b5\ud569<\/strong><br> : \uc9c0\ub09c \ud3ec\uc2a4\ud305\uc5d0\uc11c \uad6c\ud604\ud55c \ubc31\uc5c5 \uc131\uacf5\/\uc2e4\ud328 \uc54c\ub9bc \uae30\ub2a5\uc744 \uc5c5\uadf8\ub808\uc774\ub4dc\ud558\uc5ec \uad00\ub9ac\ud615 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ubc31\uc5c5 \uc2e4\ud328 \uc2dc \uc790\ub3d9\uc73c\ub85c \uc774 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc2e4\ud589\ud558\ub3c4\ub85d \uad6c\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p><strong>3) \ubc31\uc5c5 \uc218\uba85 \uc8fc\uae30 \uad00\ub9ac<\/strong><br> : Object Storage\uc758 \uc218\uba85 \uc8fc\uae30 \uc815\ucc45\uc744 \uc124\uc815\ud558\uc5ec \uc624\ub798\ub41c \ubc31\uc5c5\uc744 \uc790\ub3d9\uc73c\ub85c \uc0ad\uc81c\ud558\uac70\ub098 Archive Storage\ub85c \uc774\ub3d9\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading has-white-color has-cyan-bluish-gray-background-color has-text-color has-background has-link-color wp-elements-790b4ede7486cf11fc8601a67c8dcb47\"> Personal Comments<\/h3>\n\n\n\n<p>\uc624\ub298 \ud3ec\uc2a4\ud305\uc744 \ud1b5\ud574 \uad00\ub9ac\ud615 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \ubc31\uc5c5\uc774 \uc2e4\ud328\ud558\ub354\ub77c\ub3c4 \uc6b0\ub9ac\ub294 \uc790\uccb4\uc801\uc778 \ubc31\uc5c5 \uc2dc\uc2a4\ud15c\uc744 \uad6c\ucd95\ud558\uc5ec \ub370\uc774\ud130\ub97c \uc548\uc804\ud558\uac8c \ubcf4\uad00\ud560 \uc218 \uc788\uac8c \ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\ubb3c\ub860 \uc774 \ubc29\uc2dd\uc5d0\ub3c4 \uad00\ub9ac\ud615 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \uae30\ubcf8 \ubc31\uc5c5 \uae30\ub2a5\uc744 \uc644\uc804\ud788 \ub300\uccb4\ud560 \uc218\ub294 \uc5c6\ub294 \ud55c\uacc4\uac00 \uc788\uc2b5\ub2c8\ub2e4. \ud2b9\ud788 \ud2b9\uc815 \uc2dc\uc810\uc73c\ub85c\uc758 \ubcf5\uad6c(Point-in-Time Recovery) \uac19\uc740 \uace0\uae09 \uae30\ub2a5\uc740 \uc9c1\uc811 \uad6c\ud604\ud558\uae30 \ubcf5\uc7a1\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c \uac00\ub2a5\ud558\ub2e4\uba74 \uad00\ub9ac\ud615 \ubc31\uc5c5\uacfc \uc774 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \ubcd1\ud589\ud558\uc5ec \uc774\uc911 \ubc31\uc5c5 \uccb4\uacc4\ub97c \uad6c\ucd95\ud558\ub294 \uac83\uc774 \uac00\uc7a5 \uc774\uc0c1\uc801\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc774 \uae00\uc774 \uad00\ub9ac\ud615 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ubc31\uc5c5\uc5d0 \ub300\ud55c \uace0\ubbfc\uc744 \ud574\uacb0\ud558\ub294 \ub370 \ub3c4\uc6c0\uc774 \ub418\uae38 \ubc14\ub78d\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uae34 \uae00 \uc77d\uc5b4\uc8fc\uc154\uc11c \uac10\uc0ac\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"137\" src=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/08\/10202040\/ncloud-master.png\" alt=\"\" class=\"wp-image-1221\" srcset=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/08\/10202040\/ncloud-master.png 800w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/08\/10202040\/ncloud-master-300x51.png 300w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/08\/10202040\/ncloud-master-768x132.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>\uc548\ub155\ud558\uc138\uc694 MANVSCLOUD \uae40\uc218\ud604\uc785\ub2c8\ub2e4. \uc9c0\ub09c \ud3ec\uc2a4\ud305\uc5d0\uc11c \uc6b0\ub9ac\ub294 \uad00\ub9ac\ud615 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \ubc31\uc5c5 \uc131\uacf5\/\uc2e4\ud328 \uc5ec\ubd80\ub97c Slack\uc73c\ub85c \uc54c\ub9bc\uc744 \ubc1b\uc744 \uc218 \uc788\ub3c4\ub85d \uae30\ub2a5\uc744 \uad6c\ud604\ud574\ubcf4\uc558\uc2b5\ub2c8\ub2e4. \ubc31\uc5c5 \uc54c\ub9bc\uc744 \ud1b5\ud574 \ubb38\uc81c \uc0c1\ud669\uc744 \ube60\ub974\uac8c \uc778\uc9c0\ud560 \uc218 \uc788\uac8c \ub418\uc5c8\uc9c0\ub9cc \uc5ec\uc804\ud788 \ubc31\uc5c5 \uc2e4\ud328 \uc790\uccb4\ub294 \ud574\uacb0\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. \uc774\uc81c \uc774\uc5b4\uc11c \ubc31\uc5c5 \uc2e4\ud328 \ubb38\uc81c\ub97c \uc5b4\ub5bb\uac8c \uadfc\ubcf8\uc801\uc73c\ub85c \ud574\uacb0\ud560 \uc218 \uc788\uc744\uc9c0 \uc774\uc57c\uae30\ud574\ubcf4\uace0\uc790 \ud569\ub2c8\ub2e4. \uc798 \ub9cc\ub4e4\uc5b4\uc9c4 \uc258 \uc2a4\ud06c\ub9bd\ud2b8 \ud558\ub098 \uc624\ub298\ub3c4 \uc5ed\uc2dc PostgreSQL\uc744 \uae30\uc900\uc73c\ub85c \uc791\uc131\ud558\uba70 pg_dump \uc720\ud2f8\ub9ac\ud2f0\ub97c \uc774\uc6a9\ud560 \uac83\uc785\ub2c8\ub2e4. \uc774\uc804 \ud3ec\uc2a4\ud305\uc5d0\uc11c Cloud Functions\uc744 \ud65c\uc6a9\ud588\uc9c0\ub9cc \uc774\ubc88\uc5d0\ub294 \ub2e4\ub978 \uc811\uadfc \ubc29\uc2dd\uc744 \ucde8\ud558\uaca0\uc2b5\ub2c8\ub2e4. Cloud Functions\uc758 \uacbd\uc6b0 TimeOut \uc124\uc815\uac12\uc774 \uc9e7\uc740 \ud3b8\uc774\ub77c \ubc31\uc5c5 \ubc0f \uc5c5\ub85c\ub4dc \uc2dc\uac04 \uc18c\uc694\uac00 \uae38\uc5b4\uc9c0\uba74 \ubc31\uc5c5 \uc2e4\ud328\ub85c \uc774\uc5b4\uc9c8 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc774\ubc88\uc5d0\ub294 \uc11c\ubc84\uc5d0\uc11c \uc9c1\uc811 \uc258 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc2e4\ud589\uc2dc\ud0a4\ub294 \ubc29\uc2dd\uc73c\ub85c \uc900\ube44\ud588\uc2b5\ub2c8\ub2e4. \ucd94\uac00\ub85c \uc81c\uac00 \uc791\uc131\ud55c \uc258 \uc2a4\ud06c\ub9bd\ud2b8\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ud328\uc2a4\uc6cc\ub4dc\ub97c \uc9c1\uc811 \uc2a4\ud06c\ub9bd\ud2b8\uc5d0 \ud558\ub4dc\ucf54\ub529\ud558\uac70\ub098 \ud658\uacbd\ubcc0\uc218\ub85c \ub178\ucd9c\uc2dc\ud0a4\uc9c0 \uc54a\uae30 \uc704\ud574 Secret Manager\ub97c \uc0ac\uc6a9\ud558\ub294 \uae30\uc900\uc73c\ub85c \uc791\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc774\ub294 \ubcf4\uc548 \ubaa8\ubc94 \uc0ac\ub840\ub97c \ub530\ub974\ub294 \uc811\uadfc\ubc95\uc73c\ub85c \ubbfc\uac10\ud55c \uc790\uaca9 \uc99d\uba85\uc744 \uc548\uc804\ud558\uac8c \uad00\ub9ac\ud560 \uc218 \uc788\uac8c \ud574\uc90d\ub2c8\ub2e4. Secret Manager\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\uc9c0 \uc54a\ub2e4\uba74 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc801\uc808\ud788 \uc218\uc815\ud558\uc5ec \ub2e4\ub978 \ubcf4\uc548 \ubc29\uc2dd\uc744 \ud65c\uc6a9\ud574\uc8fc\uc138\uc694. \uc774 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc2e4\ud589\ud558\uae30 \uc804\uc5d0 \uc544\ub798 \ub124 \uac00\uc9c0 \ud56d\ubaa9\uc744 \ud655\uc778\ud574\uc8fc\uc138\uc694: 1. Ubuntu 22.04 \uae30\uc900 pg_dump \uc0ac\uc6a9\uc744 \uc704\ud55c \uc900\ube44: PostgreSQL \ud074\ub77c\uc774\uc5b8\ud2b8 \ub3c4\uad6c \uc124\uce58\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. 2. AWS CLI \uc124\uce58 \ubd88\ud544\uc694: \uc774 \uc2a4\ud06c\ub9bd\ud2b8\ub294 AWS CLI \uc5c6\uc774\ub3c4 Object Storage\uc640 \ud1b5\uc2e0\ud560 \uc218 \uc788\ub3c4\ub85d \uc791\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4. curl \uba85\ub839\uc744 \ud65c\uc6a9\ud558\uc5ec \uc9c1\uc811 API \ud638\ucd9c\uc744 \uc218\ud589\ud569\ub2c8\ub2e4. (\ubb3c\ub860 \uc124\uce58\uac00 \ub418\uc5b4\uc788\uc5b4\ub3c4 \uc815\uc0c1 \ub3d9\uc791\ud569\ub2c8\ub2e4.) 3. \ub124\ud2b8\uc6cc\ud06c \uc5f0\uacb0 \uc124\uc815: \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc2e4\ud589\ud558\ub294 \uc11c\ubc84\uc5d0\uc11c Cloud [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3],"tags":[505,1008,32,87,91,17,90,16,354,1012,1010,1011,1013,1009,89,202,398,509,587],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/manvscloud.com\/index.php?rest_route=\/wp\/v2\/posts\/2990"}],"collection":[{"href":"https:\/\/manvscloud.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/manvscloud.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/manvscloud.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/manvscloud.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2990"}],"version-history":[{"count":9,"href":"https:\/\/manvscloud.com\/index.php?rest_route=\/wp\/v2\/posts\/2990\/revisions"}],"predecessor-version":[{"id":3005,"href":"https:\/\/manvscloud.com\/index.php?rest_route=\/wp\/v2\/posts\/2990\/revisions\/3005"}],"wp:attachment":[{"href":"https:\/\/manvscloud.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2990"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/manvscloud.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2990"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/manvscloud.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2990"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}