{"id":13266,"date":"2024-02-22T13:02:58","date_gmt":"2024-02-22T04:02:58","guid":{"rendered":"https:\/\/jennifersoft.com\/ko\/?p=13266"},"modified":"2024-07-24T11:01:46","modified_gmt":"2024-07-24T02:01:46","slug":"2024-02-22-jennifer-kubernetes-20","status":"publish","type":"post","link":"https:\/\/jennifersoft.com\/ko\/blog\/kubernetes\/2024-02-22-jennifer-kubernetes-20\/","title":{"rendered":"20.\uae43\ud5c8\ube0c \uc561\uc158\uc744 \uc774\uc6a9\ud55c CI \uc2dc\uc2a4\ud15c \uad6c\ucd95"},"content":{"rendered":"\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/jennifersoft.com\/ko\/wp-content\/uploads\/sites\/2\/2024\/02\/\u1100\u1175\u1109\u116e\u11af\u1107\u1173\u11af\u1105\u1169\u1100\u1173\u110b\u1167\u11ab\u110c\u1162_20_\u110f\u1165\u1107\u1165_240221-1024x576.jpg\" alt=\"\" class=\"wp-image-13270\" srcset=\"https:\/\/jennifersoft.com\/ko\/wp-content\/uploads\/sites\/2\/2024\/02\/\u1100\u1175\u1109\u116e\u11af\u1107\u1173\u11af\u1105\u1169\u1100\u1173\u110b\u1167\u11ab\u110c\u1162_20_\u110f\u1165\u1107\u1165_240221-1024x576.jpg 1024w, https:\/\/jennifersoft.com\/ko\/wp-content\/uploads\/sites\/2\/2024\/02\/\u1100\u1175\u1109\u116e\u11af\u1107\u1173\u11af\u1105\u1169\u1100\u1173\u110b\u1167\u11ab\u110c\u1162_20_\u110f\u1165\u1107\u1165_240221-300x169.jpg 300w, https:\/\/jennifersoft.com\/ko\/wp-content\/uploads\/sites\/2\/2024\/02\/\u1100\u1175\u1109\u116e\u11af\u1107\u1173\u11af\u1105\u1169\u1100\u1173\u110b\u1167\u11ab\u110c\u1162_20_\u110f\u1165\u1107\u1165_240221.jpg 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ubc88 \uc7a5\uc740 \uae43\ud5c8\ube0c \uc561\uc158\uc744 \uc774\uc6a9\ud558\uc5ec CI \uc2dc\uc2a4\ud15c\uc744 \uad6c\ucd95\ud558\ub294 \ubc29\ubc95\uc744 \uc54c\uc544\ubd05\ub2c8\ub2e4.<br><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ubbf8 \ub9ce\uc774 \ub4e4\uc5b4 \ubcf4\uc168\uaca0\uc9c0\ub9cc CI \uc2dc\uc2a4\ud15c\uc740 &#8220;Continuous Integration&#8221;\uc758 \uc57d\uc790\ub85c, \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uac1c\ubc1c \ud504\ub85c\uc138\uc2a4\uc5d0\uc11c \uc790\ub3d9\ud654\ub41c \ube4c\ub4dc, \ud14c\uc2a4\ud2b8, \uc774\ubbf8\uc9c0 \uc5c5\ub85c\ub4dc\uae4c\uc9c0 \uc9c0\uc6d0\ud558\ub294 \uc911\uc694\ud55c \ub3c4\uad6c\uc785\ub2c8\ub2e4. CI \uc2dc\uc2a4\ud15c\uc740 \uac1c\ubc1c\uc790\ub4e4\uc774 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ucf54\ub4dc\ub97c \ube60\ub974\uac8c \ud1b5\ud569\ud558\uace0 \uc624\ub958\ub97c \ube60\ub974\uac8c \ubc1c\uacac\ud558\uc5ec \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ud488\uc9c8\uc744 \uc720\uc9c0\ud558\uace0 \uac1c\uc120\ud558\ub294 \ub370\uc5d0 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.<br><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uac1c\ubc1c\uc790\ub4e4\uc774 \uc0c8\ub85c\uc6b4 \ucf54\ub4dc\ub97c \ubc84\uc804 \uad00\ub9ac \uc2dc\uc2a4\ud15c(\uae43\ud5c8\ube0c)\uc5d0 \ud478\uc26c\ud558\uba74 CI \uc2dc\uc2a4\ud15c\uc774 \ud574\ub2f9 \ucf54\ub4dc\ub97c \uac10\uc9c0\ud558\uace0 \uc790\ub3d9\uc73c\ub85c \ube4c\ub4dc, \ud14c\uc2a4\ud2b8, \uc774\ubbf8\uc9c0 \uc5c5\ub85c\ub4dc\uae4c\uc9c0 \uc9c4\ud589\ud569\ub2c8\ub2e4. \uc6d0\ud558\ub294 \uc870\uac74 \ub9cc\uc871 \uc2dc \uc790\ub3d9\uc73c\ub85c \uc2e4\ud589\ud558\uace0 \uc774\ubbf8\uc9c0 Build \uc2dc\uac04\uc744 \uc904\uc774\ub294 \uac83\uc774 \uc911\uc694\ud55c \uc694\uc18c\uc785\ub2c8\ub2e4.<br><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud604\uc7ac \uc8fc\ub85c \uc0ac\uc6a9\ud558\ub294 CI \ub3c4\uad6c\ub85c\ub294 Jenkins, GitLab CI\/CD, Travis CI, CircleCI \ub4f1\uc774 \uc788\ub294\ub370 \ucd5c\uadfc\uc5d0\ub294 \uae43\ud5c8\ube0c \uc561\uc158\uc744 \uac00\uc7a5 \ub9ce\uc774 \uc0ac\uc6a9\ud558\ub294 \ucd94\uc138 \uac19\uc2b5\ub2c8\ub2e4. \uc544\ubb34\ub798\ub3c4 \uac70\uc758 \ubaa8\ub4e0 \uac1c\ubc1c\uc790\ub4e4\uc774 \uae43\ud5c8\ube0c \uacc4\uc815\uc744 \uac00\uc9c0\uace0 \uc788\uc5b4 \uc9c4\uc785 \uc7a5\ubcbd\uc774 \ub0ae\uace0 \uc0ac\uc6a9\ud558\uae30\uac00 \ud3b8\ub9ac\ud558\uae30 \ub54c\ubb38\uc778 \uac83 \uac19\uc2b5\ub2c8\ub2e4. \ub370\ube0c\uc635\uc2a4 \uc785\uc7a5\uc5d0\uc11c\ub294 \uc5b4\ub5bb\uac8c \ubcf4\uba74 CI\ub294 \ub2e8\uc21c\ud55c \uc791\uc5c5\uc774\ub77c CI \uc6a9\ub3c4\ub85c \ucd94\uac00 \ub3c4\uad6c\ub97c \uc0ac\uc6a9\ud574\uc11c \uad00\ub9ac \ud3ec\uc778\ud2b8\ub97c \uc99d\uac00\ud558\ub294 \uac83\ubcf4\ub2e4\ub294 \uae43\uc800\uc7a5\uc18c\uc640 \ud1b5\ud569\ub41c CI \uc2dc\uc2a4\ud15c\uc744 \ub354 \uc120\ud638\ud569\ub2c8\ub2e4.&nbsp;<br><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uae43\ud5d9 \uc561\uc158\uc5d0 \ube44\ud558\uc5ec \uac00\uc7a5 \ub9ce\uc774 \uc0ac\uc6a9\ud558\ub294 \ub3c4\uad6c \uc911 \ud558\ub098\uc778 \uc820\ud0a8\uc2a4\ub294 \ucd94\uac00 \ud50c\ub7ec\uadf8\uc778 \uad00\ub9ac \ub4f1\uc774 \ubcf5\uc7a1\ud558\uace0 \ucd08\uae30 \uc124\uc815\uc5d0 \uae4c\ub2e4\ub85c\uc6cc \uc9c4\uc785 \uc7a5\ubcbd\uc774 \uc788\uc2b5\ub2c8\ub2e4.&nbsp;<br><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc544\ub9c8 \ub300\ubd80\ubd84\uc758 \uc2a4\ud0c0\ud2b8\uc5c5, \uc911\uc18c \uae30\uc5c5 \ub4f1\ub3c4 \uae43\ud5c8\ube0c Team Plan(\uc0ac\uc6a9\uc790\ub2f9 \uc6d4 $6)\uc744 \uc0ac\uc6a9\ud558\uace0 \uc788\uc744\ud150\ub370 \ud574\ub2f9 Plan\uc740 \uae43\ud5c8\ube0c \uc561\uc158\uc744 3,000\ubd84\uae4c\uc9c0 \ubb34\ub8cc\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc5b4 \ube44\uc6a9 \ubd80\ub2f4\ub3c4 \ud06c\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uadf8\ub9ac\uace0 \uae43\ud5c8\ube0c \uc561\uc158\uc744 EC2 \ub610\ub294 VM\uc5d0\uc11c Self-Hosted\ub85c \uc0ac\uc6a9\ud558\uba74 \ucd94\uac00 \ube44\uc6a9 \ubd80\ub2f4\uc5c6\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc5b4 \ubb34\ub8cc 3,000\ubd84 \uc774\uc0c1\uc744 \uc0ac\uc6a9\ud558\ub294 \uc870\uc9c1\ub3c4 \ubd80\ub2f4\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.<br><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub7fc \uc2e4\uc2b5\uc73c\ub85c \uc790\uc138\ud558\uac8c \uc54c\uc544\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<br><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uba3c\uc800 \uc774\ubc88 \uc7a5\uc758 \uc2e4\uc2b5 \ub9ac\uc2a4\ud2b8\ub97c \uc815\ub9ac\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc2b5 \ub0b4\uc6a9<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>AWS IAM Role &amp; Identity Provider \uc0dd\uc131<\/li><li>AWS ECR \uc0dd\uc131<\/li><li>\ub3c4\ucee4 \ud30c\uc77c &amp; \uc0d8\ud50c \uc571 \ucf54\ub4dc \uc0dd\uc131<\/li><li>CI \ud14c\uc2a4\ud2b8 \uc6a9\ub3c4 \uae43\ud5d9 \ub808\ud3ec \uc0dd\uc131 &#8211; \ud658\uacbd \ubcc0\uc218 \ub4f1\ub85d<\/li><li>\uae43\ud5d9 \uc561\uc158 workflow \ud30c\uc77c \uc0dd\uc131<ol><li><strong>\uc774\ubbf8\uc9c0 tag \uc815\ubcf4\ub97c \uae43\ud5d9 \uc18c\uc2a4 \ud0dc\uadf8 \uc815\ubcf4\uc640 \uc77c\uce58<\/strong><\/li><\/ol><\/li><li>\uc774\ubbf8\uc9c0 build &amp; push \uae43\ud5d9 \uc561\uc158 \uc791\uc5c5 \uac80\uc99d<\/li><li>\uc0dd\uc131\ud55c ECR \uc774\ubbf8\uc9c0 \uae30\ubc18 \ud30c\ub4dc \uc0dd\uc131(\uc774\ubbf8\uc9c0 \uac80\uc99d)<\/li><\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\uc544\ub9c8\ub3c4 \ub2e4\ub978 CI \uc124\uc815\uacfc \ube44\uc2b7\ud55c \ud504\ub85c\uc138\uc2a4\uc77c \uac83 \uac19\uc73c\uba70 \uc870\uae08 \ucc28\uc774\uac00 \uc788\ub2e4\uba74 \uc774\ubbf8\uc9c0 \ud0dc\uadf8 \uc815\ubcf4\ub97c \uae43\ud5d9 \uc18c\uc2a4 \ud0dc\uadf8 \uc815\ubcf4\ub85c \uc0ac\uc6a9\ud55c\ub2e4\ub294 \uac83\uacfc ECR \uc778\uc99d \uc815\ubcf4\ub97c \uc601\uad6c \uc790\uaca9 \uc99d\uba85\uc758 \uc0ac\uc6a9\uc790 \uae30\ubc18\uc774 \uc544\ub2cc \ud1a0\ud070 \uae30\ubc18\uc758 \uc784\uc2dc \uc790\uaca9 \uc99d\uba85\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uc77c \uac83 \uac19\uc2b5\ub2c8\ub2e4.<br><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub7fc \uac01 \ub2e8\uacc4 \ubcc4\ub85c \uc2e4\uc2b5\uc73c\ub85c \uc54c\uc544\uaca0\uc2b5\ub2c8\ub2e4.<br><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1. AWS IAM Role &amp; Identity Provider \uc0dd\uc131<\/strong><br><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc778\uc99d \uc6a9\ub3c4\ub85c \ubcf4\uc548 \uac15\ud654\ub97c \uc704\ud558\uc5ec \uc0ac\uc6a9\uc790\uac00 \uc544\ub2cc AWS IAM Role\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4. Role\uc758 Trust Relations\uc740 \uae43\ud5d9\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \uae43\ud5c8\ube0c <a href=\"https:\/\/docs.github.com\/ko\/enterprise-cloud@latest\/actions\/deployment\/security-hardening-your-deployments\/about-security-hardening-with-openid-connect\">\uacf5\uc2dd \ubb38\uc11c<\/a>\uc5d0 \uc790\uc138\ud55c \uc124\uc815\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/XlysLGHbszrd-ZRC3U2GTCyTcfMpCdSgFC5icigm0AeHiwRHZAX7PiSpc4t0LPefk4LiBA9sIWXgvPmx2srZlsIdR1eRsB3hKwN6T1XDUr7do9t7CdwUG1ecOAHbMfGQISjEYF6FgkjV8VLJC45jeMU\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\uae43\ud5d9 \uc561\uc158 \uc6cc\ud06c \ud50c\ub85c\uac00 \uc0ac\uc6a9\ud560 \uc778\uc99d\uc744 Cloud Provider, AWS\uc5d0\uc11c OIDC Trust\ub97c \uc81c\uacf5\ud558\uace0 AWS\uc758 Role \uacfc \ud574\ub2f9 Role\uc774 \uc0ac\uc6a9\ud558\ub294 \ub9ac\uc18c\uc2a4\ub97c \uc815\uc758\ud55c Policy\ub97c \ubbf8\ub9ac \uc815\uc758\ud569\ub2c8\ub2e4. \ud574\ub2f9 \uc124\uc815\uc744 \uc774\uc6a9\ud558\uc5ec \ud5a5\ud6c4 \uae43\ud5d9 \uc561\uc158 \uc6cc\ud06c\ud50c\ub85c\uc6b0\uc5d0\uc11c \uc778\uc99d\uc744 \uc694\uccad\ud558\uba74 AWS\uc5d0\uc11c \uc784\uc2dc \ud1a0\ud070\uc744 \ubc1c\uae09\ud558\uc5ec \uc778\uc99d \ub2e8\uacc4\ub97c \uc644\ub8cc\ud569\ub2c8\ub2e4. \ud574\ub2f9 \uc694\uad6c \uc0ac\ud56d\uc744 \ub9cc\uc871\ud558\ub3c4\ub85d AWS\uc5d0 \uad00\ub828 \uc124\uc815\uc744 \uc9c4\ud589\ud569\ub2c8\ub2e4.<br><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub7fc AWS \ucf58\uc194\uc5d0\uc11c Identity Provider\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.<br><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/xsomiZgwevUzyhjiD2CmneJtTuQJ3PsuCrIXqlHhkUsZW2cwr16r8qwUJjDfSr4Q5gBAbCw_kiWErl2CyVZ8U2cFF2filMuFcGZNGhxZ_9Dl-wEArrbWL43KWErnOBREeeiS6DMSzGdkQNDEq2iEQ5M\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\uc704 \uc2a4\ud06c\ub9b0 \ucea1\uccd0\uc640 \uac19\uc774 IAM &#8211; Identity Provider \uba54\ub274\uc5d0\uc11c \uc0c8\ub85c\uc6b4 \u2018Identity Provider \ucd94\uac00\u2019\ub97c \uc120\ud0dd\ud558\uace0 OpenID Connect Provider URL\uacfc Audience\uc5d0 https:\/\/token.actions.githubusercontent.com\uacfc sts.amazonaws.com \ub97c \uac01\uac01 \uc785\ub825\ud569\ub2c8\ub2e4.&nbsp;<br><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud574\ub2f9 Provider\ub97c \uc774\uc6a9\ud558\uc5ec IAM Role \uc778\uc99d\uc744 \uc9c4\ud589\ud569\ub2c8\ub2e4.&nbsp;<br><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e4\uc74c\uc73c\ub85c IAM Role\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4. \ucf58\uc194 \uba54\ub274\uc5d0\uc11c Role &#8211; \u2018Create Role\u2019\ub97c \uc120\ud0dd\ud558\uace0 \uc544\ub798 \u2018Select trusted entity\u2019\uc5d0 \uc6f9\uc744 \ud1b5\ud55c \uc790\uaca9 \uc99d\uba85 \u2018Web identity\u2019\ub97c \uc120\ud0dd\ud558\uace0 \uc55e\uc5d0\uc11c \ub9cc\ub4e0 \uae43\ud5d9 \uc561\uc158 \uc124\uc815\uc744 \uc120\ud0dd\ud569\ub2c8\ub2e4.<br><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/qy73KvtUi2eRID4zl78fuXB1esusMjy3lFbKNQJ_DOm2aItvql3LX5YBWToYnU8xKSeLaYSCKOuX7AL2f9VmlfY-wCGqjIF_78Iyie94UIAfM7d4gyo-eShdTmCtT5Vgq6mzKO9QgYfXAfEnI8Y6VdM\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u2018GitHub organization\u2019\ub294 \uc870\uc9c1 \uc124\uc815\uc744 \uc9c0\uc815\ud558\uac70\ub098 \uac1c\uc778 \uacc4\uc815\uc774\uba74 \uac1c\uc778\uc758 \uacc4\uc815 ID(\uc608: junghoon2)\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4.<br><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ud6c4 \uad8c\ud55c \uc124\uc815 \ubd80\ubd84\uc5d0\uc11c ECR \uad00\ub828 \uc815\ucc45(policy)\ub97c \uc120\ud0dd\ud569\ub2c8\ub2e4. ECR \uc774\ubbf8\uc9c0\ub97c \uc870\ud68c\ud558\uace0 Push \ud560 \uc218 \uc788\ub294 \uad8c\ud55c\uc744 \uc544\ub798\uc640 \uac19\uc774 \uc120\ud0dd\ud558\uc600\uc2b5\ub2c8\ub2e4.&nbsp;<br><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/uPLwvMH6ReRbxL3iarh8PQb0HVhEU8dIAZlZOTB4UkuwNmPUzB7xBtXOIDA2pJFHDBdhfBkTiigNg5v2vj5jQuwq6MZVDsAn37J2EQzxhC8wjoeuT5FcSNt6BPkXKUQPbN9HGRsTCFTiAXfivYd5eC4\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc81c Role \uc124\uc815\uc774 \uc644\ub8cc\ub418\uc5c8\uace0 \ud574\ub2f9 Role\uc744 \uae30\uc900\uc73c\ub85c \uae43\ud5d9 \uc561\uc158 Workflow\uc5d0\uc11c \uc778\uc99d \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<br><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2. AWS ECR \uc0dd\uc131<\/strong><br><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uae43\ud5d9 \uc561\uc158\uc73c\ub85c \ube4c\ub4dc\ud55c \uc774\ubbf8\uc9c0\ub97c \uc5c5\ub85c\ub4dc\ud560 AWS ECR\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4. \uc774\ubbf8\uc9c0 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc885\ub958\ub85c Harbor, \ub3c4\ucee4\ud5c8\ube0c, \uae43\ud5c8\ube0c \ub4f1\ub3c4 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc73c\ub098 AWS EKS \ud658\uacbd\uc774\uba74 \ucd94\uac00 \uc778\uc99d \uc5c6\uc774 \ud3b8\ub9ac\ud558\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\uace0 \uc18d\ub3c4\uc640 \ube44\uc6a9\uc5d0\uc11c \uacbd\uc7c1\ub825\uc774 \uc788\ub294 ECR\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uad1c\ucc2e\uc740 \uc120\ud0dd\uc785\ub2c8\ub2e4.<br><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ECR\uc740 AWS \ucf58\uc194\uc5d0\uc11c \uc0dd\uc131\ud560 \uc218 \uc788\uc73c\ub098 \uac00\ub2a5\ud558\uba74 \ud14c\ub77c\ud3fc \ub4f1\uc758 IaC \ub3c4\uad6c\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc744 \uad8c\uace0\ud569\ub2c8\ub2e4. \uc544\ub798\ub294 ECR \uc0dd\uc131 \ud14c\ub77c\ud3fc \ucf54\ub4dc\uc785\ub2c8\ub2e4.<br><\/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=\"\">resource \"aws_ecr_repository\" \"github_actions_ecr\" {\n  name = \"python-flask\" # ECR \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc774\ub984\n  image_tag_mutability = \"MUTABLE\"\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud14c\ub77c\ud3fc \ucf54\ub4dc\ub3c4 \ub9e4\uc6b0 \uac04\ub2e8\ud569\ub2c8\ub2e4. \uc5b4\ub835\uc9c0 \uc54a\uac8c ECR\uc744 \ud14c\ub77c\ud3fc \ucf54\ub4dc\ub85c \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>resource \u201caws_ecr_repository\u201d<br>ECR\uc744 \uc0dd\uc131\ud558\uae30 \uc704\ud558\uc5ec \ud14c\ub77c\ud3fc \ub9ac\uc18c\uc2a4\ub85c aws_ecr_repository\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \ud14c\ub77c\ud3fc \ub9ac\uc18c\uc2a4\uc758 \uc774\ub984 github_actions_ecr\uc740 \uc784\uc758\ub85c \uc9c0\uc815\ud569\ub2c8\ub2e4.<br><\/li><li>name<br>ECR \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc774\ub984\uc785\ub2c8\ub2e4. \ub2e4\ub978 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\uc640 \uad6c\ubd84\ud560 \uc218 \uc788\uac8c \uc5ed\uc2dc \uc784\uc758\ub85c \uc9c0\uc815\ud569\ub2c8\ub2e4.<br><\/li><li>image_tag_mutability<br>\ud0dc\uadf8\ub97c \ubcc0\uacbd\ud560 \uc218 \uc788\ub290\ub0d0 \uc124\uc815\uc73c\ub85c MUTABLE, IMMUTABLE\uc744 \uc635\uc158\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uac1c\ubcc4 \uc694\uad6c \uc0ac\ud56d\uc5d0 \ub9de\uac8c \uc801\uc808\ud558\uac8c \uc120\ud0dd\ud558\uba74 \ub429\ub2c8\ub2e4. \ud544\uc790\ub294 \ubcc0\uacbd \uac00\ub2a5\ud55c MUTABLE \uc635\uc158\uc744 \uc120\ud0dd\ud558\uc600\uc2b5\ub2c8\ub2e4.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ud14c\ub77c\ud3fc \ucf54\ub4dc\uac00 \uc644\uc131\ub418\uc5b4 \ud14c\ub77c\ud3fc\uc744 \uc774\uc6a9\ud558\uc5ec \uc790\uc6d0\uc744 \uc0dd\uc131\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=\"\">tf init\ntf plan -out planfile\ntf apply<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc801\uc6a9\uc774 \uc644\ub8cc\ub418\uba74 AWS ECR \ucf58\uc194\uc5d0\uc11c \uc544\ub798\uc640 \uac19\uc774 \u2018python-flask\u2019 \uc774\ub984\uc758 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/kqkl4lMIw0sJBexGixtJl9t7gVoY5kPLFyAvonRD7Xjhp7ZCJeTfW6lBUxbrVt7su6z6WLZqZqECInLnuNnMqHPh95TYQJCpB8KEmaPVSE7QTBMd0ow8U9OYyNaJIfoZDVy9Z59ToepNEWMR_YBgG9o\" alt=\"\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>3. \ub3c4\ucee4 \ud30c\uc77c &amp; \uc0d8\ud50c \uc571 \ucf54\ub4dc \uc0dd\uc131<\/strong><br><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc0d8\ud50c \uc6a9\ub3c4\ub85c \uac04\ub2e8\ud55c \uc571\uacfc Dockerfile\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4. \uc804\uccb4 \ucf54\ub4dc\ub294 <a href=\"https:\/\/github.com\/junghoon2\/k8s-class\/tree\/main\/github-actions-workflow\">\uae43\ud5c8\ube0c \uc8fc\uc18c<\/a>\ub97c \ucc38\uace0\ud558\uc2dc\uace0 \uc544\ub798\ub294 Dockerfile \uc608\uc81c\uc785\ub2c8\ub2e4.<br><\/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=\"\"># \ubca0\uc774\uc2a4 \uc774\ubbf8\uc9c0\ub85c Python 3.8\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.\nFROM python:3.8\n\n# \uc791\uc5c5 \ub514\ub809\ud1a0\ub9ac \uc124\uc815\nWORKDIR \/app\n\n# Python \uc758\uc874\uc131 \ud30c\uc77c\uc744 \ucee8\ud14c\uc774\ub108\ub85c \ubcf5\uc0ac\nCOPY requirements.txt requirements.txt\n\n# \uc758\uc874\uc131 \uc124\uce58\nRUN pip install -r requirements.txt\n\n# \ub098\uba38\uc9c0 \ud30c\uc77c\uc744 \uc791\uc5c5 \ub514\ub809\ud1a0\ub9ac\ub85c \ubcf5\uc0ac\nCOPY . .\n\n# Flask \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc2e4\ud589\nCMD [ \"python\", \".\/app.py\" ]<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud30c\uc774\uc36c \uae30\ubcf8 \uc774\ubbf8\uc9c0\ub97c \uae30\ubc18\uc73c\ub85c \uc758\uc874\uc131 \ud30c\uc77c(flask)\uc744 \uc124\uce58\ud558\uace0 \uc2e4\ud589 \uba85\ub839\uc5b4\ub85c app.py\uc73c\ub85c \uc9c0\uc815\ud55c \uac04\ub2e8\ud55c \ub3c4\ucee4\ud30c\uc77c\uc785\ub2c8\ub2e4. \uc774 \uc678 app.py, requirement.txt \ud30c\uc77c\uc740 \uacf5\uc720\ud55c \uae43\ud5c8\ube0c \ud30c\uc77c\uc744 \ucc38\uc870\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/shq-unDH8cAA3sHkK0NcU5KubHw88CLdVpVKzGKeYiZRK9yESQCGhEnc4CbJBJgsG-IZtLJSou8vyiDoL8I-UaJ20EePVPtO3jp8jlDih1cLbe9po3nvefB0RyyjG7LjoSXyaL9BRx4JmHonoe4L9pY\" alt=\"\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>4. CI \ud14c\uc2a4\ud2b8 \uc6a9\ub3c4 \uae43\ud5c8\ube0c \ub808\ud3ec \uc0dd\uc131 &#8211; \ud658\uacbd \ubcc0\uc218 \ub4f1\ub85d<\/strong><br><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc81c \uc2e4\uc81c \uae43\ud5c8\ube0c \uc561\uc158 \ud30c\uc77c\uc744 \uc2e4\ud589\ud560 \uae43\ud5c8\ube0c \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/6KKqLivTsf0NRdZ6iLhJF1-3c2-kSscj5WnSrEj8aZP7A7ZpKwDbLWuav4fGGs5cJeogYTZttiWotFzjtU5dVIckj8LW5Tjl801gFayscyV16dtkzVovlhW-0WWgrgJfhtjeb0JRNm0DhHyCE3_P6zM\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc774\ub984\uc740 \uc784\uc758\ub85c \uc9c0\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc0dd\uc131\uc774 \uc644\ub8cc\ub418\uba74 \uc561\uc158 \ud30c\uc77c\uc5d0\uc11c \uc0ac\uc6a9\ud560 \ud658\uacbd \ubcc0\uc218\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4. \u2018Settings\u2019\uc758 \u2018Actions secrets and variables\u2019\uc5d0 \uc544\ub798\uc640 \uac19\uc774 \u2018AWs_ECR_REPO\u2019\uc640 \u2018AWS_REGION\u2019 \uc815\ubcf4\ub97c \uac01\uc790 \ud658\uacbd\uc5d0 \ub9de\uac8c \ub4f1\ub85d\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/yUIdTwAILBVA14cv_scdlQYumOyxd3kPYONVf3B4juJ6dEHzKIGN3_ykmYcKoAqPBz-K7zC0C0F31m0y5q-hB3eJIRF1kDmjKT7EkQKLh56DzHRKcCQrgLAzOSGNT3R75xUZemKCPRb_Gk7TW27YNIM\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">AWS_ECR_REPO\ub294 \uc2e4\uc81c ECR \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc774\ub984\uc744 \uc9c0\uc815\ud558\uba74 \ub429\ub2c8\ub2e4. \uae43\ud5d9 \uc561\uc158 workflow file\uc5d0\uc11c \ud574\ub2f9 \ud658\uacbd \ubcc0\uc218\ub97c \uc0ac\uc6a9\ud558\uace0 \ud574\ub2f9 \uc774\ub984\uc73c\ub85c ECR \ub808\ud3ec\uac00 \uc0dd\uc131\ub429\ub2c8\ub2e4.<br><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>5. \uae43\ud5c8\ube0c \uc561\uc158 workflow \ud30c\uc77c \uc0dd\uc131<\/strong><br><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub7fc \uc774\uc81c \uc0ac\uc804 \uc900\ube44\uac00 \uc644\ub8cc\ub418\uc5c8\uc73c\ubbc0\ub85c \uc2e4\uc81c \uae43\ud5c8\ube0c \uc561\uc158\ud30c\uc77c\uc744 \ub9cc\ub4e4\uaca0\uc2b5\ub2c8\ub2e4. \uba3c\uc800 \uc561\uc158 \ud30c\uc77c\uc758 \uc704\uce58\ub294 \uc544\ub798\uc640 \uac19\uc774 .github\/workflows\/ \ub514\ub809\ud1a0\ub9ac\uc5d0 .yml(\ub610\ub294 yaml) \ud615\uc2dd\uc73c\ub85c \uc800\uc7a5\ud569\ub2c8\ub2e4.<br><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/z-SVFuBJjgGvMUMmCU7QGi6CmIFTzNVbtKlztW1Y-RVxBdgRM1Xnjsy58nqNcad5lg_w0rBr9ROGCDjO16XOg_PeimCTJ-9GhtloLQEfspAyNv_78QFoDmU4i54DrdEZgLbyb9DEwl335CWZfvssOsM\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ubbf8\uc9c0 build &amp; push \uacfc\uc815\uc744 \uc9c4\ud589\ud558\ub294 \uc561\uc158 \ud30c\uc77c \uc608\uc2dc\uc785\ub2c8\ub2e4. (<a href=\"https:\/\/github.com\/junghoon2\/k8s-class\/blob\/main\/github-actions-workflow\/docker-build-push.yml\">\uae43\ud5c8\ube0c \ub9c1\ud06c<\/a>)<\/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=\"\">name: Docker Build and Push\n\non:\n  push:\n    tags:\n    - '*'  # \ubaa8\ub4e0 \ud0dc\uadf8\uc5d0 \ub300\ud574 \uc774 \uc6cc\ud06c\ud50c\ub85c\uc6b0\ub97c \ud2b8\ub9ac\uac70\ud569\ub2c8\ub2e4.\n      \njobs:\n  build-and-push:\n    runs-on: ubuntu-latest\n\n    permissions:\n      id-token: write\n      contents: read\n\n    steps:\n    - name: Checkout Repository\n      uses: actions\/checkout@v4\n\n    - name: Configure AWS credentials\n      uses: aws-actions\/configure-aws-credentials@v4\n      with:\n        aws-region: ${{ vars.AWS_REGION }}\n        role-to-assume: arn:aws:iam::516696002612:role\/github-actions-ci \n\n    - name: Login to Amazon ECR\n      id: login-ecr\n      uses: aws-actions\/amazon-ecr-login@v2\n\n    - name: Extract tag name\n      id: extract_tag\n      shell: bash\n      run: echo \"IMAGE_TAG=${GITHUB_REF#refs\/tags\/}\" >> $GITHUB_ENV\n\n    - name: echo image tag\n      run: echo $IMAGE_TAG\n\n    - name: Build and Push Docker Image\n      uses: docker\/build-push-action@v5\n      with:\n        push: true\n        tags: ${{ steps.login-ecr.outputs.registry }}\/${{ vars.AWS_ECR_REPO }}:${{ env.IMAGE_TAG }}<\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>on.push.tags. \u2018*\u2019<br>\uc774 \uc6cc\ud06c\ud50c\ub85c\uc6b0\ub294 GitHub \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\uc5d0 \ud0dc\uadf8\uac00 \ud478\uc2dc\ub420 \ub54c\ub9c8\ub2e4 \ud2b8\ub9ac\uac70\ub429\ub2c8\ub2e4. \uc5ec\uae30\uc11c &#8216; * &#8216;\ub294 \ubaa8\ub4e0 \ud0dc\uadf8\uc5d0 \ub300\ud574 \uc774 \uc6cc\ud06c\ud50c\ub85c\uc6b0\ub97c \uc2e4\ud589\ud558\uaca0\ub2e4\ub294 \uac83\uc744 \uc758\ubbf8\ud569\ub2c8\ub2e4. \ucf54\ub4dc\ub97c \uc218\uc815\ud558\uace0 \ud0dc\uadf8\uac00 \ud478\uc2dc\ub418\uba74 workflow \ud30c\uc77c\uc774 \uc2e4\ud589\ud569\ub2c8\ub2e4. \uba85\uc2dc\uc801\uc73c\ub85c tag\ub97c \uc5f0\uacb0\ud55c \uacbd\uc6b0\uc5d0\ub9cc workflow \uc791\uc5c5\uc744 \uc2e4\ud589\ud558\ub3c4\ub85d main\uc5d0 merge \ud558\ub294 \uacbd\uc6b0 \ub4f1\uc740 workflow \uc791\uc5c5\uc774 \uc2e4\ud589\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. <br><br><\/li><li>jobs.build-and-push.runs-on: ubuntu-latest<br>\uc774 \uc791\uc5c5\uc740 ubuntu-latest \ud658\uacbd\uc5d0\uc11c \uc2e4\ud589\ub418\uba70, Docker \uc774\ubbf8\uc9c0\ub97c \ube4c\ub4dc\ud558\uace0 Amazon ECR\ub85c \ud478\uc2dc\ud558\ub294 \ub2e8\uacc4\ub97c \ud3ec\ud568\ud569\ub2c8\ub2e4.<br><br><\/li><li>permissions.id-token, contents<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">id-token: write\uc640 contents: read \uad8c\ud55c\uc744 \uc124\uc815\ud558\uc5ec, GitHub Actions\uac00 \ud544\uc694\ud55c \uad8c\ud55c\uc73c\ub85c ID \ud1a0\ud070\uc744 \uc791\uc131\ud558\uace0 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \ucee8\ud150\uce20\ub97c \uc77d\uc744 \uc218 \uc788\ub3c4\ub85d \ud569\ub2c8\ub2e4.<br><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>steps<br>\uac1c\ubcc4 \uc561\uc158\uc744 \uc815\uc758\ud569\ub2c8\ub2e4.<br><\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">name: Checkout Repository<br>actions\/checkout@v4 \uc561\uc158\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\uc758 \uc18c\uc2a4 \ucf54\ub4dc\ub97c \uccb4\ud06c\uc544\uc6c3\ud569\ub2c8\ub2e4. \uae43\ud5c8\ube0c \uc561\uc158\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ub2e4\uc591\ud55c \uc561\uc158 \ub9ac\uc2a4\ud2b8\ub294 \uc544\ub798 <a href=\"https:\/\/github.com\/actions\">github.com\/actions<\/a> \uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/V_gsGW98txWCvg24J2E8gpZzvXEU1XPfpHuWPDxt0qJPQnc7itVQYolOVM_XX5x3soNhXI3960Iwhg7UbbwI8v8PO0CZ8Hy5dx-7QmfzdEzZkhwTV6HyGRyTB7Y5_R460pNjZw_fdM5sSYin3OhdwvY\" alt=\"\"\/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>name: Configure AWS credentials<br>aws-actions\/configure-aws-credentials@v4 \uc561\uc158\uc744 \uc0ac\uc6a9\ud558\uc5ec AWS \uc790\uaca9 \uc99d\uba85\uc744 \uad6c\uc131\ud569\ub2c8\ub2e4. \uc5ec\uae30\uc11c AWS \ub9ac\uc804\uacfc GitHub Actions\uac00 \uc0ac\uc6a9\ud560 IAM \uc5ed\ud560\uc758 ARN\uc744 \uc9c0\uc815\ud569\ub2c8\ub2e4. (vars.AWS_REGION\uacfc role-to-assume \uac12 \uc0ac\uc6a9) \uc55e\uc5d0\uc11c \uc0dd\uc131\ud55c IAM Role \uc815\ubcf4\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<br><br><\/li><li>name: Login to Amazon ECR<br>aws-actions\/amazon-ecr-login@v2 \uc561\uc158\uc744 \uc0ac\uc6a9\ud558\uc5ec Amazon ECR\uc5d0 \ub85c\uadf8\uc778\ud569\ub2c8\ub2e4. \uc774 \ub2e8\uacc4\ub294 Docker \uc774\ubbf8\uc9c0\ub97c Amazon ECR\ub85c \ud478\uc2dc\ud560 \ub54c \ud544\uc694\ud55c \uc778\uc99d \uc815\ubcf4\ub97c \uac00\uc838\uc635\ub2c8\ub2e4.<br><br>id: login-ecr \uad6c\ubb38\uc5d0\uc11c login-ecr\ub294 \uc774 \ub2e8\uacc4\uc758 \uace0\uc720 \uc2dd\ubcc4\uc790(ID)\uc785\ub2c8\ub2e4. \uc774 ID\ub97c \uc0ac\uc6a9\ud558\uc5ec, \ud574\ub2f9 \ub2e8\uacc4\uc758 \ucd9c\ub825(output)\uc744 \ub2e4\ub978 \ub2e8\uacc4\uc5d0\uc11c \ucc38\uc870\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \uc774\ubbf8\uc9c0\ub97c push\ud558\ub294 steps.login-ecr.outputs.some-output\uacfc \uac19\uc740 \ubc29\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li>name: Extract tag name<br>\uc790\ub3d9\uc73c\ub85c \uc0dd\uc131\ub418\ub294 \ud574\uc2dc \uac12\uc744 \uae30\uc900\uc73c\ub85c \ub3c4\ucee4 \uc774\ubbf8\uc9c0 \ud0dc\uadf8\ub85c \uc0ac\uc6a9\ud558\ub294 \ub2e4\ub978 \uc561\uc158 \ud30c\uc77c\uacfc \ub2e4\ub978 \ubd80\ubd84\uc785\ub2c8\ub2e4. \uae43\ud5c8\ube0c\uc758 \ud0dc\uadf8 \uc815\ubcf4\ub97c \ud658\uacbd \ubcc0\uc218\ub97c \uc800\uc7a5\ud558\uc5ec \uc774\ub97c \uc774\ubbf8\uc9c0 \ud0dc\uadf8 \uc815\ubcf4\ub97c \uc0ac\uc6a9\ud558\ub294 \uc124\uc815\uc785\ub2c8\ub2e4.&nbsp; Bash \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc0ac\uc6a9\ud558\uc5ec \ud0dc\uadf8 \uc774\ub984\uc744 \ucd94\ucd9c\ud558\uace0, \uc774\ub97c \ud658\uacbd \ubcc0\uc218 IMAGE_TAG\uc5d0 \uc800\uc7a5\ud569\ub2c8\ub2e4. \uc774 \ubcc0\uc218\ub294 Docker \uc774\ubbf8\uc9c0\uc758 \ud0dc\uadf8\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4.<br><br><\/li><li>name: echo image tag<br>\ub514\ubc84\uae45 \uc6a9\ub3c4\ub85c \uc774\ubbf8\uc9c0 \ud0dc\uadf8 \uc815\ubcf4\ub97c \ucd9c\ub825\ud558\ub294 \uc124\uc815\uc785\ub2c8\ub2e4.<br><br><\/li><li>name: Build and Push Docker Image<br>docker\/build-push-action@v5 \uc561\uc158\uc744 \uc0ac\uc6a9\ud558\uc5ec Docker \uc774\ubbf8\uc9c0\ub97c \ube4c\ub4dc\ud558\uace0 \ud478\uc2dc\ud569\ub2c8\ub2e4. push: true\ub294 \uc774\ubbf8\uc9c0\ub97c \ub808\uc9c0\uc2a4\ud2b8\ub9ac\ub85c \uc2e4\uc81c\ub85c \ud478\uc2dc\ud574\uc57c \ud568\uc744 \uc758\ubbf8\ud558\uba70, tags\ub294 \uc774\ubbf8\uc9c0\uc5d0 \uc0ac\uc6a9\ub420 \ud0dc\uadf8\ub97c \uc9c0\uc815\ud569\ub2c8\ub2e4. \uc5ec\uae30\uc11c Amazon ECR\uc758 \ub808\uc9c0\uc2a4\ud2b8\ub9ac \uc8fc\uc18c, ECR \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc774\ub984, \uadf8\ub9ac\uace0 \uc55e\uc11c \ucd94\ucd9c\ud55c \uc774\ubbf8\uc9c0 \ud0dc\uadf8\ub97c \uc0ac\uc6a9\ud558\uc600\uc2b5\ub2c8\ub2e4.<br><br>\uc55e\uc5d0\uc11c \uae43\ud5c8\ube0c\uc5d0 \uc124\uc815\ud55c \ud658\uacbd \ubcc0\uc218\ub97c ECR \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc774\ub984\uc73c\ub85c \uc9c0\uc815\ud558\uc600\uc2b5\ub2c8\ub2e4.<br><br><\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc81c \uae43\ud5c8\ube0c \uc561\uc158 \ud30c\uc77c \uc124\uc815\uc774 \uc644\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c\uc5d0\ub294 \ud0dc\uadf8\ub97c Push \ud558\uc5ec \uc2e4\uc81c \uae43\ud5c8\ube0c \uc561\uc158 workflow\ub97c \uc2e4\ud589\ud558\uaca0\uc2b5\ub2c8\ub2e4.<br><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>6. \uc774\ubbf8\uc9c0 build &amp; push \uae43\ud5c8\ube0c \uc561\uc158 \uc791\uc5c5 \uac80\uc99d<\/strong><br><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub7fc \ub85c\uceec\uc5d0\uc11c \uc0c8\ub85c\uc6b4 \ud0dc\uadf8\ub97c \uc0dd\uc131\ud558\uace0 \uae43\ud5c8\ube0c\uc5d0 \ud574\ub2f9 \ud0dc\uadf8\ub97c Push \ud574\uc11c \uc561\uc158 \uc6cc\ud06c\ud50c\ub85c\uc6b0 \ud30c\uc77c\uc744 \uc2e4\ud589\ud569\ub2c8\ub2e4.&nbsp;<br><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc0c8\ub85c\uc6b4 \ud0dc\uadf8\ub97c \ub9cc\ub4ed\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=\"\">(jerry-dev:sns)github-actions-python$ git tag -a v0.1.3<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud574\ub2f9 \ud0dc\uadf8\ub97c \uc6d0\uaca9 origin\uc5d0 push \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=\"\">(jerry-dev:sns)github-actions-python$ git push  --tags\nEnumerating objects: 1, done.\nCounting objects: 100% (1\/1), done.\nWriting objects: 100% (1\/1), 153 bytes | 153.00 KiB\/s, done.\nTotal 1 (delta 0), reused 0 (delta 0), pack-reused 0\nTo https:\/\/github.com\/junghoon2\/github-actions-python.git\n * [new tag]         v0.1.3 -> v0.1.3<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc81c \uc6d0\uaca9 \uae43\ud5c8\ube0c\uc758 \u2018Actions\u2019 \uba54\ub274\ub97c \ud655\uc778\ud558\uba74 \uc544\ub798\uc640 \uac19\uc774 \uc790\ub3d9\uc73c\ub85c Jobs \uc2e4\ud589\ub418\uace0 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/i9X-gGbUtTMLRwHzljUxu1YaEoqAFjidpIHt8T3O1US7zhA8rcxPIiV9hA-GFIJQHCTnLaCKWhWP_-Gz7h2kQEKg_C3mKjjRbJMzFNyI4HCbBj0_kJdJ010P1jGs_slTGDOW6GFOlZtnfYAiup54mmQ\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\ud574\ub2f9 \uba54\ub274\ub97c \ud074\ub9ad\ud558\uba74 \uc0c1\uc138\ud55c \uc791\uc5c5 \ub85c\uadf8\ub97c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/NW3lkToD64Ymrkf4m4PGHDU-m2OOdcqJVfnskQFPAvgpEdPsaIOcNlyZb2xuf4sjTcIKZnODRbxfTfxnZe1Lnkz9J5tJ7atd2gOfnHxzVYJHvifbSHkCHa54nB1ad7tr3vnE34pRl9OFtMoONg_idR8\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5d0\ub7ec\uc5c6\uc774 \uc791\uc5c5\uc774 \uc644\ub8cc\ub418\uba74 \uc544\ub798\uc640 \uac19\uc774 \uccb4\ud06c \ud45c\uc2dc\ub97c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/qcMS092PDHimI6odnb36BMwW0i_5bpcxzXvxM3sm5tIXo-YEyKtSsCeouFtCAYRoH0jvDUoRnsKVxNi6nrdPjykkl2rH4flif6XXRU_DuvyELWO7h92pPuyrIkoaQn2PDuKVqe6UP7vHMj9BvSajS58\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc81c \uc791\uc5c5\uc774 \uc644\ub8cc\ub418\uc5c8\uc73c\ubbc0\ub85c \uc791\uc5c5 \uacb0\uacfc\ub85c AWS ECR \ucf58\uc194\uc744 \ud655\uc778\ud558\uba74 \uc561\uc158\ud30c\uc77c \uc124\uc815\ub300\ub85c \uae43\ud5c8\ube0c \ud0dc\uadf8 \uc774\ub984\uc73c\ub85c \uc774\ubbf8\uc9c0 \ud0dc\uadf8\uac00 \uc9c0\uc815\ub418\uc5b4 \uc774\ubbf8\uc9c0\uac00 Push \ub418\uc5b4 \uc788\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/7r6iB0tON0MtdgweUWitXdowUGP1OPPAxGZ4593O6JdXY-nQ5BBs3V0aoDL72ySWVnkluNp5S2XD6PKWcgeIUq2NnySI8Y1ma1AmAwJmFNORmNFZNzQK_5mhENlcygo6ouudJdfYLKThiB8zVUyMmWo\" alt=\"\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>7. \uc0dd\uc131\ud55c ECR \uc774\ubbf8\uc9c0 \uae30\ubc18 \ud30c\ub4dc \uc0dd\uc131(\uc774\ubbf8\uc9c0 \uac80\uc99d)<\/strong><br><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub7fc \ub9c8\uc9c0\ub9c9 \ub2e8\uacc4\ub85c \uc0dd\uc131\ub41c \uc774\ubbf8\uc9c0 \uc8fc\uc18c\ub97c \ud30c\ub4dc\uc758 \ub9e4\ub2c8\ud398\uc2a4\ud2b8\uc5d0 \uba85\uc2dc\ud558\uc5ec \uc815\uc0c1\uc73c\ub85c \uc774\ubbf8\uc9c0\uac00 \uc0dd\uc131\ub418\uc5c8\ub294\uc9c0 \uac80\uc99d\ud558\uaca0\uc2b5\ub2c8\ub2e4. \uae30\ubcf8 deployment \ub9e4\ub2c8\ud398\uc2a4\ud2b8\ub97c \uc0ac\uc6a9\ud558\uace0 \uc774\ubbf8\uc9c0 \ubd80\ubd84\ub9cc \ubc29\uae08 \uc0dd\uc131\ud55c ECR \uc774\ubbf8\uc9c0 \uc8fc\uc18c\uc640 \ud0dc\uadf8\ub85c \ubcc0\uacbd\ud569\ub2c8\ub2e4.<br><\/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=\"\">apiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: python-flask\n  namespace: default\nspec:\n  selector:\n    matchLabels:\n      app: python-flask\n  template:    \n    metadata:\n      labels:\n        app: python-flask\n    spec:\n      containers:\n      - name: python-flask\n        image: 516696002612.dkr.ecr.ap-northeast-2.amazonaws.com\/python-flask:v0.1.3<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">image<br>: \uac01\uc790 \uc0dd\uc131\ud55c \uc774\ubbf8\uc9c0 \uc8fc\uc18c\ub85c \ubcc0\uacbd\ud569\ub2c8\ub2e4. \uc774\ubbf8\uc9c0 \uc8fc\uc18c\ub294 \uae43\ud5c8\ube0c \uc561\uc158 \ud30c\uc77c \ud639\uc740 \uc544\ub798\uc640 \uac19\uc774 ECR \ucf58\uc194\uc5d0\uc11c \ucc38\uc870\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/tR5waB0D8dWLvFqTZy4UX5s3FkwjJKrlhz5lpmM3Uf3ZUpIQtJrrqCdUHF8fSb5mhst9sjiSa3k1SnYslJWjlH-tKJtGWwdQpdotynvCgVY4TQ_luaZhZ3XDHfxd6f7H6fhoAv2exKZSzyCkEs07P8k\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">YAML \ud30c\uc77c\uc744 \uc801\uc6a9(apply)\ud558\uace0 \ud3ec\ud2b8\ud3ec\uc6cc\ub4dc\ub97c \uc774\uc6a9\ud558\uc5ec \uc811\uc18d\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=\"\">$ k apply -f deployment\/deploy-ecr-python-flask.yaml \ndeployment.apps\/python-flask created\n\n$ k port-forward pod\/python-flask-6f75c79c8-pdpnh 8080:8080\nForwarding from 127.0.0.1:8080 -> 8080\nForwarding from [::1]:8080 -> 8080<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc815\uc0c1\uc73c\ub85c \ud30c\ub4dc\uac00 \uc2e4\ud589\ub418\uace0 \ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c \uc774\ubbf8\uc9c0 \ub0b4\uc6a9\ub3c4 \ubcc0\uacbd\ub41c \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/uxGfmn-57prEec46_5Lyw03DgYtDjW41f2jJ-q3_oI5nNg6ZrLqLDuu9USebYhSTbVmorAZLXDiBDPuuAToKo3PIQcIiLipFqRf3-2f-cruDqhVzh1CQv6TA1j4D8lWK5XfYLE3evSTvxDTOpYZ8eTQ\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc81c \uc124\uc815\ud55c \uae43\ud5c8\ube0c \uc561\uc158 \ud30c\uc77c\uc744 \uc774\uc6a9\ud558\uc5ec \uc870\uc9c1\uc5d0\uc11c\ub294 \uae43\ud5c8\ube0c\uc5d0 \ud0dc\uadf8\uac00 Push \ub418\uba74 \uc790\ub3d9\uc73c\ub85c \uc774\ubbf8\uc9c0\ub97c \ube4c\ub4dc\ud558\uace0 \uc6d0\uaca9 ECR\uc5d0 Push\uae4c\uc9c0 \ud558\ub294 CI \uc2dc\uc2a4\ud15c\uc744 \uad6c\uc131 \uc644\ub8cc \ud558\uc600\uc2b5\ub2c8\ub2e4. CI \uc2dc\uc2a4\ud15c\uc740 \ud55c\ubc88\ub9cc \uc124\uc815\ud558\uba74 \uc774\ud6c4 \ubcc0\uacbd\ud560\uc77c\uc774 \ubcc4\ub85c \uc5c6\ub294 \uc791\uc5c5\uc774\uae30\ub3c4 \ud569\ub2c8\ub2e4.<br><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc0c1\uc73c\ub85c \uae43\ud5c8\ube0c \uc561\uc158\uc744 \uc774\uc6a9\ud558\uc5ec \ub3c4\ucee4 \uc774\ubbf8\uc9c0 Build, Push\uae4c\uc9c0 \ud558\ub294 CI \uc2dc\uc2a4\ud15c\uc744 \uad6c\uc131\ud574 \ubcf4\uc558\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>\ud574\ub2f9 \uae30\uc220 \ube14\ub85c\uadf8\uc5d0 \uc9c8\ubb38\uc774 \uc788\uc73c\uc2dc\uba74 \uc5b8\uc81c\ub4e0\uc9c0 \ubb38\uc758\ud574 \uc8fc\uc138\uc694. \uc9c1\uc811 \ub2f5\ubcc0\ud574 \ub4dc\ub9bd\ub2c8\ub2e4.<br>k8sqna@jennifersoft.com<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"\uc774\ubc88 \uc7a5\uc740 \uae43\ud5c8\ube0c \uc561\uc158\uc744 \uc774\uc6a9\ud558\uc5ec CI \uc2dc\uc2a4\ud15c\uc744 \uad6c\ucd95\ud558\ub294 \ubc29\ubc95\uc744 \uc54c\uc544\ubd05\ub2c8\ub2e4. \uc774\ubbf8 \ub9ce\uc774 \ub4e4\uc5b4 \ubcf4\uc168\uaca0\uc9c0\ub9cc CI \uc2dc\uc2a4\ud15c\uc740 &#8220;Continuous Integration&#8221;\uc758 \uc57d\uc790\ub85c, \uc18c\ud504\ud2b8\uc6e8\uc5b4&#8230;","protected":false},"author":34,"featured_media":13270,"comment_status":"open","ping_status":"closed","sticky":true,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[386],"tags":[296,238,299,294,55,256,237,257,320],"class_list":["post-13266","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kubernetes","tag-aws-eks","tag-k8s","tag-k8sedu","tag-msa","tag-55","tag-256","tag-237","tag-257","tag-320"],"acf":[],"_links":{"self":[{"href":"https:\/\/jennifersoft.com\/ko\/wp-json\/wp\/v2\/posts\/13266","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jennifersoft.com\/ko\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jennifersoft.com\/ko\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jennifersoft.com\/ko\/wp-json\/wp\/v2\/users\/34"}],"replies":[{"embeddable":true,"href":"https:\/\/jennifersoft.com\/ko\/wp-json\/wp\/v2\/comments?post=13266"}],"version-history":[{"count":5,"href":"https:\/\/jennifersoft.com\/ko\/wp-json\/wp\/v2\/posts\/13266\/revisions"}],"predecessor-version":[{"id":13903,"href":"https:\/\/jennifersoft.com\/ko\/wp-json\/wp\/v2\/posts\/13266\/revisions\/13903"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jennifersoft.com\/ko\/wp-json\/wp\/v2\/media\/13270"}],"wp:attachment":[{"href":"https:\/\/jennifersoft.com\/ko\/wp-json\/wp\/v2\/media?parent=13266"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jennifersoft.com\/ko\/wp-json\/wp\/v2\/categories?post=13266"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jennifersoft.com\/ko\/wp-json\/wp\/v2\/tags?post=13266"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}