{"id":639,"date":"2025-11-20T09:23:57","date_gmt":"2025-11-20T09:23:57","guid":{"rendered":"https:\/\/www.nnt-consulting.com\/tech\/blog\/?p=639"},"modified":"2025-11-20T09:23:57","modified_gmt":"2025-11-20T09:23:57","slug":"gcp-airflow-celery-executor","status":"publish","type":"post","link":"https:\/\/www.nnt-consulting.com\/tech\/blog\/gcp-airflow-celery-executor\/","title":{"rendered":"GCP \ud658\uacbd\uc5d0\uc11c\uc758 Airflow Celery Executor \uad6c\ucd95 \ubc0f \uc6b4\uc601 \ud30c\uc774\ud504\ub77c\uc778"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"\ubaa9\ucc28 \ud1a0\uae00\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/gcp-airflow-celery-executor\/#GCP_%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C%EC%9D%98_Airflow_Celery_Executor_%EA%B5%AC%EC%B6%95_%EB%B0%8F_%EC%9A%B4%EC%98%81_%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8\" >GCP \ud658\uacbd\uc5d0\uc11c\uc758 Airflow Celery Executor \uad6c\ucd95 \ubc0f \uc6b4\uc601 \ud30c\uc774\ud504\ub77c\uc778<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/gcp-airflow-celery-executor\/#1_%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98_%EA%B0%9C%EC%9A%94_%EC%99%9C_Celery_Executor%EC%9D%B8%EA%B0%80\" >1. \uc544\ud0a4\ud14d\ucc98 \uac1c\uc694: \uc65c Celery Executor\uc778\uac00?<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/gcp-airflow-celery-executor\/#%EB%8D%B0%EC%9D%B4%ED%84%B0_%ED%9D%90%EB%A6%84_Data_Flow\" >\ub370\uc774\ud130 \ud750\ub984 (Data Flow)<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/gcp-airflow-celery-executor\/#2_%EC%9D%B8%ED%94%84%EB%9D%BC_%EA%B5%AC%EC%84%B1_Infrastructure_as_Code\" >2. \uc778\ud504\ub77c \uad6c\uc131 (Infrastructure as Code)<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/gcp-airflow-celery-executor\/#%EC%A3%BC%EC%9A%94_%EA%B5%AC%EC%84%B1_%EC%9A%94%EC%86%8C\" >\uc8fc\uc694 \uad6c\uc131 \uc694\uc18c<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/gcp-airflow-celery-executor\/#Terraform_%EA%B5%AC%EC%84%B1_maintf_%EB%B0%9C%EC%B7%8C\" >Terraform \uad6c\uc131 (main.tf \ubc1c\ucdcc)<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/gcp-airflow-celery-executor\/#3_%ED%99%98%EA%B2%BD_%EA%B5%AC%EC%84%B1_%EB%B0%8F_%EB%AF%B8%EB%93%A4%EC%9B%A8%EC%96%B4_%EC%84%A4%EC%A0%95\" >3. \ud658\uacbd \uad6c\uc131 \ubc0f \ubbf8\ub4e4\uc6e8\uc5b4 \uc124\uc815<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/gcp-airflow-celery-executor\/#Python_%EB%B0%8F_Airflow_%EC%84%A4%EC%B9%98\" >Python \ubc0f Airflow \uc124\uce58<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/gcp-airflow-celery-executor\/#Redis_%EC%84%A4%EC%A0%95_Message_Broker\" >Redis \uc124\uc815 (Message Broker)<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/gcp-airflow-celery-executor\/#4_Airflow_%EC%A3%BC%EC%9A%94_%EC%84%A4%EC%A0%95\" >4. Airflow \uc8fc\uc694 \uc124\uc815<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/gcp-airflow-celery-executor\/#Core_Database\" >Core &amp; Database<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/gcp-airflow-celery-executor\/#Logging_Remote_Logging\" >Logging (Remote Logging)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/gcp-airflow-celery-executor\/#Celery_Performance_Tuning\" >Celery &amp; Performance Tuning<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/gcp-airflow-celery-executor\/#5_%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4_%EA%B4%80%EB%A6%AC_Systemd\" >5. \ud504\ub85c\uc138\uc2a4 \uad00\ub9ac (Systemd)<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/gcp-airflow-celery-executor\/#Celery_Worker_Service_%ED%85%9C%ED%94%8C%EB%A6%BF\" >Celery Worker Service \ud15c\ud50c\ub9bf<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/gcp-airflow-celery-executor\/#6_%EB%B0%B0%ED%8F%AC_%EC%9E%90%EB%8F%99%ED%99%94_CICD\" >6. \ubc30\ud3ec \uc790\ub3d9\ud654 (CI\/CD)<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/gcp-airflow-celery-executor\/#%EB%B0%B0%ED%8F%AC_%EC%A0%84%EB%9E%B5\" >\ubc30\ud3ec \uc804\ub7b5<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/gcp-airflow-celery-executor\/#Cloud_Build_%EA%B5%AC%EC%84%B1_yaml\" >Cloud Build \uad6c\uc131 (yaml)<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/gcp-airflow-celery-executor\/#%EB%A7%88%EB%AC%B4%EB%A6%AC\" >\ub9c8\ubb34\ub9ac<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h1 class=\"ng-star-inserted\"><span class=\"ez-toc-section\" id=\"GCP_%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C%EC%9D%98_Airflow_Celery_Executor_%EA%B5%AC%EC%B6%95_%EB%B0%8F_%EC%9A%B4%EC%98%81_%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8\"><\/span><span class=\"ng-star-inserted\">GCP \ud658\uacbd\uc5d0\uc11c\uc758 Airflow Celery Executor \uad6c\ucd95 \ubc0f \uc6b4\uc601 \ud30c\uc774\ud504\ub77c\uc778<\/span><span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">\ubcf8 \ud3ec\uc2a4\ud305\uc5d0\uc11c\ub294 Google Cloud Platform(GCP) \ud658\uacbd\uc5d0\uc11c <\/span><strong class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">Airflow Celery Executor<\/span><\/strong><span class=\"ng-star-inserted\"> \uc544\ud0a4\ud14d\ucc98\ub97c \uad6c\ucd95\ud55c \uacfc\uc815\uc744 \uacf5\uc720\ud569\ub2c8\ub2e4. Terraform\uc744 \uc774\uc6a9\ud55c \uc778\ud504\ub77c \ud504\ub85c\ube44\uc800\ub2dd\ubd80\ud130 Airflow \uc124\uc815, Systemd\ub97c \ud1b5\ud55c \ud504\ub85c\uc138\uc2a4 \uad00\ub9ac, \uadf8\ub9ac\uace0 Cloud Build\ub97c \ud65c\uc6a9\ud55c \ubc30\ud3ec \uc790\ub3d9\ud654\uae4c\uc9c0 \uc804\uccb4\uc801\uc778 \uc5d4\uc9c0\ub2c8\uc5b4\ub9c1 \ud30c\uc774\ud504\ub77c\uc778\uc744 \ub2e4\ub8f9\ub2c8\ub2e4.<\/span><\/p>\n<p>&nbsp;<\/p>\n<figure id=\"attachment_640\" aria-describedby=\"caption-attachment-640\" style=\"width: 2000px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-640 size-full\" src=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-content\/uploads\/2025\/11\/image.jpg\" alt=\"airflow-architecture\" width=\"2000\" height=\"781\" srcset=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-content\/uploads\/2025\/11\/image.jpg 2000w, https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-content\/uploads\/2025\/11\/image-300x117.jpg 300w, https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-content\/uploads\/2025\/11\/image-1024x400.jpg 1024w, https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-content\/uploads\/2025\/11\/image-768x300.jpg 768w, https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-content\/uploads\/2025\/11\/image-1536x600.jpg 1536w, https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-content\/uploads\/2025\/11\/image-900x351.jpg 900w, https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-content\/uploads\/2025\/11\/image-500x195.jpg 500w\" sizes=\"auto, (max-width: 2000px) 100vw, 2000px\" \/><figcaption id=\"caption-attachment-640\" class=\"wp-caption-text\">\ucd9c\ucc98: <a href=\"https:\/\/medium.com\/sicara\/using-airflow-with-celery-workers-54cb5212d405\" target=\"_blank\" rel=\"noopener\">https:\/\/medium.com\/sicara\/using-airflow-with-celery-workers-54cb5212d405<\/a><\/figcaption><\/figure>\n<h2 class=\"ng-star-inserted\"><span class=\"ez-toc-section\" id=\"1_%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98_%EA%B0%9C%EC%9A%94_%EC%99%9C_Celery_Executor%EC%9D%B8%EA%B0%80\"><\/span><span class=\"ng-star-inserted\">1. \uc544\ud0a4\ud14d\ucc98 \uac1c\uc694: \uc65c Celery Executor\uc778\uac00?<\/span><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">Airflow\ub294 \uae30\ubcf8\uc801\uc73c\ub85c \uc21c\ucc28 \uc2e4\ud589\uc744 \ub2f4\ub2f9\ud558\ub294 Sequential Executor\ub97c \uc81c\uacf5\ud558\uc9c0\ub9cc, \ud504\ub85c\ub355\uc158 \ud658\uacbd\uc5d0\uc11c\ub294 \ubcd1\ub82c \ucc98\ub9ac\uc640 \ud655\uc7a5\uc131\uc774 \ud544\uc218\uc801\uc785\ub2c8\ub2e4. Celery Executor\ub294 \uba54\uc2dc\uc9c0 \ube0c\ub85c\ucee4\ub97c \ud1b5\ud574 \uc791\uc5c5\uc744 \ubd84\uc0b0 \ucc98\ub9ac\ud568\uc73c\ub85c\uc368 \ub2e4\uc74c\uacfc \uac19\uc740 \uc774\uc810\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/span><\/p>\n<ul class=\"ng-star-inserted\">\n<li class=\"ng-star-inserted\">\n<p class=\"ng-star-inserted\"><strong class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">\uc218\ud3c9 \ud655\uc7a5(Horizontal Scaling):<\/span><\/strong><span class=\"ng-star-inserted\"> \uc6cc\ucee4 \ub178\ub4dc\ub97c \ucd94\uac00\ud568\uc73c\ub85c\uc368 \uc2dc\uc2a4\ud15c\uc758 \uc804\uccb4 \ucc98\ub9ac\ub7c9\uc744 \uc720\uc5f0\ud558\uac8c \uc99d\ub300\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<\/li>\n<li class=\"ng-star-inserted\">\n<p class=\"ng-star-inserted\"><strong class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">\uace0\uac00\uc6a9\uc131(High Availability):<\/span><\/strong><span class=\"ng-star-inserted\"> \uc5ec\ub7ec \uc6cc\ucee4\uac00 \ubd84\uc0b0\ub418\uc5b4 \uc788\uc5b4 \ud2b9\uc815 \ub178\ub4dc\uc758 \uc7a5\uc560\uac00 \uc804\uccb4 \uc2dc\uc2a4\ud15c\uc758 \uc911\ub2e8\uc73c\ub85c \uc774\uc5b4\uc9c0\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<\/li>\n<li class=\"ng-star-inserted\">\n<p class=\"ng-star-inserted\"><strong class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">\ube44\ub3d9\uae30 \ucc98\ub9ac:<\/span><\/strong><span class=\"ng-star-inserted\"> \uc2a4\ucf00\uc904\ub7ec\uc640 \uc6cc\ucee4\uac00 \uba54\uc2dc\uc9c0 \ud050\ub97c \ud1b5\ud574 \ub290\uc2a8\ud558\uac8c \uacb0\ud569(Loosely Coupled)\ub418\uc5b4 \ud6a8\uc728\uc801\uc778 \ub9ac\uc18c\uc2a4 \ud65c\uc6a9\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.<\/span><\/p>\n<\/li>\n<\/ul>\n<h3 class=\"ng-star-inserted\"><span class=\"ez-toc-section\" id=\"%EB%8D%B0%EC%9D%B4%ED%84%B0_%ED%9D%90%EB%A6%84_Data_Flow\"><\/span><span class=\"ng-star-inserted\">\ub370\uc774\ud130 \ud750\ub984 (Data Flow)<\/span><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">\uc2dc\uc2a4\ud15c\uc758 \uc804\ubc18\uc801\uc778 \ub370\uc774\ud130 \ud750\ub984\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<ol class=\"ng-star-inserted\">\n<li class=\"ng-star-inserted\">\n<p class=\"ng-star-inserted\"><strong class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">Scheduler:<\/span><\/strong><span class=\"ng-star-inserted\"> DAG\ub97c \ud30c\uc2f1\ud558\uace0 \uc2e4\ud589 \uc870\uac74\uc774 \ucda9\uc871\ub41c Task\ub97c \uc2dd\ubcc4\ud558\uc5ec \uba54\uc2dc\uc9c0 \ube0c\ub85c\ucee4(Redis)\uc758 \ud050(Queue)\ub85c \uc804\uc1a1\ud569\ub2c8\ub2e4.<\/span><\/p>\n<\/li>\n<li class=\"ng-star-inserted\">\n<p class=\"ng-star-inserted\"><strong class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">Message Broker:<\/span><\/strong><span class=\"ng-star-inserted\"> \uc2a4\ucf00\uc904\ub7ec\uc640 \uc6cc\ucee4 \uac04\uc758 \ud1b5\uc2e0\uc744 \uc911\uac1c\ud569\ub2c8\ub2e4. Task \uba54\uc2dc\uc9c0\ub97c \ud050\uc5d0 \uc800\uc7a5\ud558\uace0 \uc720\ud734 \uc0c1\ud0dc\uc758 \uc6cc\ucee4\uc5d0\uac8c \uc804\ub2ec\ud569\ub2c8\ub2e4.<\/span><\/p>\n<\/li>\n<li class=\"ng-star-inserted\">\n<p class=\"ng-star-inserted\"><strong class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">Celery Worker:<\/span><\/strong><span class=\"ng-star-inserted\"> \ube0c\ub85c\ucee4\ub85c\ubd80\ud130 \ud560\ub2f9\ubc1b\uc740 Task\ub97c \uc2e4\uc81c \uc218\ud589\ud569\ub2c8\ub2e4.<\/span><\/p>\n<\/li>\n<li class=\"ng-star-inserted\">\n<p class=\"ng-star-inserted\"><strong class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">Result Backend:<\/span><\/strong><span class=\"ng-star-inserted\"> \uc6cc\ucee4\uac00 \uc218\ud589\ud55c Task\uc758 \uc2e4\ud589 \uacb0\uacfc(\uc131\uacf5, \uc2e4\ud328, \ubc18\ud658\uac12 \ub4f1)\ub97c \uc800\uc7a5\ud569\ub2c8\ub2e4.<\/span><\/p>\n<\/li>\n<li class=\"ng-star-inserted\">\n<p class=\"ng-star-inserted\"><strong class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">Metadata DB:<\/span><\/strong><span class=\"ng-star-inserted\"> Airflow\uc758 \ubaa8\ub4e0 \uc0c1\ud0dc \uc815\ubcf4\ub97c \ucd5c\uc885\uc801\uc73c\ub85c \uc800\uc7a5\ud558\uba70, \uc6f9 \uc11c\ubc84\uc640 \uc2a4\ucf00\uc904\ub7ec\ub294 \uc774\ub97c \ucc38\uc870\ud558\uc5ec UI \ubc0f \ub2e4\uc74c \uc2a4\ucf00\uc904\ub9c1\uc5d0 \ubc18\uc601\ud569\ub2c8\ub2e4.<\/span><\/p>\n<\/li>\n<\/ol>\n<h2 class=\"ng-star-inserted\"><span class=\"ez-toc-section\" id=\"2_%EC%9D%B8%ED%94%84%EB%9D%BC_%EA%B5%AC%EC%84%B1_Infrastructure_as_Code\"><\/span><span class=\"ng-star-inserted\">2. \uc778\ud504\ub77c \uad6c\uc131 (Infrastructure as Code)<\/span><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">\uc778\ud504\ub77c \uad00\ub9ac\ub294 Terraform\uc744 \uc0ac\uc6a9\ud558\uc5ec \ucf54\ub4dc(IaC)\ub85c \uad6c\ud604\ud588\uc2b5\ub2c8\ub2e4. \uc548\uc815\uc801\uc778 \uc6b4\uc601\uc744 \uc704\ud574 \uc0c1\ud0dc \uc800\uc7a5\uc18c(DB)\uc640 \ub85c\uae45 \uc2a4\ud1a0\ub9ac\uc9c0\ub294 \ucef4\ud4e8\ud305 \uc778\uc2a4\ud134\uc2a4\uc640 \ubd84\ub9ac\ud588\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<h3 class=\"ng-star-inserted\"><span class=\"ez-toc-section\" id=\"%EC%A3%BC%EC%9A%94_%EA%B5%AC%EC%84%B1_%EC%9A%94%EC%86%8C\"><\/span><span class=\"ng-star-inserted\">\uc8fc\uc694 \uad6c\uc131 \uc694\uc18c<\/span><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"ng-star-inserted\">\n<li class=\"ng-star-inserted\">\n<p class=\"ng-star-inserted\"><strong class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">Compute Engine (VM):<\/span><\/strong><span class=\"ng-star-inserted\"> Airflow \uc6f9\uc11c\ubc84, \uc2a4\ucf00\uc904\ub7ec, \uc6cc\ucee4\uac00 \uad6c\ub3d9\ub418\ub294 \ub7f0\ud0c0\uc784 \ud658\uacbd (Debian 12, e2-highmem-2).<\/span><\/p>\n<\/li>\n<li class=\"ng-star-inserted\">\n<p class=\"ng-star-inserted\"><strong class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">Cloud SQL (PostgreSQL):<\/span><\/strong><span class=\"ng-star-inserted\"> Airflow \uba54\ud0c0\ub370\uc774\ud130 \uc800\uc7a5\uc18c. \uad00\ub9ac\ud615 \uc11c\ube44\uc2a4\ub97c \uc0ac\uc6a9\ud558\uc5ec \ubc31\uc5c5 \ubc0f \ubcf5\uad6c \uc6a9\uc774\uc131 \ud655\ubcf4.<\/span><\/p>\n<\/li>\n<li class=\"ng-star-inserted\">\n<p class=\"ng-star-inserted\"><strong class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">Cloud Storage (GCS):<\/span><\/strong><span class=\"ng-star-inserted\"> Airflow \ub85c\uadf8 \uc800\uc7a5\uc18c. VM \ub514\uc2a4\ud06c \uc6a9\ub7c9 \uc808\uc57d \ubc0f \ub85c\uadf8 \uc601\uad6c \ubcf4\uc874 \ubaa9\uc801.<\/span><\/p>\n<\/li>\n<li class=\"ng-star-inserted\">\n<p class=\"ng-star-inserted\"><strong class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">Redis:<\/span><\/strong><span class=\"ng-star-inserted\"> VM \ub0b4\ubd80\uc5d0 \uc124\uce58\ud558\uc5ec \uba54\uc2dc\uc9c0 \ube0c\ub85c\ucee4\ub85c \uc0ac\uc6a9 (\ube44\uc6a9 \ud6a8\uc728\uc131\uc744 \uace0\ub824\ud558\uc5ec VM \ub0b4\ubd80 \uad6c\uc131, \ud544\uc694\uc2dc Memorystore\ub85c \uc804\ud658 \uac00\ub2a5).<\/span><\/p>\n<\/li>\n<li class=\"ng-star-inserted\">\n<p class=\"ng-star-inserted\"><strong class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">Load Balancer:<\/span><\/strong><span class=\"ng-star-inserted\"> HTTPS \ud2b8\ub798\ud53d \ucc98\ub9ac \ubc0f SSL \uc778\uc99d\uc11c \uad00\ub9ac.<\/span><\/p>\n<\/li>\n<\/ul>\n<p>GCP \ube44\uc6a9 \uad00\ub9ac\uc640 \uad00\ub828\ub41c \ub0b4\uc6a9\uc740 <a href=\"https:\/\/www.nnt-consulting.com\/tech\/blog\/gcp-%eb%b9%84%ec%9a%a9-%ea%b4%80%eb%a6%ac-%eb%b0%8f-%ec%b5%9c%ec%a0%81%ed%99%94-%ed%9a%a8%ea%b3%bc%ec%a0%81%ec%9d%b8-%ed%81%b4%eb%9d%bc%ec%9a%b0%eb%93%9c-%eb%b9%84%ec%9a%a9-%ea%b4%80%eb%a6%ac\/\">\ubcf8 \uae00<\/a>\uc744 \ucc38\uace0\ud574\uc8fc\uc138\uc694.<\/p>\n<h3 class=\"ng-star-inserted\"><span class=\"ez-toc-section\" id=\"Terraform_%EA%B5%AC%EC%84%B1_maintf_%EB%B0%9C%EC%B7%8C\"><\/span><span class=\"ng-star-inserted\">Terraform \uad6c\uc131 (main.tf \ubc1c\ucdcc)<\/span><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div class=\"container\">\n<div class=\"mat-expansion-panel-content-wrapper\">\n<div id=\"cdk-accordion-child-101\" class=\"mat-expansion-panel-content\" role=\"region\" aria-labelledby=\"mat-expansion-panel-header-101\">\n<div class=\"mat-expansion-panel-body\">\n<pre class=\"ng-star-inserted\"><code><span class=\"hljs-comment\"># \uc8fc\uc694 \ub9ac\uc18c\uc2a4 \uad6c\uc131 \uc608\uc2dc<\/span>\r\n\r\n<span class=\"hljs-comment\"># 1. Compute Engine<\/span>\r\nresource <span class=\"hljs-string\">\"google_compute_instance\"<\/span> <span class=\"hljs-string\">\"airflow_vm\"<\/span> {\r\n  name         = var.vm_name\r\n  machine_type = var.vm_machine_type\r\n  zone         = <span class=\"hljs-string\">\"<span class=\"hljs-variable\">${var.region}<\/span>-a\"<\/span>\r\n  <span class=\"hljs-comment\"># ... (\uc0dd\ub7b5)<\/span>\r\n}\r\n\r\n<span class=\"hljs-comment\"># 2. Cloud SQL (PostgreSQL)<\/span>\r\nresource <span class=\"hljs-string\">\"google_sql_database_instance\"<\/span> <span class=\"hljs-string\">\"airflow_db\"<\/span> {\r\n  name             = var.db_instance_name\r\n  database_version = <span class=\"hljs-string\">\"POSTGRES_17\"<\/span>\r\n  settings {\r\n    tier = <span class=\"hljs-string\">\"db-custom-1-3840\"<\/span>\r\n    backup_configuration {\r\n      enabled = <span class=\"hljs-literal\">true<\/span>\r\n      point_in_time_recovery_enabled = <span class=\"hljs-literal\">true<\/span>\r\n    }\r\n  }\r\n}\r\n\r\n<span class=\"hljs-comment\"># 3. GCS Bucket (Logging)<\/span>\r\nresource <span class=\"hljs-string\">\"google_storage_bucket\"<\/span> <span class=\"hljs-string\">\"airflow_logs\"<\/span> {\r\n  name     = var.logs_bucket_name\r\n  location = var.region\r\n  lifecycle_rule {\r\n    condition { age = 30 }\r\n    action { <span class=\"hljs-built_in\">type<\/span> = <span class=\"hljs-string\">\"Delete\"<\/span> }\r\n  }\r\n}\r\n\r\n<span class=\"hljs-comment\"># 4. Load Balancer &amp; SSL<\/span>\r\n<span class=\"hljs-comment\"># Forwarding Rule, Target Proxy, URL Map \ub4f1\uc744 \ud1b5\ud574 HTTPS \ud2b8\ub798\ud53d\uc744 VM\uc73c\ub85c \ub77c\uc6b0\ud305<\/span><\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h2 class=\"ng-star-inserted\"><span class=\"ez-toc-section\" id=\"3_%ED%99%98%EA%B2%BD_%EA%B5%AC%EC%84%B1_%EB%B0%8F_%EB%AF%B8%EB%93%A4%EC%9B%A8%EC%96%B4_%EC%84%A4%EC%A0%95\"><\/span><span class=\"ng-star-inserted\">3. \ud658\uacbd \uad6c\uc131 \ubc0f \ubbf8\ub4e4\uc6e8\uc5b4 \uc124\uc815<\/span><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3 class=\"ng-star-inserted\"><span class=\"ez-toc-section\" id=\"Python_%EB%B0%8F_Airflow_%EC%84%A4%EC%B9%98\"><\/span><span class=\"ng-star-inserted\">Python \ubc0f Airflow \uc124\uce58<\/span><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"ng-star-inserted\">\n<li class=\"ng-star-inserted\">\n<p class=\"ng-star-inserted\"><strong class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">Python:<\/span><\/strong><span class=\"ng-star-inserted\"> 3.11.13 (pyenv \ud65c\uc6a9)<\/span><\/p>\n<\/li>\n<li class=\"ng-star-inserted\">\n<p class=\"ng-star-inserted\"><strong class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">Airflow:<\/span><\/strong><span class=\"ng-star-inserted\"> 2.10.5<\/span><\/p>\n<ul class=\"ng-star-inserted\">\n<li class=\"ng-star-inserted\">\n<p class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">\ud544\uc218 Provider(<\/span><span class=\"inline-code ng-star-inserted\">google<\/span><span class=\"ng-star-inserted\">, <\/span><span class=\"inline-code ng-star-inserted\">celery<\/span><span class=\"ng-star-inserted\">, <\/span><span class=\"inline-code ng-star-inserted\">redis<\/span><span class=\"ng-star-inserted\">, <\/span><span class=\"inline-code ng-star-inserted\">postgres<\/span><span class=\"ng-star-inserted\"> \ub4f1)\ub97c \ud3ec\ud568\ud558\uc5ec \uc124\uce58\ub97c \uc9c4\ud589\ud569\ub2c8\ub2e4.<\/span><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3 class=\"ng-star-inserted\"><span class=\"ez-toc-section\" id=\"Redis_%EC%84%A4%EC%A0%95_Message_Broker\"><\/span><span class=\"ng-star-inserted\">Redis \uc124\uc815 (Message Broker)<\/span><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">VM \ub0b4\ubd80\uc5d0 Redis(7.0.15)\ub97c \uc124\uce58\ud558\uace0 \ubcf4\uc548\uc744 \uc704\ud574 \ube44\ubc00\ubc88\ud638\ub97c \uc124\uc815\ud569\ub2c8\ub2e4. Airflow\ub294 Redis\ub97c \ube0c\ub85c\ucee4, \uacb0\uacfc \ubc31\uc5d4\ub4dc, \uadf8\ub9ac\uace0 \uc6f9\uc11c\ubc84\uc758 Rate Limiting \uc800\uc7a5\uc18c\ub85c \ud65c\uc6a9\ud569\ub2c8\ub2e4.<\/span><\/p>\n<div class=\"container\">\n<div class=\"mat-expansion-panel-content-wrapper\">\n<div id=\"cdk-accordion-child-102\" class=\"mat-expansion-panel-content\" role=\"region\" aria-labelledby=\"mat-expansion-panel-header-102\">\n<div class=\"mat-expansion-panel-body\">\n<pre class=\"ng-star-inserted\"><code><span class=\"hljs-comment\"># \/etc\/redis\/redis.conf \uc218\uc815<\/span>\r\nrequirepass {secure_password}\r\n<span class=\"hljs-built_in\">bind<\/span> 127.0.0.1<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h2 class=\"ng-star-inserted\"><span class=\"ez-toc-section\" id=\"4_Airflow_%EC%A3%BC%EC%9A%94_%EC%84%A4%EC%A0%95\"><\/span><span class=\"ng-star-inserted\">4. Airflow \uc8fc\uc694 \uc124\uc815<\/span><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">Celery Executor\uc758 \uc131\ub2a5 \ucd5c\uc801\ud654\uc640 \uc548\uc815\uc801\uc778 \uc6b4\uc601\uc744 \uc704\ud574 <\/span><span class=\"inline-code ng-star-inserted\">airflow.cfg<\/span><span class=\"ng-star-inserted\">\ub97c \uc870\uc815\ud588\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<h3 class=\"ng-star-inserted\"><span class=\"ez-toc-section\" id=\"Core_Database\"><\/span><span class=\"ng-star-inserted\">Core &amp; Database<\/span><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div class=\"container\">\n<div class=\"mat-expansion-panel-content-wrapper\">\n<div id=\"cdk-accordion-child-103\" class=\"mat-expansion-panel-content\" role=\"region\" aria-labelledby=\"mat-expansion-panel-header-103\">\n<div class=\"mat-expansion-panel-body\">\n<pre class=\"ng-star-inserted\"><code>[core]\r\nexecutor = CeleryExecutor\r\n\r\n[database]\r\n<span class=\"hljs-comment\"># Cloud SQL \uc5f0\uacb0 \uc815\ubcf4 \uc124\uc815<\/span>\r\nsql_alchemy_conn = postgresql+psycopg2:\/\/{user}:{pw}@{ip}\/{db}<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h3 class=\"ng-star-inserted\"><span class=\"ez-toc-section\" id=\"Logging_Remote_Logging\"><\/span><span class=\"ng-star-inserted\">Logging (Remote Logging)<\/span><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">\ub85c\uceec \ub514\uc2a4\ud06c \uc758\uc874\uc131\uc744 \uc81c\uac70\ud558\uae30 \uc704\ud574 GCS\ub97c \uc6d0\uaca9 \ub85c\uadf8 \uc800\uc7a5\uc18c\ub85c \uc9c0\uc815\ud588\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<div class=\"container\">\n<div class=\"mat-expansion-panel-content-wrapper\">\n<div id=\"cdk-accordion-child-104\" class=\"mat-expansion-panel-content\" role=\"region\" aria-labelledby=\"mat-expansion-panel-header-104\">\n<div class=\"mat-expansion-panel-body\">\n<pre class=\"ng-star-inserted\"><code>[logging]\r\nremote_logging = <span class=\"hljs-literal\">True<\/span>\r\nremote_log_conn_id = {gcs_connection_id}\r\nremote_log_folder = gs:\/\/{bucket_name}\/logs\r\ndelete_local_logs = <span class=\"hljs-literal\">True<\/span> <span class=\"hljs-comment\"># \uc804\uc1a1 \ud6c4 \ub85c\uceec \ub85c\uadf8 \uc0ad\uc81c<\/span><\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h3 class=\"ng-star-inserted\"><span class=\"ez-toc-section\" id=\"Celery_Performance_Tuning\"><\/span><span class=\"ng-star-inserted\">Celery &amp; Performance Tuning<\/span><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div class=\"container\">\n<div class=\"mat-expansion-panel-content-wrapper\">\n<div id=\"cdk-accordion-child-105\" class=\"mat-expansion-panel-content\" role=\"region\" aria-labelledby=\"mat-expansion-panel-header-105\">\n<div class=\"mat-expansion-panel-body\">\n<pre class=\"ng-star-inserted\"><code>[celery]\r\nbroker_url = redis:\/\/{pw}@localhost:<span class=\"hljs-number\">6379<\/span>\/<span class=\"hljs-number\">0<\/span>\r\nresult_backend = redis:\/\/{pw}@localhost:<span class=\"hljs-number\">6379<\/span>\/<span class=\"hljs-number\">2<\/span>\r\n\r\n<span class=\"hljs-comment\"># Worker Concurrency: \ub2e8\uc77c \uc6cc\ucee4\uac00 \ub3d9\uc2dc\uc5d0 \ucc98\ub9ac\ud560 \uc218 \uc788\ub294 Task \uc218<\/span>\r\nworker_concurrency = <span class=\"hljs-number\">4<\/span>\r\n\r\n<span class=\"hljs-comment\"># Prefetch Multiplier: \uc6cc\ucee4\uac00 \ubbf8\ub9ac \uac00\uc838\uc62c Task \uc218 (Throughput \ucd5c\uc801\ud654)<\/span>\r\nworker_prefetch_multiplier = <span class=\"hljs-number\">1<\/span>\r\n\r\n<span class=\"hljs-comment\"># Task Acks Late: Task \uc644\ub8cc \ud6c4 Ack \uc804\uc1a1 (\ub370\uc774\ud130 \ubb34\uacb0\uc131 \ubcf4\uc7a5)<\/span>\r\ntask_acks_late = <span class=\"hljs-literal\">True<\/span>\r\n\r\n<span class=\"hljs-comment\"># \ubaa8\ub2c8\ud130\ub9c1 \uac15\ud654 \uc124\uc815<\/span>\r\ntask_track_started = <span class=\"hljs-literal\">True<\/span>  <span class=\"hljs-comment\"># Running \uc0c1\ud0dc \ucd94\uc801<\/span>\r\ntask_send_sent_event = <span class=\"hljs-literal\">True<\/span><\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<ul class=\"ng-star-inserted\">\n<li class=\"ng-star-inserted\">\n<p class=\"ng-star-inserted\"><strong class=\"ng-star-inserted\"><span class=\"inline-code ng-star-inserted\">task_acks_late = True<\/span><span class=\"ng-star-inserted\">:<\/span><\/strong><span class=\"ng-star-inserted\"> \uc6cc\ucee4\uac00 \uc791\uc5c5\uc744 \uc644\ub8cc\ud55c \ud6c4\uc5d0\ub9cc \uba54\uc2dc\uc9c0 \ud050\uc5d0 \ucc98\ub9ac \uc644\ub8cc(Ack)\ub97c \ubcf4\ub0c5\ub2c8\ub2e4. \uc791\uc5c5 \ub3c4\uc911 \uc6cc\ucee4\uac00 \uc911\ub2e8\ub418\ub354\ub77c\ub3c4 \ub2e4\ub978 \uc6cc\ucee4\uac00 \ud574\ub2f9 \uc791\uc5c5\uc744 \ub2e4\uc2dc \uac00\uc838\uac08 \uc218 \uc788\uc5b4 \ub370\uc774\ud130 \uc720\uc2e4\uc744 \ubc29\uc9c0\ud569\ub2c8\ub2e4.<\/span><\/p>\n<\/li>\n<li class=\"ng-star-inserted\">\n<p class=\"ng-star-inserted\"><strong class=\"ng-star-inserted\"><span class=\"inline-code ng-star-inserted\">worker_concurrency<\/span><span class=\"ng-star-inserted\">:<\/span><\/strong><span class=\"ng-star-inserted\"> I\/O Bound \uc791\uc5c5\uc774 \ub9ce\uc740 \ud2b9\uc131\uc744 \uace0\ub824\ud558\uc5ec CPU \ucf54\uc5b4 \uc218 \ub300\ube44 \uc5ec\uc720 \uc788\uac8c \uc124\uc815\ud588\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<\/li>\n<\/ul>\n<h2 class=\"ng-star-inserted\"><span class=\"ez-toc-section\" id=\"5_%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4_%EA%B4%80%EB%A6%AC_Systemd\"><\/span><span class=\"ng-star-inserted\">5. \ud504\ub85c\uc138\uc2a4 \uad00\ub9ac (Systemd)<\/span><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">\uc548\uc815\uc801\uc778 \ub370\ubaac \uad00\ub9ac\ub97c \uc704\ud574 Systemd Service\ub97c \ub4f1\ub85d\ud588\uc2b5\ub2c8\ub2e4. \ud2b9\ud788 \ub2e8\uc77c VM\uc5d0\uc11c \uc5ec\ub7ec \uc6cc\ucee4 \ud504\ub85c\uc138\uc2a4\ub97c \ub744\uc6b0\uac70\ub098 \uace0\uc720\ud55c \ud638\uc2a4\ud2b8\ub124\uc784\uc744 \ubd80\uc5ec\ud558\uae30 \uc704\ud574 <\/span><span class=\"inline-code ng-star-inserted\">airflow-worker@.service<\/span><span class=\"ng-star-inserted\"> \ud15c\ud50c\ub9bf\uc744 \ud65c\uc6a9\ud588\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<h3 class=\"ng-star-inserted\"><span class=\"ez-toc-section\" id=\"Celery_Worker_Service_%ED%85%9C%ED%94%8C%EB%A6%BF\"><\/span><span class=\"ng-star-inserted\">Celery Worker Service \ud15c\ud50c\ub9bf<\/span><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div class=\"container\">\n<div class=\"mat-expansion-panel-content-wrapper\">\n<div id=\"cdk-accordion-child-106\" class=\"mat-expansion-panel-content\" role=\"region\" aria-labelledby=\"mat-expansion-panel-header-106\">\n<div class=\"mat-expansion-panel-body\">\n<pre class=\"ng-star-inserted\"><code># \/etc\/systemd\/system\/airflow-<span class=\"hljs-symbol\">worker@<\/span>.service\r\n[<span class=\"hljs-built_in\">Unit<\/span>]\r\nDescription=Airflow Celery Worker %i\r\nAfter=network.target postgresql.service redis-server.service\r\n\r\n[Service]\r\nUser={username}\r\nEnvironmentFile={$AIRFLOW_HOME}\/environment\r\n# %i\ub97c \ud65c\uc6a9\ud574 \uace0\uc720 hostname \ubd80\uc5ec (\uc608: <span class=\"hljs-symbol\">worker1@<\/span>hostname)\r\nExecStart=\/path\/to\/celery -A airflow.providers.celery.executors.celery_executor.app worker \\\r\n    --loglevel INFO -E --hostname <span class=\"hljs-string\">'worker%i@%%H'<\/span> --queues default\r\nRestart=always\r\n\r\n[Install]\r\nWantedBy=multi-user.target<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">\uc774 \uc678\uc5d0\ub3c4 <\/span><span class=\"inline-code ng-star-inserted\">webserver<\/span><span class=\"ng-star-inserted\">, <\/span><span class=\"inline-code ng-star-inserted\">scheduler<\/span><span class=\"ng-star-inserted\">, <\/span><span class=\"inline-code ng-star-inserted\">flower<\/span><span class=\"ng-star-inserted\"> \ubaa8\ub2c8\ud130\ub9c1 \ub3c4\uad6c \ub610\ud55c \uac1c\ubcc4 \uc11c\ube44\uc2a4\ub85c \ub4f1\ub85d\ud558\uc5ec \uad00\ub9ac\ud569\ub2c8\ub2e4.<\/span><\/p>\n<h2 class=\"ng-star-inserted\"><span class=\"ez-toc-section\" id=\"6_%EB%B0%B0%ED%8F%AC_%EC%9E%90%EB%8F%99%ED%99%94_CICD\"><\/span><span class=\"ng-star-inserted\">6. \ubc30\ud3ec \uc790\ub3d9\ud654 (CI\/CD)<\/span><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">GitHub\uc758 Main \ube0c\ub79c\uce58\uc5d0 \ubcc0\uacbd \uc0ac\ud56d\uc774 \ud478\uc2dc\ub418\uba74 <\/span><strong class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">GCP Cloud Build<\/span><\/strong><span class=\"ng-star-inserted\">\uac00 \ud2b8\ub9ac\uac70\ub418\uc5b4 \ubc30\ud3ec\ub97c \uc218\ud589\ud569\ub2c8\ub2e4.<\/span><\/p>\n<h3 class=\"ng-star-inserted\"><span class=\"ez-toc-section\" id=\"%EB%B0%B0%ED%8F%AC_%EC%A0%84%EB%9E%B5\"><\/span><span class=\"ng-star-inserted\">\ubc30\ud3ec \uc804\ub7b5<\/span><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"ng-star-inserted\">\n<li class=\"ng-star-inserted\">\n<p class=\"ng-star-inserted\"><strong class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">Worker Pool &amp; Private IP:<\/span><\/strong><span class=\"ng-star-inserted\"> \ubcf4\uc548\uc744 \uc704\ud574 \uc678\ubd80 IP\uac00 \uc544\ub2cc \ub0b4\ubd80 IP(Private IP)\ub85c VM\uc5d0 \uc811\uadfc\ud569\ub2c8\ub2e4. \uc774\ub97c \uc704\ud574 Cloud Build\uc758 Private Worker Pool\uc744 \uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<\/li>\n<li class=\"ng-star-inserted\">\n<p class=\"ng-star-inserted\"><strong class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">Secret Manager:<\/span><\/strong><span class=\"ng-star-inserted\"> SSH \ud0a4\uc640 \uac19\uc740 \ubbfc\uac10 \uc815\ubcf4\ub294 Secret Manager\uc5d0\uc11c \ub7f0\ud0c0\uc784\uc5d0 \uc548\uc804\ud558\uac8c \ub85c\ub4dc\ud569\ub2c8\ub2e4.<\/span><\/p>\n<\/li>\n<\/ul>\n<h3 class=\"ng-star-inserted\"><span class=\"ez-toc-section\" id=\"Cloud_Build_%EA%B5%AC%EC%84%B1_yaml\"><\/span><span class=\"ng-star-inserted\">Cloud Build \uad6c\uc131 (yaml)<\/span><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div class=\"container\">\n<div class=\"mat-expansion-panel-content-wrapper\">\n<div id=\"cdk-accordion-child-107\" class=\"mat-expansion-panel-content\" role=\"region\" aria-labelledby=\"mat-expansion-panel-header-107\">\n<div class=\"mat-expansion-panel-body\">\n<pre class=\"ng-star-inserted\"><code>steps:\r\n  - name: <span class=\"hljs-string\">'gcr.io\/cloud-builders\/gcloud'<\/span>\r\n    entrypoint: <span class=\"hljs-string\">'bash'<\/span>\r\n    args:\r\n      - <span class=\"hljs-string\">'-c'<\/span>\r\n      - |\r\n        <span class=\"hljs-comment\"># 1. Secret Manager\uc5d0\uc11c SSH Key \ub85c\ub4dc<\/span>\r\n        gcloud secrets versions access latest --secret=<span class=\"hljs-string\">\"{ssh_key_secret}\"<\/span> &gt; \/root\/.ssh\/id_rsa\r\n        chmod 600 \/root\/.ssh\/id_rsa\r\n\r\n        <span class=\"hljs-comment\"># 2. VM \ub0b4\ubd80 IP \uc870\ud68c<\/span>\r\n        VM_INTERNAL_IP=$$(gcloud compute instances describe <span class=\"hljs-variable\">${_VM_NAME}<\/span> --format=<span class=\"hljs-string\">\"value(networkInterfaces[0].networkIP)\"<\/span>)\r\n\r\n        <span class=\"hljs-comment\"># 3. SSH \uc811\uc18d \ubc0f \ubc30\ud3ec \uc2a4\ud06c\ub9bd\ud2b8 \uc2e4\ud589<\/span>\r\n        ssh -i \/root\/.ssh\/id_rsa <span class=\"hljs-variable\">${_VM_USER}<\/span>@$<span class=\"hljs-variable\">$VM_INTERNAL_IP<\/span> <span class=\"hljs-string\">'\r\n          cd ${_AIRFLOW_HOME}\r\n          git pull origin main\r\n          \r\n          # \uc11c\ube44\uc2a4 \uc7ac\uc2dc\uc791 (Graceful Restart \uace0\ub824)\r\n          sudo systemctl restart airflow-webserver airflow-scheduler airflow-worker\r\n        '<\/span>\r\noptions:\r\n  pool:\r\n    name: <span class=\"hljs-string\">'projects\/{project}\/locations\/{region}\/workerPools\/{pool_name}'<\/span><\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h2 class=\"ng-star-inserted\"><span class=\"ez-toc-section\" id=\"%EB%A7%88%EB%AC%B4%EB%A6%AC\"><\/span><span class=\"ng-star-inserted\">\ub9c8\ubb34\ub9ac<\/span><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">\ubcf8 \ud3ec\uc2a4\ud305\uc5d0\uc11c\ub294 \ub2e8\uc77c VM\uacfc \uad00\ub9ac\ud615 DB \uc11c\ube44\uc2a4\ub97c \ud65c\uc6a9\ud558\uc5ec Celery Executor \uae30\ubc18\uc758 Airflow \ud658\uacbd\uc744 \uad6c\ucd95\ud558\ub294 \ubc29\ubc95\uc744 \uc0b4\ud3b4\ubcf4\uc558\uc2b5\ub2c8\ub2e4. \uc774 \uc544\ud0a4\ud14d\ucc98\ub294 \ucd08\uae30 \uad6c\ucd95 \ube44\uc6a9\uc744 \ud6a8\uc728\uc801\uc73c\ub85c \uad00\ub9ac\ud558\uba74\uc11c\ub3c4, \ud5a5\ud6c4 \uc6cc\ud06c\ub85c\ub4dc \uc99d\uac00 \uc2dc \uc6cc\ucee4 \ub178\ub4dc\ub97c \uc218\ud3c9\uc801\uc73c\ub85c \ud655\uc7a5\ud558\uc5ec \uc720\uc5f0\ud558\uac8c \ub300\uc751\ud560 \uc218 \uc788\ub294 \uae30\ubc18\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/span><\/p>\n<p class=\"ng-star-inserted\"><strong class=\"ng-star-inserted\"><span class=\"ng-star-inserted\">\ucc38\uace0:<\/span><\/strong><span class=\"ng-star-inserted\"> \ubcf8 \ubb38\uc11c\ub294 PostgreSQL 17, Airflow 2.10.5, Redis 7.0 \ubc84\uc804\uc744 \uae30\uc900\uc73c\ub85c \uc791\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>GCP \ud658\uacbd\uc5d0\uc11c\uc758 Airflow Celery Executor \uad6c\ucd95 \ubc0f \uc6b4\uc601 \ud30c\uc774\ud504\ub77c\uc778 \ubcf8 \ud3ec\uc2a4\ud305\uc5d0\uc11c\ub294 Google Cloud Platform(GCP) \ud658\uacbd\uc5d0\uc11c Airflow Celery Executor \uc544\ud0a4\ud14d\ucc98\ub97c \uad6c\ucd95\ud55c \uacfc\uc815\uc744 \uacf5\uc720\ud569\ub2c8\ub2e4. Terraform\uc744 \uc774\uc6a9\ud55c \uc778\ud504\ub77c \ud504\ub85c\ube44\uc800\ub2dd\ubd80\ud130 Airflow \uc124\uc815, Systemd\ub97c \ud1b5\ud55c \ud504\ub85c\uc138\uc2a4 \uad00\ub9ac, \uadf8\ub9ac\uace0 Cloud Build\ub97c \ud65c\uc6a9\ud55c \ubc30\ud3ec \uc790\ub3d9\ud654\uae4c\uc9c0 \uc804\uccb4\uc801\uc778 \uc5d4\uc9c0\ub2c8\uc5b4\ub9c1 \ud30c\uc774\ud504\ub77c\uc778\uc744 \ub2e4\ub8f9\ub2c8\ub2e4. &nbsp; 1. \uc544\ud0a4\ud14d\ucc98 \uac1c\uc694: \uc65c Celery Executor\uc778\uac00? Airflow\ub294 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[73,74,12],"class_list":["post-639","post","type-post","status-publish","format-standard","hentry","category-1","tag-airflow","tag-airflow-celery-executor","tag-gcp","col-md-12"],"_links":{"self":[{"href":"https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-json\/wp\/v2\/posts\/639","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-json\/wp\/v2\/comments?post=639"}],"version-history":[{"count":5,"href":"https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-json\/wp\/v2\/posts\/639\/revisions"}],"predecessor-version":[{"id":645,"href":"https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-json\/wp\/v2\/posts\/639\/revisions\/645"}],"wp:attachment":[{"href":"https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-json\/wp\/v2\/media?parent=639"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-json\/wp\/v2\/categories?post=639"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.nnt-consulting.com\/tech\/blog\/wp-json\/wp\/v2\/tags?post=639"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}