{"id":2253,"date":"2023-05-16T13:08:12","date_gmt":"2023-05-16T04:08:12","guid":{"rendered":"https:\/\/manvscloud.com\/?p=2253"},"modified":"2023-05-16T13:08:12","modified_gmt":"2023-05-16T04:08:12","slug":"ncloud-acg-backup-access-control-group-%ec%a0%95%ec%b1%85-csv%eb%a1%9c-%eb%82%b4%eb%b3%b4%eb%82%b4%ea%b8%b0","status":"publish","type":"post","link":"https:\/\/manvscloud.com\/?p=2253","title":{"rendered":"[NCLOUD] ACG Backup &#8211; Access Control Group \uc815\ucc45 CSV\ub85c \ub0b4\ubcf4\ub0b4\uae30"},"content":{"rendered":"\n<p>\uc548\ub155\ud558\uc138\uc694 MANVSCLOUD \uae40\uc218\ud604\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\ub124\uc774\ubc84 \ud074\ub77c\uc6b0\ub4dc \ud50c\ub7ab\ud3fc\uc5d0\uc11c Access Control Group(ACG) \uc815\ucc45\uc744 CSV \ud30c\uc77c\ub85c \ub0b4\ubcf4\ub0b4\ub294 \uac83\uc774 \uac00\ub2a5\ud560\uae4c\uc694?<br>\uac00\ub2a5\uc740 \ud569\ub2c8\ub2e4\ub9cc \ud604\uc7ac \ub124\uc774\ubc84 \ud074\ub77c\uc6b0\ub4dc \ud50c\ub7ab\ud3fc \uc11c\ube44\uc2a4\uc5d0\uc11c\ub294 \ub530\ub85c \uc9c0\uc6d0\ud558\uace0 \uc788\uc9c0 \uc54a\uc740 \uae30\ub2a5\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc774\ub7ec\ud55c \uae30\ub2a5\uc774 \uc788\ub2e4\uba74 \uac01 ACG\uc758 INBOUND, OUTBOUND \uc815\ucc45\uc744 \ubaa8\uc544\uc11c \ubcfc \uc218 \uc788\uace0 \ud2b9\uc815 VPC \ud658\uacbd\uc744 \ub2e4\ub978 \uacc4\uc815\uc73c\ub85c \ub9c8\uc774\uadf8\ub808\uc774\uc158\ud560 \ub54c\ub3c4 \ud65c\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br>AWS\uc758 \ubcf4\uc548 \uadf8\ub8f9\uc5d0\uc11c\ub294 \uc774\ub7ec\ud55c [CSV\ub85c \ub0b4\ubcf4\ub0b4\uae30] \uae30\ub2a5\uc744 \ub530\ub85c \uc9c0\uc6d0\ud558\uace0 \uc788\ub294\ub370\uc694.<\/p>\n\n\n\n<p>\uc774 \uae00\uc744 \ud1b5\ud574 \ub124\uc774\ubc84 \ud074\ub77c\uc6b0\ub4dc \ud50c\ub7ab\ud3fc\uc5d0\uc11c Access Control Group(ACG)\uc744 CSV \ud30c\uc77c\ub85c \ub0b4\ubcf4\ub0b4\ub294 \ubc29\ubc95\ubfd0\ub9cc \uc544\ub2c8\ub77c Object Storage\uc5d0 \uc815\uae30\uc801\uc73c\ub85c \ubc31\uc5c5\ud558\ub294 \ubc29\ubc95\uae4c\uc9c0 \uc54c \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=\"has-white-color has-vivid-green-cyan-background-color has-text-color has-background wp-block-heading\"> ACG Backup (feat. \uc5c6\uc73c\uba74 \ub9cc\ub4e4\uc5b4\uc57c\uc9c0)<\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"681\" height=\"441\" src=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22152617\/acg-backup-flow.png\" alt=\"\" class=\"wp-image-2257\" srcset=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22152617\/acg-backup-flow.png 681w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22152617\/acg-backup-flow-300x194.png 300w\" sizes=\"(max-width: 681px) 100vw, 681px\" \/><\/figure>\n\n\n\n<p>\ub124\uc774\ubc84 \ud074\ub77c\uc6b0\ub4dc \ud50c\ub7ab\ud3fc\uc5d0\uc11c CSV \ud30c\uc77c\ub85c ACG \uc815\ucc45\uc744 \ub0b4\ubcf4\ub0b4\ub294 \uae30\ub2a5\uc740 \uae30\ubcf8\uc801\uc73c\ub85c \uc81c\uacf5\ub418\uc9c0 \uc54a\uc9c0\ub9cc API\ub97c \ud65c\uc6a9\ud558\uc5ec \uc9c1\uc811 \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"has-vivid-cyan-blue-color has-text-color\">\u2460 Cloud Functions\uc744 \uc774\uc6a9\ud558\uc5ec ACG \ub9ac\uc2a4\ud2b8\ub97c \uc870\ud68c\ud558\uace0 \u2461 \uc870\ud68c\ub41c ACG\uc758 Inbound \ubc0f Outbound \uc815\ucc45\uc744 \ud30c\uc545\ud558\uc5ec \u2462 CSV \ud30c\uc77c\ub85c \uc0dd\uc131\ud569\ub2c8\ub2e4. \u2463 \uc774\ud6c4 \uc0dd\uc131\ub41c CSV \ud30c\uc77c\uc740 Object Storage\ub85c \uc5c5\ub85c\ub4dc\ud558\uace0 \u2464 Object Storage\uc758 \uc815\ucc45\uc5d0 \ub530\ub77c \uc0ad\uc81c\ub418\uac70\ub098 Archive Storage\ub85c \uc774\ub3d9\ub418\ub3c4\ub85d \uc124\uc815\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p>Cloud Functions\uc5d0\uc11c CSV \ud30c\uc77c \uc0dd\uc131 \uc2dc\uc5d0\ub294 io.StringIO \ub610\ub294 io.BytesIO\ub97c \uc0ac\uc6a9\ud558\uc5ec \uba54\ubaa8\ub9ac\uc5d0 \ud30c\uc77c \uac1d\uccb4\ub97c \uc0dd\uc131\ud560 \uac83\uc785\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \ub85c\uceec\uc5d0 CSV \ud30c\uc77c\uc744 \uc0dd\uc131\ud558\uc9c0 \uc54a\uace0 \uba54\ubaa8\ub9ac\uc5d0\uc11c \ubc14\ub85c \uc624\ube0c\uc81d\ud2b8 \uc2a4\ud1a0\ub9ac\uc9c0\ub85c \uc5c5\ub85c\ub4dc \ub420 \uc218 \uc788\ub3c4\ub85d \uad6c\ud604\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"has-white-color has-vivid-green-cyan-background-color has-text-color has-background wp-block-heading\"> A to Z<\/h3>\n\n\n\n<p><span style=\"text-decoration: underline;\"># VPC, Server \uc0dd\uc131\uc5d0 \ub300\ud55c \uac00\uc774\ub4dc\ub294 \uc0dd\ub7b5\ud569\ub2c8\ub2e4.<br># Python\uc740 3.7 \ubc84\uc804\uc774 \uc0ac\uc6a9\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n\n\n\n<p>Cloud Functions\uc5d0\uc11c\ub294 Boto3 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc81c\uacf5\ud558\uc9c0 \uc54a\uae30\ub54c\ubb38\uc5d0 boto3 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \ud3ec\ud568\uc2dc\ucf1c \uc555\ucd95\ud55c \ud6c4 .zip \ud30c\uc77c\ub85c \uc5c5\ub85c\ub4dc\ud560 \uac83\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc544\ub798 \uc608\uc2dc\ub294 Linux \ud658\uacbd\uc744 \uae30\uc900\uc73c\ub85c \uc791\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<ul><li><strong>\ucf54\ub4dc \uc791\uc131 \ubc0f .zip \ud30c\uc77c \uc0dd\uc131<\/strong><\/li><\/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=\"\">mkdir acg_backup\ncd acg_backup\npython -m venv venv\nsource venv\/bin\/activate\npip install boto3\ncp -r venv\/lib\/python3.x\/site-packages\/* .\nvi main__.py<\/pre>\n\n\n\n<p> venv\ub97c \uc774\uc6a9\ud558\uc5ec \uac00\uc0c1 \ud658\uacbd\uc744 \ub9cc\ub4e4\uc5b4\uc900 \ub4a4 boto3\ub97c install\ud558\uace0 main__.py\ub97c \uc791\uc131\ud558\uc600\uc2b5\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=\"\">import hashlib\nimport hmac\nimport base64\nimport requests\nimport time\nimport json\nimport csv\nimport io\nimport boto3\nfrom datetime import datetime\n\ndef generate_header(method, uri, access_key, secret_key):\n    timestamp = str(int(time.time() * 1000))\n    secret_key = bytes(secret_key, 'UTF-8')\n\n    message = bytes(method + \" \" + uri + \"\\n\" + timestamp + \"\\n\" + access_key, 'UTF-8')\n    signingKey = base64.b64encode(hmac.new(secret_key, message, digestmod=hashlib.sha256).digest())\n\n    http_header = {\n        'x-ncp-apigw-signature-v2': signingKey,\n        'x-ncp-apigw-timestamp': timestamp,\n        'x-ncp-iam-access-key': access_key,\n    }\n\n    return http_header\n\ndef write_csv_to_memory(csv_data):\n    output = io.StringIO()\n    writer = csv.writer(output, delimiter=',', quotechar='\"', quoting=csv.QUOTE_MINIMAL)\n    writer.writerows(csv_data)\n    output.seek(0)\n    return output\n\ndef get_ACG_list(access_key, secret_key, region, vpcid):\n\n    method = \"GET\"\n    api_server = \"https:\/\/ncloud.apigw.ntruss.com\"\n    uri = \"\/vserver\/v2\/getAccessControlGroupList?regionCode=\" + region + \"&amp;vpcNo=\" + vpcid\n    uri = uri + \"&amp;responseFormatType=json\"\n\n    http_header = generate_header(method, uri, access_key, secret_key)\n\n    response = requests.get(api_server + uri, headers=http_header)\n\n    json_data = json.loads(response.text)\n    data = json_data['getAccessControlGroupListResponse']['accessControlGroupList']\n    result = []\n\n    for group in data:\n        if 'default' not in group['accessControlGroupName']:\n            result.append({\n                'accessControlGroupNo': group['accessControlGroupNo'],\n                'accessControlGroupName': group['accessControlGroupName']\n            })\n\n    return result\n\n\ndef create_ACG_rule_csv(access_key, secret_key, region, vpcid):\n\n    acg_data = get_ACG_list(access_key, secret_key, region, vpcid)\n    acg_dict = {item['accessControlGroupNo']: item['accessControlGroupName'] for item in acg_data}\n    acgids = list(acg_dict.keys())\n\n    csv_data = [['accessControlGroupNo', 'accessControlGroupName', 'codeName', 'codeName', 'portRange', 'ipBlock']]\n\n    for acg_no in acgids:\n\n        method = \"GET\"\n        api_server = \"https:\/\/ncloud.apigw.ntruss.com\"\n        uri = \"\/vserver\/v2\/getAccessControlGroupRuleList?regionCode=\" + region + \"&amp;accessControlGroupNo=\" + acg_no\n        uri = uri + \"&amp;responseFormatType=json\"\n\n        http_header = generate_header(method, uri, access_key, secret_key)\n\n        response = requests.get(api_server + uri, headers=http_header)\n\n        data = json.loads(response.text)['getAccessControlGroupRuleListResponse']['accessControlGroupRuleList']\n\n        for rule in data:\n            row = [rule['accessControlGroupNo'],\n                acg_dict[rule['accessControlGroupNo']],\n                rule['accessControlGroupRuleType']['codeName'],\n                rule['protocolType']['codeName'],\n                rule['portRange'],\n                rule['ipBlock'],\n            ]\n\n            csv_data.append(row)\n\n    return csv_data\n\ndef upload_to_object_storage(file_object, bucket, object_name, s3_client):\n    try:\n        file_object = io.BytesIO(file_object.getvalue().encode('utf-8'))\n        s3_client.upload_fileobj(file_object, bucket, object_name)\n        print(\"Upload successful!\")\n    except Exception as e:\n        print(\"Error:\", e)\n        return False\n    return True\n\n\ndef main(args):\n\n    access_key = args['NCLOUD_ACCESS_KEY']\n    secret_key = args['NCLOUD_SECRET_KEY']\n\n    obj_access_key = args['OBJ_ACCESS_KEY']\n    obj_secret_key = args['OBJ_SECRET_KEY']\n    obj_name = args['OBJ_NAME']\n    obj_dir = args['OBJ_DIR']\n\n    vpcid = args['VPC_ID']\n\n    region = \"KR\"\n\n    api_server = \"https:\/\/ncloud.apigw.ntruss.com\"\n\n    s3_client = boto3.client('s3',\n                             endpoint_url='https:\/\/kr.object.ncloudstorage.com',\n                             aws_access_key_id=obj_access_key,\n                             aws_secret_access_key=obj_secret_key)\n\n    csv_data = create_ACG_rule_csv(access_key, secret_key, region, vpcid)\n    output = write_csv_to_memory(csv_data)\n\n    today = datetime.now().strftime(\"%Y%m%d\")\n    object_name = f\"acg-{today}.csv\"\n\n    upload_to_object_storage(output, obj_name, f'{obj_dir}\/{object_name}', s3_client)\n    return {\"result\": \"success\"}\n<\/pre>\n\n\n\n<p>\uc704 \ucf54\ub4dc\ub294 Cloud Functions\uc5d0\uc11c \ub3d9\uc791\ud560 Python \ucf54\ub4dc\uc785\ub2c8\ub2e4.<br>\uc544\ub798 \uacb0\uacfc\ub97c \ud655\uc778 \ud6c4 \ud544\uc694\ud55c \ubd80\ubd84\uc740 \ucf54\ub4dc\ub97c \uc218\uc815\ud558\uc5ec \ucd94\uac00 \ubc0f \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\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=\"\">drwxr-xr-x 10 root root   210 Apr 21 10:01 boto3\ndrwxr-xr-x  2 root root   133 Apr 21 10:01 boto3-1.26.117.dist-info\ndrwxr-xr-x  8 root root  4096 Apr 21 10:01 botocore\ndrwxr-xr-x  2 root root   120 Apr 21 10:01 botocore-1.29.117.dist-info\ndrwxr-xr-x  6 root root   210 Apr 21 10:01 dateutil\n-rw-r--r--  1 root root   126 Apr 21 10:01 easy_install.py\ndrwxr-xr-x  3 root root   167 Apr 21 10:01 jmespath\ndrwxr-xr-x  2 root root   106 Apr 21 10:01 jmespath-1.0.1.dist-info\n-rw-r--r--  1 root root  4241 Apr 21 10:09 main__.py\ndrwxr-xr-x  5 root root   111 Apr 21 10:01 pip\ndrwxr-xr-x  2 root root   147 Apr 21 10:01 pip-22.0.4.dist-info\ndrwxr-xr-x  5 root root   113 Apr 21 10:01 pkg_resources\ndrwxr-xr-x  2 root root    67 Apr 21 10:01 __pycache__\ndrwxr-xr-x  2 root root   118 Apr 21 10:01 python_dateutil-2.8.2.dist-info\ndrwxr-xr-x  3 root root   318 Apr 21 10:01 s3transfer\ndrwxr-xr-x  2 root root   124 Apr 21 10:01 s3transfer-0.6.0.dist-info\ndrwxr-xr-x  6 root root  4096 Apr 21 10:01 setuptools\ndrwxr-xr-x  2 root root   187 Apr 21 10:01 setuptools-47.1.0.dist-info\ndrwxr-xr-x  2 root root   102 Apr 21 10:01 six-1.16.0.dist-info\n-rw-r--r--  1 root root 34549 Apr 21 10:01 six.py\ndrwxr-xr-x  6 root root   291 Apr 21 10:01 urllib3\ndrwxr-xr-x  2 root root   106 Apr 21 10:01 urllib3-1.26.15.dist-info<\/pre>\n\n\n\n<p>main__.py\uac00 \uc798 \uc791\uc131\ub418\uc5c8\ub2e4\uba74 \uc704 \ud30c\uc77c \ubc0f \ub514\ub809\ud1a0\ub9ac\uac00 \ub9ac\uc2a4\ud2b8\ub85c \ubcf4\uc5ec\uc9c8 \uac83\uc785\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=\"\">zip -r acg_backup.zip *<\/pre>\n\n\n\n<p>Cloud Functions\uc73c\ub85c \uc5c5\ub85c\ub4dc\ud560 \uc218 \uc788\ub3c4\ub85d .zip \ud30c\uc77c\ub85c \uc555\ucd95\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<ul><li><strong>Cloud Functions<\/strong><br>Package \ub610\ub294 Action\uc5d0\uc11c \ub514\ud3f4\ud2b8 \ud30c\ub77c\ubbf8\ud130\ub294 \uc544\ub798\uc640 \uac19\uc774 \uc124\uc815\ud574\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br><br>VPC ID\ub294 Access Control Group(ACG)\uac00 \uc874\uc7ac\ud558\ub294 VPC\uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc73c\uba70 OBJ_ACCESS_KEY\uc640 OBJ_SECRET_KEY\ub294 Object Storage\uc758 \uad8c\ud55c\uc774 \uc788\ub294 \ucd5c\uc18c\ud55c\uc758 \uad8c\ud55c\uc774 \ubd80\uc5ec\ub41c API\uc6a9 Sub Account\uc758 Access Key\uc640 Secret key \ub4f1\uc744 \uc785\ub825\ud574\uc90d\ub2c8\ub2e4.<\/li><\/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=\"\">{\"VPC_ID\":\"0000\",\"OBJ_ACCESS_KEY\":\"AAAAAAAAAA\",\"OBJ_SECRET_KEY\":\"BBBBBBBBBBBBBBBBBBBB\",\"NCLOUD_ACCESS_KEY\":\"CCCCCCCCCC\",\"NCLOUD_SECRET_KEY\":\"DDDDDDDDDDDDDDDDDDDDDD\",\"OBJ_DIR\":\"OBJECTSTRORAGE_DIR\",\"OBJ_NAME\":\"OBJECTSTRORAGE_NAME\"}<\/pre>\n\n\n\n<ul><li><strong>VPC_ID<\/strong> : VPC\uc758 ID<\/li><li><strong>OBJ_ACCESS_KEY<\/strong> : Object Storage\uc5d0 \ub300\ud55c \uad8c\ud55c\uc774 \uc788\ub294 ACCESS KEY<\/li><li><strong>OBJ_SECRET_KEY<\/strong> : Object Storage\uc5d0 \ub300\ud55c \uad8c\ud55c\uc774 \uc788\ub294 SECRET KEY<\/li><li><strong>NCLOUD_ACCESS_KEY<\/strong> : Access Control Group(ACG) \uc870\ud68c\uac00 \uac00\ub2a5\ud55c \uad8c\ud55c\uc774 \uc788\ub294 ACCESS KEY<\/li><li><strong>NCLOUD_SECRET_KEY<\/strong> : Access Control Group(ACG) \uc870\ud68c\uac00 \uac00\ub2a5\ud55c \uad8c\ud55c\uc774 \uc788\ub294 SECRET KEY<\/li><li><strong>OBJ_DIR<\/strong> : CSV \ud30c\uc77c\uc744 \uc800\uc7a5\ud560 \ub514\ub809\ud1a0\ub9ac \uacbd\ub85c <em>ex) 2023<\/em><\/li><li><strong>OBJ_NAME<\/strong> : CSV \ud30c\uc77c\uc744 \uc800\uc7a5\ud560 Object Storage\uc758 \ubc84\ud0b7 \uc774\ub984<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"346\" src=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22201225\/cloudfunctions-code-1024x346.png\" alt=\"\" class=\"wp-image-2265\" srcset=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22201225\/cloudfunctions-code-1024x346.png 1024w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22201225\/cloudfunctions-code-300x101.png 300w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22201225\/cloudfunctions-code-768x259.png 768w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22201225\/cloudfunctions-code-1536x518.png 1536w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22201225\/cloudfunctions-code-1080x364.png 1080w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22201225\/cloudfunctions-code.png 1763w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>\ud30c\uc77c \uc5c5\ub85c\ub4dc\uac00 \uc644\ub8cc\ub418\uc5c8\ub2e4\uba74 \uc800\uc7a5 \ud6c4 Object Storage \uc124\uc815\ub3c4 \ud574\uc90d\uc2dc\ub2e4.<br>\uc704 \uc124\uc815 \uc2dc Cloud Functions\uc774 \uc2e4\ud589\ub418\uba74 CSV \ud30c\uc77c\uc774 Object Storage\uc5d0 \uc0dd\uc131\ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc9c0\uc18d\uc801\uc73c\ub85c CSV \ud30c\uc77c\uc774 \uc313\uc774\uac8c\ub418\uba74 \ube44\uc6a9\uc774 \ub420\ud14c\ub2c8 Object Storage\uc758 \uc218\uba85\uc8fc\uae30 \uc815\ucc45\uc744 \uc124\uc815\ud558\uc5ec \ud2b9\uc815 \uc77c\uc218\uac00 \uc9c0\ub098\uba74 \uc0ad\uc81c\ub418\uac70\ub098 Archive Storage\ub85c \uc774\ub3d9\ub418\ub3c4\ub85d \uc124\uc815\ud574\uc90d\ub2c8\ub2e4.<\/p>\n\n\n\n<ul><li><strong>Object Storage \uc815\ucc45 \uc124\uc815<\/strong><\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"936\" src=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22193746\/objectstorage-policy-1024x936.png\" alt=\"\" class=\"wp-image-2260\" srcset=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22193746\/objectstorage-policy-1024x936.png 1024w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22193746\/objectstorage-policy-300x274.png 300w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22193746\/objectstorage-policy-768x702.png 768w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22193746\/objectstorage-policy.png 1041w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"has-white-color has-vivid-green-cyan-background-color has-text-color has-background wp-block-heading\"> Result<\/h3>\n\n\n\n<p>Cloud Functions \uc2e4\ud589 \uc2dc \uc544\ub798\uc640 \uac19\uc774 result\uac00 success\ub85c \ucd9c\ub825\ub418\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"656\" src=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22200616\/cloudfunctions-run-1024x656.png\" alt=\"\" class=\"wp-image-2262\" srcset=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22200616\/cloudfunctions-run-1024x656.png 1024w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22200616\/cloudfunctions-run-300x192.png 300w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22200616\/cloudfunctions-run-768x492.png 768w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22200616\/cloudfunctions-run-1080x692.png 1080w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22200616\/cloudfunctions-run.png 1493w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>\uc774\ud6c4 Object Storage\uc5d0\uc11c \uc544\ub798\uc640 \uac19\uc774 CSV \ud30c\uc77c\uc774 \uc800\uc7a5\ub418\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22200839\/obj-storage.png\" alt=\"\" class=\"wp-image-2264\" width=\"467\" height=\"308\" srcset=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22200839\/obj-storage.png 737w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22200839\/obj-storage-300x198.png 300w\" sizes=\"(max-width: 467px) 100vw, 467px\" \/><\/figure>\n\n\n\n<p>\uc800\uc7a5\ub41c CSV \ud30c\uc77c\uc744 \ub2e4\uc6b4\ub85c\ub4dc\ud558\uc5ec \ud655\uc778\ud574\ubcf4\uba74 \uac01 ACG\ubcc4\ub85c \uc124\uc815\ub41c Inbound\/Outbound \uc124\uc815\uac12\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"532\" src=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22200627\/acg-csv-1024x532.png\" alt=\"\" class=\"wp-image-2263\" srcset=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22200627\/acg-csv-1024x532.png 1024w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22200627\/acg-csv-300x156.png 300w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22200627\/acg-csv-768x399.png 768w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22200627\/acg-csv-1080x561.png 1080w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2023\/04\/22200627\/acg-csv.png 1191w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>\uc704\uc640 \uac19\uc774 CSV \ud30c\uc77c\ub85c \uc8fc\uae30\uc801\uc73c\ub85c \ubc31\uc5c5\uc744 \ud574\ub450\uba74 \ucd94\ud6c4 ACG\uc5d0 \uc5b4\ub5a4 \uc218\uc815\uc774 \uc77c\uc5b4\ub0ac\ub294\uc9c0 \ube44\uad50\ud558\uc5ec \ud655\uc778\ub3c4 \ud560 \uc218 \uc788\uace0 \ud574\ub2f9 CSV \ud30c\uc77c\uc744 \uc774\uc6a9\ud558\uc5ec \ub3d9\uc77c\ud55c ACG \uc0dd\uc131\uc744 \ub9cc\ub4e4 \ub54c \ubcf5\uc6d0\uc6a9\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\uc744 \uac83\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"has-white-color has-cyan-bluish-gray-background-color has-text-color has-background wp-block-heading\"> Personal Comments<\/h3>\n\n\n\n<p>\uc9c0\uae08\uae4c\uc9c0 \ub124\uc774\ubc84 \ud074\ub77c\uc6b0\ub4dc \ud50c\ub7ab\ud3fc\uc5d0\uc11c ACG(Access Control Group) \uc815\ucc45\uc744 CSV \ud615\uc2dd\uc73c\ub85c Object Storage\uc5d0 \uc8fc\uae30\uc801\uc73c\ub85c \ubc31\uc5c5\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc54c\uc544\ubcf4\uc558\uc2b5\ub2c8\ub2e4. <\/p>\n\n\n\n<p>\uc774 \ud3ec\uc2a4\ud305\uc744 \ud1b5\ud574 \uc774\ub7ec\ud55c \ubc29\ubc95\uc73c\ub85c\ub3c4 ACG(Access Control Group)\ub97c \ubc31\uc5c5\ud558\uace0 \uad00\ub9ac\ud560 \uc218 \uc788\ub2e4\ub294 \uac83\uc744 \uacf5\uc720\ub4dc\ub9ac\uace0 \uc2f6\uc5c8\uc2b5\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\/25143135\/ncloud-master-1.png\" alt=\"\" class=\"wp-image-1265\" srcset=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/08\/25143135\/ncloud-master-1.png 800w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/08\/25143135\/ncloud-master-1-300x51.png 300w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/08\/25143135\/ncloud-master-1-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. \ub124\uc774\ubc84 \ud074\ub77c\uc6b0\ub4dc \ud50c\ub7ab\ud3fc\uc5d0\uc11c Access Control Group(ACG) \uc815\ucc45\uc744 CSV \ud30c\uc77c\ub85c \ub0b4\ubcf4\ub0b4\ub294 \uac83\uc774 \uac00\ub2a5\ud560\uae4c\uc694?\uac00\ub2a5\uc740 \ud569\ub2c8\ub2e4\ub9cc \ud604\uc7ac \ub124\uc774\ubc84 \ud074\ub77c\uc6b0\ub4dc \ud50c\ub7ab\ud3fc \uc11c\ube44\uc2a4\uc5d0\uc11c\ub294 \ub530\ub85c \uc9c0\uc6d0\ud558\uace0 \uc788\uc9c0 \uc54a\uc740 \uae30\ub2a5\uc785\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uae30\ub2a5\uc774 \uc788\ub2e4\uba74 \uac01 ACG\uc758 INBOUND, OUTBOUND \uc815\ucc45\uc744 \ubaa8\uc544\uc11c \ubcfc \uc218 \uc788\uace0 \ud2b9\uc815 VPC \ud658\uacbd\uc744 \ub2e4\ub978 \uacc4\uc815\uc73c\ub85c \ub9c8\uc774\uadf8\ub808\uc774\uc158\ud560 \ub54c\ub3c4 \ud65c\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.AWS\uc758 \ubcf4\uc548 \uadf8\ub8f9\uc5d0\uc11c\ub294 \uc774\ub7ec\ud55c [CSV\ub85c \ub0b4\ubcf4\ub0b4\uae30] \uae30\ub2a5\uc744 \ub530\ub85c \uc9c0\uc6d0\ud558\uace0 \uc788\ub294\ub370\uc694. \uc774 \uae00\uc744 \ud1b5\ud574 \ub124\uc774\ubc84 \ud074\ub77c\uc6b0\ub4dc \ud50c\ub7ab\ud3fc\uc5d0\uc11c Access Control Group(ACG)\uc744 CSV \ud30c\uc77c\ub85c \ub0b4\ubcf4\ub0b4\ub294 \ubc29\ubc95\ubfd0\ub9cc \uc544\ub2c8\ub77c Object Storage\uc5d0 \uc815\uae30\uc801\uc73c\ub85c \ubc31\uc5c5\ud558\ub294 \ubc29\ubc95\uae4c\uc9c0 \uc54c \uc218 \uc788\uc2b5\ub2c8\ub2e4. ACG Backup (feat. \uc5c6\uc73c\uba74 \ub9cc\ub4e4\uc5b4\uc57c\uc9c0) \ub124\uc774\ubc84 \ud074\ub77c\uc6b0\ub4dc \ud50c\ub7ab\ud3fc\uc5d0\uc11c CSV \ud30c\uc77c\ub85c ACG \uc815\ucc45\uc744 \ub0b4\ubcf4\ub0b4\ub294 \uae30\ub2a5\uc740 \uae30\ubcf8\uc801\uc73c\ub85c \uc81c\uacf5\ub418\uc9c0 \uc54a\uc9c0\ub9cc API\ub97c \ud65c\uc6a9\ud558\uc5ec \uc9c1\uc811 \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \u2460 Cloud Functions\uc744 \uc774\uc6a9\ud558\uc5ec ACG \ub9ac\uc2a4\ud2b8\ub97c \uc870\ud68c\ud558\uace0 \u2461 \uc870\ud68c\ub41c ACG\uc758 Inbound \ubc0f Outbound \uc815\ucc45\uc744 \ud30c\uc545\ud558\uc5ec \u2462 CSV \ud30c\uc77c\ub85c \uc0dd\uc131\ud569\ub2c8\ub2e4. \u2463 \uc774\ud6c4 \uc0dd\uc131\ub41c CSV \ud30c\uc77c\uc740 Object Storage\ub85c \uc5c5\ub85c\ub4dc\ud558\uace0 \u2464 Object Storage\uc758 \uc815\ucc45\uc5d0 \ub530\ub77c \uc0ad\uc81c\ub418\uac70\ub098 Archive Storage\ub85c \uc774\ub3d9\ub418\ub3c4\ub85d \uc124\uc815\ud569\ub2c8\ub2e4. Cloud Functions\uc5d0\uc11c CSV \ud30c\uc77c \uc0dd\uc131 \uc2dc\uc5d0\ub294 io.StringIO \ub610\ub294 io.BytesIO\ub97c \uc0ac\uc6a9\ud558\uc5ec \uba54\ubaa8\ub9ac\uc5d0 \ud30c\uc77c \uac1d\uccb4\ub97c \uc0dd\uc131\ud560 \uac83\uc785\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \ub85c\uceec\uc5d0 CSV \ud30c\uc77c\uc744 \uc0dd\uc131\ud558\uc9c0 \uc54a\uace0 \uba54\ubaa8\ub9ac\uc5d0\uc11c \ubc14\ub85c \uc624\ube0c\uc81d\ud2b8 \uc2a4\ud1a0\ub9ac\uc9c0\ub85c \uc5c5\ub85c\ub4dc \ub420 \uc218 \uc788\ub3c4\ub85d \uad6c\ud604\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. A to Z # VPC, Server \uc0dd\uc131\uc5d0 \ub300\ud55c \uac00\uc774\ub4dc\ub294 \uc0dd\ub7b5\ud569\ub2c8\ub2e4.# Python\uc740 3.7 \ubc84\uc804\uc774 \uc0ac\uc6a9\ub418\uc5c8\uc2b5\ub2c8\ub2e4. Cloud Functions\uc5d0\uc11c\ub294 Boto3 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc81c\uacf5\ud558\uc9c0 \uc54a\uae30\ub54c\ubb38\uc5d0 boto3 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \ud3ec\ud568\uc2dc\ucf1c \uc555\ucd95\ud55c \ud6c4 .zip \ud30c\uc77c\ub85c \uc5c5\ub85c\ub4dc\ud560 \uac83\uc785\ub2c8\ub2e4. \uc544\ub798 [&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":"[NCLOUD] ACG Backup - Access Control Group \uc815\ucc45 CSV\ub85c \ub0b4\ubcf4\ub0b4\uae30","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3],"tags":[297,299,505,457,799,863,32,87,91,17,90,16,354,126,805,89,202,398,509,861,862],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/manvscloud.com\/index.php?rest_route=\/wp\/v2\/posts\/2253"}],"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=2253"}],"version-history":[{"count":9,"href":"https:\/\/manvscloud.com\/index.php?rest_route=\/wp\/v2\/posts\/2253\/revisions"}],"predecessor-version":[{"id":2299,"href":"https:\/\/manvscloud.com\/index.php?rest_route=\/wp\/v2\/posts\/2253\/revisions\/2299"}],"wp:attachment":[{"href":"https:\/\/manvscloud.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2253"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/manvscloud.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2253"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/manvscloud.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2253"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}