{"id":1090,"date":"2023-05-10T21:34:48","date_gmt":"2023-05-10T12:34:48","guid":{"rendered":"https:\/\/www.gyuroot.com\/wordpress\/?p=1090"},"modified":"2023-07-04T22:10:54","modified_gmt":"2023-07-04T13:10:54","slug":"sprint-%ec%84%9c%eb%b2%84%eb%a6%ac%ec%8a%a4-%ec%82%ac%ec%a7%84%ec%b2%a9","status":"publish","type":"post","link":"https:\/\/www.gyuroot.com\/wordpress\/?p=1090","title":{"rendered":"[Sprint] \uc11c\ubc84\ub9ac\uc2a4 \uc0ac\uc9c4\ucca9"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_63 counter-hierarchy ez-toc-counter ez-toc-white ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title \" >\ubaa9\ucc28<\/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=\"Toggle Table of Content\"><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.gyuroot.com\/wordpress\/?p=1090\/#_%ED%95%99%EC%8A%B5_%EB%AA%A9%ED%91%9C\" title=\"# \ud559\uc2b5 \ubaa9\ud45c\"># \ud559\uc2b5 \ubaa9\ud45c<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1090\/#_%ED%95%B4%EA%B2%B0_%EA%B3%BC%EC%A0%9C\" title=\"# \ud574\uacb0 \uacfc\uc81c\"># \ud574\uacb0 \uacfc\uc81c<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1090\/#_%EC%8B%A4%EC%8A%B5_%EC%9E%90%EB%A3%8C\" title=\"# \uc2e4\uc2b5 \uc790\ub8cc\"># \uc2e4\uc2b5 \uc790\ub8cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1090\/#_%EA%B3%BC%EC%A0%9C_%ED%95%AD%EB%AA%A9%EB%B3%84_%EC%A7%84%ED%96%89_%EC%83%81%ED%99%A9\" title=\"# \uacfc\uc81c \ud56d\ubaa9\ubcc4 \uc9c4\ud589 \uc0c1\ud669\"># \uacfc\uc81c \ud56d\ubaa9\ubcc4 \uc9c4\ud589 \uc0c1\ud669<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><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.gyuroot.com\/wordpress\/?p=1090\/#1_Lambda_%ED%95%A8%EC%88%98_%EC%83%9D%EC%84%B1\" title=\"1. Lambda \ud568\uc218 \uc0dd\uc131\">1. Lambda \ud568\uc218 \uc0dd\uc131<\/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.gyuroot.com\/wordpress\/?p=1090\/#2_S3_%EB%B2%84%ED%82%B7_%EC%83%9D%EC%84%B1\" title=\"2. S3 \ubc84\ud0b7 \uc0dd\uc131\">2. S3 \ubc84\ud0b7 \uc0dd\uc131<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1090\/#3_Lambda_%ED%8A%B8%EB%A6%AC%EA%B1%B0_%EC%B6%94%EA%B0%80\" title=\"3. Lambda \ud2b8\ub9ac\uac70 \ucd94\uac00\">3. Lambda \ud2b8\ub9ac\uac70 \ucd94\uac00<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1090\/#4_Lambda_%EC%8B%A4%ED%96%89_%EC%97%AD%ED%95%A0%EC%97%90_%EA%B6%8C%ED%95%9C_%EC%A0%95%EC%B1%85_%EC%B6%94%EA%B0%80\" title=\"4. Lambda \uc2e4\ud589 \uc5ed\ud560\uc5d0 \uad8c\ud55c \uc815\ucc45 \ucd94\uac00\">4. Lambda \uc2e4\ud589 \uc5ed\ud560\uc5d0 \uad8c\ud55c \uc815\ucc45 \ucd94\uac00<\/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.gyuroot.com\/wordpress\/?p=1090\/#5_%ED%85%8C%EC%8A%A4%ED%8A%B8\" title=\"5. \ud14c\uc2a4\ud2b8\">5. \ud14c\uc2a4\ud2b8<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1090\/#_Advanced_Challenge\" title=\"# Advanced Challenge\"># Advanced Challenge<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><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.gyuroot.com\/wordpress\/?p=1090\/#1_SQS_%EB%8C%80%EA%B8%B0%EC%97%B4_%EC%83%9D%EC%84%B1\" title=\"1. SQS \ub300\uae30\uc5f4 \uc0dd\uc131\">1. SQS \ub300\uae30\uc5f4 \uc0dd\uc131<\/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.gyuroot.com\/wordpress\/?p=1090\/#2_S3_%EC%9D%B4%EB%B2%A4%ED%8A%B8_%EC%95%8C%EB%A6%BC_%EC%B6%94%EA%B0%80\" title=\"2. S3 \uc774\ubca4\ud2b8 \uc54c\ub9bc \ucd94\uac00\">2. S3 \uc774\ubca4\ud2b8 \uc54c\ub9bc \ucd94\uac00<\/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.gyuroot.com\/wordpress\/?p=1090\/#3_Lambda_%EC%8B%A4%ED%96%89_%EC%97%AD%ED%95%A0%EC%97%90_%EA%B6%8C%ED%95%9C_%EC%A0%95%EC%B1%85_%EC%B6%94%EA%B0%80\" title=\"3. Lambda \uc2e4\ud589 \uc5ed\ud560\uc5d0 \uad8c\ud55c \uc815\ucc45 \ucd94\uac00\">3. Lambda \uc2e4\ud589 \uc5ed\ud560\uc5d0 \uad8c\ud55c \uc815\ucc45 \ucd94\uac00<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1090\/#4_Lambda_%ED%8A%B8%EB%A6%AC%EA%B1%B0_%EC%B6%94%EA%B0%80\" title=\"4. Lambda \ud2b8\ub9ac\uac70 \ucd94\uac00\">4. Lambda \ud2b8\ub9ac\uac70 \ucd94\uac00<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1090\/#5_Lambda_%EC%86%8C%EC%8A%A4_%EC%BD%94%EB%93%9C_%EC%88%98%EC%A0%95\" title=\"5. Lambda \uc18c\uc2a4 \ucf54\ub4dc \uc218\uc815\">5. Lambda \uc18c\uc2a4 \ucf54\ub4dc \uc218\uc815<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1090\/#1_SNS_%EC%A3%BC%EC%A0%9C_%EC%83%9D%EC%84%B1\" title=\"1. SNS \uc8fc\uc81c \uc0dd\uc131\">1. SNS \uc8fc\uc81c \uc0dd\uc131<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1090\/#2_SNS_%EA%B5%AC%EB%8F%85_%EC%83%9D%EC%84%B1\" title=\"2. SNS \uad6c\ub3c5 \uc0dd\uc131\">2. SNS \uad6c\ub3c5 \uc0dd\uc131<\/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.gyuroot.com\/wordpress\/?p=1090\/#3_Lambda_%EC%8B%A4%ED%96%89_%EC%97%AD%ED%95%A0%EC%97%90_%EA%B6%8C%ED%95%9C_%EC%A0%95%EC%B1%85_%EC%B6%94%EA%B0%80-2\" title=\"3. Lambda \uc2e4\ud589 \uc5ed\ud560\uc5d0 \uad8c\ud55c \uc815\ucc45 \ucd94\uac00\">3. Lambda \uc2e4\ud589 \uc5ed\ud560\uc5d0 \uad8c\ud55c \uc815\ucc45 \ucd94\uac00<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1090\/#4_Lambda_%EC%86%8C%EC%8A%A4_%EC%BD%94%EB%93%9C_%EC%88%98%EC%A0%95\" title=\"4. Lambda \uc18c\uc2a4 \ucf54\ub4dc \uc218\uc815\">4. Lambda \uc18c\uc2a4 \ucf54\ub4dc \uc218\uc815<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1090\/#5_%ED%85%8C%EC%8A%A4%ED%8A%B8-2\" title=\"5. \ud14c\uc2a4\ud2b8\">5. \ud14c\uc2a4\ud2b8<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1090\/#1_Lambda_%EC%86%8C%EC%8A%A4_%EC%BD%94%EB%93%9C_%EC%88%98%EC%A0%95\" title=\"1. Lambda \uc18c\uc2a4 \ucf54\ub4dc \uc218\uc815\">1. Lambda \uc18c\uc2a4 \ucf54\ub4dc \uc218\uc815<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1090\/#2_%ED%85%8C%EC%8A%A4%ED%8A%B8\" title=\"2. \ud14c\uc2a4\ud2b8\">2. \ud14c\uc2a4\ud2b8<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1090\/#_TROUBLE_SHOOTING_LOG\" title=\"# TROUBLE SHOOTING LOG\"># TROUBLE SHOOTING LOG<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1090\/#%EC%9B%90%EC%9D%B8\" title=\"\uc6d0\uc778\">\uc6d0\uc778<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-25\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1090\/#%ED%95%B4%EA%B2%B0_%EB%B0%A9%EC%95%88\" title=\"\ud574\uacb0 \ubc29\uc548\">\ud574\uacb0 \ubc29\uc548<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-26\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1090\/#%EC%9B%90%EC%9D%B8-2\" title=\"\n\uc6d0\uc778\">\n\uc6d0\uc778<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-27\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1090\/#%ED%95%B4%EA%B2%B0_%EB%B0%A9%EC%95%88-2\" title=\"\ud574\uacb0 \ubc29\uc548\">\ud574\uacb0 \ubc29\uc548<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-28\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1090\/#%EC%9B%90%EC%9D%B8-3\" title=\"\uc6d0\uc778\">\uc6d0\uc778<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-29\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1090\/#%ED%95%B4%EA%B2%B0_%EB%B0%A9%EC%95%88-3\" title=\"\ud574\uacb0 \ubc29\uc548\">\ud574\uacb0 \ubc29\uc548<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-30\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1090\/#References\" title=\"#References\">#References<\/a><\/li><\/ul><\/nav><\/div>\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"_%ED%95%99%EC%8A%B5_%EB%AA%A9%ED%91%9C\"><\/span># \ud559\uc2b5 \ubaa9\ud45c<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n<ul>\n<li>\uc774\ubbf8\uc9c0\uac00 \uc5c5\ub85c\ub4dc\ub418\uba74, \uc6d0\ubcf8\uacfc \ubcc4\ub3c4\ub85c \uc378\ub124\uc77c\uc744 \uc0dd\uc131\ud558\uace0, \uc774\ub97c \ubcc4\ub3c4\uc758 \ubc84\ud0b7\uc5d0 \uc800\uc7a5\ud574\uc57c \ud569\ub2c8\ub2e4.<\/li>\n\n\n<li>\uc544\ub798 \uacfc\uc81c \uc81c\ucd9c \ubc29\ubc95\uc744 \ucc38\uace0\ud574 GitHub\uc5d0 \uc81c\ucd9c\ud569\ub2c8\ub2e4.<\/li>\n\n<\/ul>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"_%ED%95%B4%EA%B2%B0_%EA%B3%BC%EC%A0%9C\"><\/span># \ud574\uacb0 \uacfc\uc81c<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n<ul>\n<li>\uacfc\uc81c\ub97c \ub2ec\uc131\ud558\uba74, S3 \uc774\ubca4\ud2b8\uac00 SQS\ub85c \uc804\uc1a1\ub418\uac8c \ub9cc\ub4e4\uace0, SQS\ub85c\ubd80\ud130 \uc774\ubca4\ud2b8\ub97c \ubc1b\uc544 \ub78c\ub2e4\uac00 \uc2e4\ud589\ud558\uac8c \ub9cc\ub4e4\uc5b4\ubd05\uc2dc\ub2e4.<\/li>\n\n\n<li>\uc378\ub124\uc77c \uc0dd\uc131\uc774 \uc644\ub8cc\ub418\uba74, \uba54\uc77c\ub85c \ud574\ub2f9 \uc378\ub124\uc77c <span class='tooltipsall tooltipsincontent classtoolTips11'>URL<\/span>\uacfc \ud568\uaed8 \uc804\uc1a1\uc774 \ub418\uac8c \ub9cc\ub4e4\uc5b4\ubd05\uc2dc\ub2e4.<\/li>\n\n\n<li>S3\uc758 Pre-signed <span class='tooltipsall tooltipsincontent classtoolTips11'>URL<\/span> \uae30\ub2a5\uc744 \uc774\uc6a9\ud558\uc5ec, \uc5c5\ub85c\ub4dc \uc804\uc6a9 <span class='tooltipsall tooltipsincontent classtoolTips11'>URL<\/span>\uc744 \ud68d\ub4dd\ud558\uace0, \uc774\ub97c \ud1b5\ud574 \uc774\ubbf8\uc9c0\ub97c S3 \uc5c5\ub85c\ub4dc\ud560 \uc218 \uc788\uac8c \ub9cc\ub4e4\uc5b4\ubd05\uc2dc\ub2e4.<\/li>\n\n<\/ul>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"_%EC%8B%A4%EC%8A%B5_%EC%9E%90%EB%A3%8C\"><\/span># \uc2e4\uc2b5 \uc790\ub8cc<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n<ol>\n<li>sam init \uba85\ub839\uc744 \uc774\uc6a9\ud574 Quick Start Template\uc73c\ub85c\ubd80\ud130 Standalone function\uc744 \ud558\ub098 \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/li>\n\n\n<li>lambda \ud568\uc218\uc758 \ud30c\ub77c\ubbf8\ud130\ub97c \uc815\uc758\ud569\ub2c8\ub2e4. \uc774\ub294 \uc774\ubca4\ud2b8 \uc18c\uc2a4\ub85c\ubd80\ud130 \ud2b8\ub9ac\uac70\uac00 \ubc1c\uc0dd\ud588\uc744 \ub54c \uc774\ubca4\ud2b8\uc758 \ud615\ud0dc\ub97c \ud655\uc778\ud558\uae30 \uc704\ud568\uc785\ub2c8\ub2e4. \ub2e4\uc74c\uacfc \uac19\uc774 \ucf54\ub4dc\ub97c \uc791\uc131\ud569\ub2c8\ub2e4.<\/li>\n\n<\/ol>\n\n\n<pre class=\"wp-block-code\"><code>exports.helloFromLambdaHandler = async (event, context) =&gt; {\n    console.log(event)\n\n    console.log(context)\n\n    return &#039;Hello from Lambda!&#039;;\n}<\/code><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"_%EA%B3%BC%EC%A0%9C_%ED%95%AD%EB%AA%A9%EB%B3%84_%EC%A7%84%ED%96%89_%EC%83%81%ED%99%A9\"><\/span># \uacfc\uc81c \ud56d\ubaa9\ubcc4 \uc9c4\ud589 \uc0c1\ud669<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"1_Lambda_%ED%95%A8%EC%88%98_%EC%83%9D%EC%84%B1\"><\/span>1. Lambda \ud568\uc218 \uc0dd\uc131<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<blockquote class=\"wp-block-quote has-text-color\" style=\"color: rgb(0, 0, 0)\">\n<p><strong>javascript \ucf54\ub4dc \uc791\uc131<\/strong><\/p>\n\n<\/blockquote>\n\n\n<pre class=\"wp-block-code\"><code>const aws = require(&#039;aws-sdk&#039;);\nconst s3 = new aws.S3({ apiVersion: &#039;2006-03-01&#039; });\n\nconst sharp = require(&#039;sharp&#039;);\n\nexports.helloFromLambdaHandler = async (event, context) =&gt; {\n    const bucket = event.Records[0].s3.bucket.name;\n    const key = decodeURIComponent(event.Records[0].s3.object.key.replace(\/+\/g, &#039; &#039;));    \n\n    const params = {\n        Bucket: bucket,\n        Key: key,\n    };\n\n    \/\/ \uc6d0\ubcf8 \ubc84\ud0b7\uc73c\ub85c\ubd80\ud130 \ud30c\uc77c \uc77d\uae30    \n    const s3Object = await s3.getObject(params).promise();\n    \n    \/\/ \uc774\ubbf8\uc9c0 \ub9ac\uc0ac\uc774\uc988, sharp \ub77c\uc774\ube0c\ub7ec\ub9ac\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.\n    const data = await sharp(s3Object.Body).resize(200).jpeg({ mozjpeg: true }).toBuffer()\n  \n    \/\/ param \ubc84\ud0b7\uc744 \ub300\uc0c1 \ubc84\ud0b7\uc73c\ub85c \ubcc0\uacbd\n    params.Bucket = process.env.BUCKET_TARGET\n\n    \/\/ \ub300\uc0c1 \ubc84\ud0b7\uc73c\ub85c \ud30c\uc77c \uc4f0\uae30\n    const result = await s3.putObject({\n        ...params,\n        ContentType: &#039;image\/jpeg&#039;,\n        Body: data,\n        ACL: &#039;public-read&#039;\n    }).promise()\n}<\/code><\/pre>\n\n\n<blockquote class=\"wp-block-quote has-text-color\" style=\"color: rgb(0, 0, 0)\">\n<p><strong>build &amp; deploy<\/strong><\/p>\n\n<\/blockquote>\n\n\n<pre class=\"wp-block-code\"><code>oh@devops \ue0b0 ~\/codeStates\/sam-image-app \ue0b0 sam build            \nStarting Build use cache\nManifest file is changed (new hash: da81938432ee64c3c397dcbd39b15e4b) or dependency folder (.aws-sam\/deps\/d3b653c2-eee4-4088-8292-77f8ae83bc69) is missing for (helloFromLambdaFunction), downloading dependencies and copying\/building source\nBuilding codeuri: \/home\/oh\/codeStates\/sam-image-app runtime: nodejs14.x metadata: {} architecture: x86_64 functions: helloFromLambdaFunction\nRunning NodejsNpmBuilder:NpmPack\nRunning NodejsNpmBuilder:CopyNpmrcAndLockfile\nRunning NodejsNpmBuilder:CopySource\nRunning NodejsNpmBuilder:NpmInstall\nRunning NodejsNpmBuilder:CleanUp\nRunning NodejsNpmBuilder:CopyDependencies\nRunning NodejsNpmBuilder:CleanUpNpmrc\nRunning NodejsNpmBuilder:LockfileCleanUp\nRunning NodejsNpmBuilder:LockfileCleanUp\n\nBuild Succeeded\n\nBuilt Artifacts  : .aws-sam\/build\nBuilt Template   : .aws-sam\/build\/template.yaml\n\nCommands you can use next\n=========================\n[*] Validate SAM template: sam validate\n[*] Invoke Function: sam local invoke\n[*] Test Function in the Cloud: sam sync --stack-name {{stack-name}} --watch\n[*] Deploy: sam deploy --guided\n\n\noh@devops \ue0b0 ~\/codeStates\/sam-image-app \ue0b0 sam deploy --guided       \n\nConfiguring SAM deploy\n======================\n\n        Looking for config file [samconfig.toml] :  Found\n        Reading default arguments  :  Success\n\n        Setting default arguments for &#039;sam deploy&#039;\n        =========================================\n        Stack Name [sam-image-app]: \n        AWS Region [ap-northeast-2]: \n        #Shows you resources changes to be deployed and require a &#039;Y&#039; to initiate deploy\n        Confirm changes before deploy [Y\/n]: n\n        #SAM needs permission to be able to create roles to connect to the resources in your template\n        Allow SAM CLI IAM role creation [Y\/n]: n\n        Capabilities [[&#039;CAPABILITY_IAM&#039;]]: \n        #Preserves the state of previously provisioned resources when an operation fails\n        Disable rollback [y\/N]: N\n        Save arguments to configuration file [Y\/n]: n\n\n        Looking for resources needed for deployment:\n\n        Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-qo0co9c7ixez\n        A different default S3 bucket can be set in samconfig.toml and auto resolution of buckets turned off by setting resolve_s3=False\n        Uploading to sam-image-app\/0761243950ce57d64feac4a3f69d0c92  19550613 \/ 19550613  (100.00%)\n\n        Deploying with following values\n        ===============================\n        Stack name                   : sam-image-app\n        Region                       : ap-northeast-2\n        Confirm changeset            : False\n        Disable rollback             : False\n        Deployment s3 bucket         : aws-sam-cli-managed-default-samclisourcebucket-qo0co9c7ixez\n        Capabilities                 : [&quot;CAPABILITY_IAM&quot;]\n        Parameter overrides          : {}\n        Signing Profiles             : {}\n\nInitiating deployment\n=====================\n\n        Uploading to sam-image-app\/ab80d8e45bac96e41d1a0abc18153d11.template  673 \/ 673  (100.00%)\n\n\nWaiting for changeset to be created..\n\nCloudFormation stack changeset\n-----------------------------------------------------------------------------------------------------------------------------------------\nOperation                          LogicalResourceId                  ResourceType                       Replacement                      \n-----------------------------------------------------------------------------------------------------------------------------------------\n* Modify                           helloFromLambdaFunction            AWS::Lambda::Function              False                            \n-----------------------------------------------------------------------------------------------------------------------------------------\n\n\nChangeset created successfully. arn:aws:cloudformation:ap-northeast-2:057440442371:changeSet\/samcli-deploy1683701668\/a7c43724-60fd-4c88-98c2-d3808a88326b\n\n\n2023-05-10 15:54:34 - Waiting for stack create\/update to complete\n\nCloudFormation events from stack operations (refresh every 5.0 seconds)\n-----------------------------------------------------------------------------------------------------------------------------------------\nResourceStatus                     ResourceType                       LogicalResourceId                  ResourceStatusReason             \n-----------------------------------------------------------------------------------------------------------------------------------------\nUPDATE_IN_PROGRESS                 AWS::Lambda::Function              helloFromLambdaFunction            -                                \nUPDATE_COMPLETE                    AWS::Lambda::Function              helloFromLambdaFunction            -                                \nUPDATE_COMPLETE_CLEANUP_IN_PROGR   AWS::CloudFormation::Stack         sam-image-app                      -                                \nESS                                                                                                                                       \nUPDATE_COMPLETE                    AWS::CloudFormation::Stack         sam-image-app                      -                                \n-----------------------------------------------------------------------------------------------------------------------------------------\n\n\nSuccessfully created\/updated stack - sam-image-app in ap-northeast-2<\/code><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"2_S3_%EB%B2%84%ED%82%B7_%EC%83%9D%EC%84%B1\"><\/span>2. S3 \ubc84\ud0b7 \uc0dd\uc131<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<blockquote class=\"wp-block-quote has-text-color\" style=\"color: rgb(0, 0, 0)\">\n<p><strong>\uc18c\uc2a4 \ubc84\ud0b7 \uc0dd\uc131<\/strong><\/p>\n\n<\/blockquote>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.gyuroot.com\/wordpress\/wp-content\/uploads\/image-285-1024x515.png?v=1688474016\" alt=\"\"\/><\/figure>\n\n\n<blockquote class=\"wp-block-quote has-text-color\" style=\"color: rgb(0, 0, 0)\">\n<p><strong>\ud0c0\uac9f \ubc84\ud0b7 \uc0dd\uc131<\/strong><\/p>\n\n<\/blockquote>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.gyuroot.com\/wordpress\/wp-content\/uploads\/image-286-1024x531.png?v=1688474024\" alt=\"\"\/><\/figure>\n\n\n<blockquote class=\"wp-block-quote has-text-color\" style=\"color: rgb(0, 0, 0)\">\n<p><strong>\ud0c0\uac9f \ubc84\ud0b7 ACL \ud65c\uc131\ud654<\/strong><\/p>\n\n<\/blockquote>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.gyuroot.com\/wordpress\/wp-content\/uploads\/image-287-1024x924.png?v=1688474029\" alt=\"\"\/><\/figure>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"3_Lambda_%ED%8A%B8%EB%A6%AC%EA%B1%B0_%EC%B6%94%EA%B0%80\"><\/span>3. Lambda \ud2b8\ub9ac\uac70 \ucd94\uac00<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.gyuroot.com\/wordpress\/wp-content\/uploads\/image-288-883x1024.png?v=1688474034\" alt=\"\"\/><\/figure>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"4_Lambda_%EC%8B%A4%ED%96%89_%EC%97%AD%ED%95%A0%EC%97%90_%EA%B6%8C%ED%95%9C_%EC%A0%95%EC%B1%85_%EC%B6%94%EA%B0%80\"><\/span>4. Lambda \uc2e4\ud589 \uc5ed\ud560\uc5d0 \uad8c\ud55c \uc815\ucc45 \ucd94\uac00<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<pre class=\"wp-block-code\"><code>{\n    &quot;Version&quot;: &quot;2012-10-17&quot;,\n    &quot;Statement&quot;: [\n        {\n            &quot;Sid&quot;: &quot;S3GetObject&quot;,\n            &quot;Effect&quot;: &quot;Allow&quot;,\n            &quot;Action&quot;: &quot;s3:GetObject&quot;,\n            &quot;Resource&quot;: &quot;arn:aws:s3:::bighead-image-src\/*&quot;\n        },\n        {\n            &quot;Sid&quot;: &quot;S3PutObject&quot;,\n            &quot;Effect&quot;: &quot;Allow&quot;,\n            &quot;Action&quot;: [\n                &quot;s3:PutObject&quot;,\n                &quot;s3:PutObjectAcl&quot;\n            ],\n            &quot;Resource&quot;: &quot;arn:aws:s3:::bighead-image-tg\/*&quot;\n        }\n    ]\n}<\/code><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"5_%ED%85%8C%EC%8A%A4%ED%8A%B8\"><\/span>5. \ud14c\uc2a4\ud2b8<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<blockquote class=\"wp-block-quote has-text-color\" style=\"color: rgb(0, 0, 0)\">\n<p><strong>\uc774\ubbf8\uc9c0 \uc5c5\ub85c\ub4dc<\/strong><\/p>\n\n<\/blockquote>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.gyuroot.com\/wordpress\/wp-content\/uploads\/image-289-969x1024.png?v=1688474037\" alt=\"\"\/><\/figure>\n\n\n<blockquote class=\"wp-block-quote has-text-color\" style=\"color: rgb(0, 0, 0)\">\n<p><strong>Lambda \uc2e4\ud589 \ud655\uc778<\/strong><\/p>\n\n<\/blockquote>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.gyuroot.com\/wordpress\/wp-content\/uploads\/image-290-1024x526.png?v=1688474041\" alt=\"\"\/><\/figure>\n\n\n<blockquote class=\"wp-block-quote has-text-color\" style=\"color: rgb(0, 0, 0)\">\n<p><strong>\uc378\ub124\uc77c \uc774\ubbf8\uc9c0 \uc0dd\uc131 \ud655\uc778<\/strong><\/p>\n\n<\/blockquote>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.gyuroot.com\/wordpress\/wp-content\/uploads\/image-291-1024x615.png?v=1688474045\" alt=\"\"\/><\/figure>\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-3\">\n<div class=\"wp-block-column is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.gyuroot.com\/wordpress\/wp-content\/uploads\/image-292.png?v=1688474048\" alt=\"\"\/><\/figure>\n\n<\/div>\n\n\n<div class=\"wp-block-column is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.gyuroot.com\/wordpress\/wp-content\/uploads\/image-293-1024x810.png?v=1688474051\" alt=\"\"\/><\/figure>\n\n<\/div>\n\n<\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"_Advanced_Challenge\"><\/span># <strong>Advanced Challenge<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n<p class=\"has-background\" style=\"background-color: rgb(237, 243, 236)\">&#x1f525; <strong>S3 \uc774\ubca4\ud2b8\uac00 SQS\ub85c \uc804\uc1a1\ub418\uac8c \ub9cc\ub4e4\uace0, SQS\ub85c\ubd80\ud130 \uc774\ubca4\ud2b8\ub97c \ubc1b\uc544 \ub78c\ub2e4\uac00 \uc2e4\ud589\ud558\uac8c \ub9cc\ub4e4\uc5b4\ubd05\uc2dc\ub2e4.<\/strong><\/p>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"1_SQS_%EB%8C%80%EA%B8%B0%EC%97%B4_%EC%83%9D%EC%84%B1\"><\/span>1. SQS \ub300\uae30\uc5f4 \uc0dd\uc131<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.gyuroot.com\/wordpress\/wp-content\/uploads\/image-294-361x1024.png?v=1688474057\" alt=\"\"\/><\/figure>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"2_S3_%EC%9D%B4%EB%B2%A4%ED%8A%B8_%EC%95%8C%EB%A6%BC_%EC%B6%94%EA%B0%80\"><\/span>2. S3 \uc774\ubca4\ud2b8 \uc54c\ub9bc \ucd94\uac00<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.gyuroot.com\/wordpress\/wp-content\/uploads\/image-295-297x1024.png?v=1688474063\" alt=\"\"\/><\/figure>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"3_Lambda_%EC%8B%A4%ED%96%89_%EC%97%AD%ED%95%A0%EC%97%90_%EA%B6%8C%ED%95%9C_%EC%A0%95%EC%B1%85_%EC%B6%94%EA%B0%80\"><\/span>3. Lambda \uc2e4\ud589 \uc5ed\ud560\uc5d0 \uad8c\ud55c \uc815\ucc45 \ucd94\uac00<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<pre class=\"wp-block-code\"><code>{\n\t&quot;Version&quot;: &quot;2012-10-17&quot;,\n\t&quot;Statement&quot;: [\n\t\t{\n\t\t\t&quot;Sid&quot;: &quot;VisualEditor&quot;,\n\t\t\t&quot;Effect&quot;: &quot;Allow&quot;,\n\t\t\t&quot;Action&quot;: [\n\t\t\t\t&quot;sqs:ReceiveMessage&quot;,\n\t\t\t\t&quot;sqs:DeleteMessage&quot;,\n\t\t\t\t&quot;sqs:GetQueueAttributes&quot;\n\t\t\t],\n\t\t\t&quot;Resource&quot;: &quot;arn:aws:sqs:ap-northeast-2:057440442371:bighead-image-convert&quot;\n\t\t}\n\t]\n}<\/code><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"4_Lambda_%ED%8A%B8%EB%A6%AC%EA%B1%B0_%EC%B6%94%EA%B0%80\"><\/span>4. Lambda \ud2b8\ub9ac\uac70 \ucd94\uac00<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.gyuroot.com\/wordpress\/wp-content\/uploads\/image-296-770x1024.png?v=1688474068\" alt=\"\"\/><\/figure>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"5_Lambda_%EC%86%8C%EC%8A%A4_%EC%BD%94%EB%93%9C_%EC%88%98%EC%A0%95\"><\/span>5. Lambda \uc18c\uc2a4 \ucf54\ub4dc \uc218\uc815<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<blockquote class=\"wp-block-quote has-text-color\" style=\"color: rgb(0, 0, 0)\">\n<p><strong>\ud2b8\ub9ac\uac70\ub97c SQS\ub85c \ubcc0\uacbd \uc2dc, S3 Event \uad00\ub828 \uc815\ubcf4\uac00 <\/strong><code><strong>event.Records[0].body.Records[0].s3<\/strong><\/code><strong> \uc548\uc73c\ub85c \ub4e4\uc5b4\uc628\ub2e4.<\/strong><\/p>\n\n<\/blockquote>\n\n\n<pre class=\"wp-block-code\"><code>const aws = require(&#039;aws-sdk&#039;)\nconst region = process.env.AWS_REGION\n\naws.config.update(region);\n\nconst s3 = new aws.S3({ apiVersion: &#039;2006-03-01&#039; })\n\nconst sharp = require(&#039;sharp&#039;)\n\nexports.helloFromLambdaHandler = async (event, context) =&gt; {\n    const body = JSON.parse(event.Records[0].body)\n    const s3Event = body.Records[0].s3\n\n    const bucketSrc = s3Event.bucket.name\n    const bucketTg = process.env.BUCKET_TARGET\n\n    const key = decodeURIComponent(s3Event.object.key.replace(\/+\/g, &#039; &#039;))\n\n    const s3Params = {\n        Bucket: bucketSrc,\n        Key: key,\n    }\n\n    \/\/ \uc6d0\ubcf8 \ubc84\ud0b7\uc73c\ub85c\ubd80\ud130 \ud30c\uc77c \uc77d\uae30    \n    const s3Object = await s3.getObject(s3Params).promise()\n    \n    \/\/ \uc774\ubbf8\uc9c0 \ub9ac\uc0ac\uc774\uc988, sharp \ub77c\uc774\ube0c\ub7ec\ub9ac\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.\n    const data = await sharp(s3Object.Body).resize(200).jpeg({ mozjpeg: true }).toBuffer()\n  \n    \/\/ param \ubc84\ud0b7\uc744 \ub300\uc0c1 \ubc84\ud0b7\uc73c\ub85c \ubcc0\uacbd\n    s3Params.Bucket = bucketTg\n\n    const result = await s3.putObject({\n        ...s3Params,\n        ContentType: &#039;image\/jpeg&#039;,\n        Body: data,\n        ACL: &#039;public-read&#039;\n    }).promise()\n}<\/code><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n<p class=\"has-background\" style=\"background-color: rgb(237, 243, 236)\">&#x1f525; <strong>\uc378\ub124\uc77c \uc0dd\uc131\uc774 \uc644\ub8cc\ub418\uba74 Amazon SNS\ub97c \ud65c\uc6a9\ud558\uc5ec, \uba54\uc77c\ub85c \ud574\ub2f9 \uc378\ub124\uc77c <span class='tooltipsall tooltipsincontent classtoolTips11'>URL<\/span>\uacfc \ud568\uaed8 \uc804\uc1a1\uc774 \ub418\uac8c \ub9cc\ub4e4\uc5b4\ubd05\uc2dc\ub2e4.<\/strong><\/p>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"1_SNS_%EC%A3%BC%EC%A0%9C_%EC%83%9D%EC%84%B1\"><\/span>1. SNS \uc8fc\uc81c \uc0dd\uc131<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.gyuroot.com\/wordpress\/wp-content\/uploads\/image-297-797x1024.png?v=1688474073\" alt=\"\"\/><\/figure>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"2_SNS_%EA%B5%AC%EB%8F%85_%EC%83%9D%EC%84%B1\"><\/span>2. SNS \uad6c\ub3c5 \uc0dd\uc131<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.gyuroot.com\/wordpress\/wp-content\/uploads\/image-298-1024x733.png?v=1688474077\" alt=\"\"\/><\/figure>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"3_Lambda_%EC%8B%A4%ED%96%89_%EC%97%AD%ED%95%A0%EC%97%90_%EA%B6%8C%ED%95%9C_%EC%A0%95%EC%B1%85_%EC%B6%94%EA%B0%80-2\"><\/span>3. Lambda \uc2e4\ud589 \uc5ed\ud560\uc5d0 \uad8c\ud55c \uc815\ucc45 \ucd94\uac00<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<pre class=\"wp-block-code\"><code>{\n    &quot;Version&quot;: &quot;2012-10-17&quot;,\n    &quot;Statement&quot;: [\n        {\n            &quot;Sid&quot;: &quot;VisualEditor&quot;,\n            &quot;Effect&quot;: &quot;Allow&quot;,\n            &quot;Action&quot;: [\n                &quot;sns:Publish&quot;\n            ],\n            &quot;Resource&quot;: &quot;arn:aws:sns:ap-northeast-2:057440442371:bighead-image-email&quot;\n        }\n    ]\n}<\/code><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"4_Lambda_%EC%86%8C%EC%8A%A4_%EC%BD%94%EB%93%9C_%EC%88%98%EC%A0%95\"><\/span>4. Lambda \uc18c\uc2a4 \ucf54\ub4dc \uc218\uc815<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<pre class=\"wp-block-code\"><code>const aws = require(&#039;aws-sdk&#039;)\nconst region = process.env.AWS_REGION\n\naws.config.update(region);\n\nconst s3 = new aws.S3({ apiVersion: &#039;2006-03-01&#039; })\nconst sns = new aws.SNS({apiVersion: &#039;2010-03-31&#039;})\n\nconst sharp = require(&#039;sharp&#039;)\n\nexports.helloFromLambdaHandler = async (event, context) =&gt; {    \n    const body = JSON.parse(event.Records[0].body)\n    const s3Event = body.Records[0].s3\n\n    const bucketSrc = s3Event.bucket.name\n    const bucketTg = process.env.BUCKET_TARGET\n\n    const key = decodeURIComponent(s3Event.object.key.replace(\/+\/g, &#039; &#039;))\n\n    const s3Params = {\n        Bucket: bucketSrc,\n        Key: key,\n    }\n\n    \/\/ \uc6d0\ubcf8 \ubc84\ud0b7\uc73c\ub85c\ubd80\ud130 \ud30c\uc77c \uc77d\uae30    \n    const s3Object = await s3.getObject(s3Params).promise()\n    \n    \/\/ \uc774\ubbf8\uc9c0 \ub9ac\uc0ac\uc774\uc988, sharp \ub77c\uc774\ube0c\ub7ec\ub9ac\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.\n    const data = await sharp(s3Object.Body).resize(200).jpeg({ mozjpeg: true }).toBuffer()\n  \n    \/\/ param \ubc84\ud0b7\uc744 \ub300\uc0c1 \ubc84\ud0b7\uc73c\ub85c \ubcc0\uacbd\n    s3Params.Bucket = bucketTg\n\n    const result = await s3.putObject({\n        ...s3Params,\n        ContentType: &#039;image\/jpeg&#039;,\n        Body: data,\n        ACL: &#039;public-read&#039;\n    }).promise()\n\n    const snsParams = {        \n        TopicArn: process.env.SNS_TOPIC_ARN,\n        Subject: &#039;Thumbnail have been extracted from the image.&#039;,\n        Message: `Thumbnail <span class='tooltipsall tooltipsincontent classtoolTips11'>URL<\/span>: https:\/\/${bucketTg}.s3.${region}.amazonaws.com\/${key}`\n    }\n    \n    \/\/ SNS \uba54\uc2dc\uc9c0 \uac8c\uc2dc\n    await sns.publish(snsParams).promise()\n\n}<\/code><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"5_%ED%85%8C%EC%8A%A4%ED%8A%B8-2\"><\/span>5. \ud14c\uc2a4\ud2b8<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<blockquote class=\"wp-block-quote has-text-color\" style=\"color: rgb(0, 0, 0)\">\n<p><strong>\uc774\uba54\uc77c \uc804\uc1a1 \ud655\uc778<\/strong><\/p>\n\n<\/blockquote>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.gyuroot.com\/wordpress\/wp-content\/uploads\/image-299-1024x446.png?v=1688474080\" alt=\"\"\/><\/figure>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n<p class=\"has-background\" style=\"background-color: rgb(237, 243, 236)\">&#x1f525; <strong>S3\uc758 Pre-signed <span class='tooltipsall tooltipsincontent classtoolTips11'>URL<\/span> \uae30\ub2a5\uc744 \uc774\uc6a9\ud558\uc5ec, \uc5c5\ub85c\ub4dc \uc804\uc6a9 <span class='tooltipsall tooltipsincontent classtoolTips11'>URL<\/span>\uc744 \ud68d\ub4dd\ud558\uace0, \uc774\ub97c \ud1b5\ud574 \uc774\ubbf8\uc9c0\ub97c S3 \uc5c5\ub85c\ub4dc\ud560 \uc218 \uc788\uac8c \ub9cc\ub4e4\uc5b4\ubd05\uc2dc\ub2e4.<\/strong><\/p>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"1_Lambda_%EC%86%8C%EC%8A%A4_%EC%BD%94%EB%93%9C_%EC%88%98%EC%A0%95\"><\/span>1. Lambda \uc18c\uc2a4 \ucf54\ub4dc \uc218\uc815<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<pre class=\"wp-block-code\"><code>const aws = require(&#039;aws-sdk&#039;)\nconst region = process.env.AWS_REGION\n\naws.config.update(region);\n\nconst s3 = new aws.S3({ apiVersion: &#039;2006-03-01&#039; })\nconst sns = new aws.SNS({apiVersion: &#039;2010-03-31&#039;})\n\nconst sharp = require(&#039;sharp&#039;)\nconst axios = require(&#039;axios&#039;)\n\nexports.helloFromLambdaHandler = async (event, context) =&gt; {    \n    const body = JSON.parse(event.Records[0].body)\n    const s3Event = body.Records[0].s3\n\n    const bucketSrc = s3Event.bucket.name\n    const bucketTg = process.env.BUCKET_TARGET\n\n    const key = decodeURIComponent(s3Event.object.key.replace(\/+\/g, &#039; &#039;))\n\n    const s3Params = {\n        Bucket: bucketSrc,\n        Key: key,\n    }\n\n    \/\/ \uc6d0\ubcf8 \ubc84\ud0b7\uc73c\ub85c\ubd80\ud130 \ud30c\uc77c \uc77d\uae30    \n    const s3Object = await s3.getObject(s3Params).promise()\n    \n    \/\/ \uc774\ubbf8\uc9c0 \ub9ac\uc0ac\uc774\uc988, sharp \ub77c\uc774\ube0c\ub7ec\ub9ac\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.\n    const data = await sharp(s3Object.Body).resize(200).jpeg({ mozjpeg: true }).toBuffer()\n  \n    \/\/ get presignedURL\n    const presignedURL = s3.getSignedUrl(&#039;putObject&#039;, {\n        Bucket: bucketTg,\n        ContentType: &#039;image\/jpeg&#039;,\n        ACL: &#039;public-read&#039;,\n        Key: key,\n        Expires: 60\n    })\n\n    \/\/ \ub300\uc0c1 \ubc84\ud0b7\uc73c\ub85c \ud30c\uc77c \uc4f0\uae30\n    await axios.put(presignedURL, data, {\n        headers: {\n            &#039;Content-Type&#039;: &#039;image\/jpeg&#039;,\n            &#039;x-amz-acl&#039;: &#039;public-read&#039;\n        }\n    })\n\n    \/\/ SNS \uba54\uc2dc\uc9c0 \uac8c\uc2dc\n    const snsParams = {        \n        TopicArn: process.env.SNS_TOPIC_ARN,\n        Subject: &#039;Thumbnail have been extracted from the image.&#039;,\n        Message: `Thumbnail <span class='tooltipsall tooltipsincontent classtoolTips11'>URL<\/span>: https:\/\/${bucketTg}.s3.${region}.amazonaws.com\/${key}`\n    }\n    \n    await sns.publish(snsParams).promise()\n\n}<\/code><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"2_%ED%85%8C%EC%8A%A4%ED%8A%B8\"><\/span>2. \ud14c\uc2a4\ud2b8<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<blockquote class=\"wp-block-quote has-text-color\" style=\"color: rgb(0, 0, 0)\">\n<p><strong>\ubcc0\ud658\ub41c \uc774\ubbf8\uc9c0 \uc5c5\ub85c\ub4dc \ud655\uc778<\/strong><\/p>\n\n<\/blockquote>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.gyuroot.com\/wordpress\/wp-content\/uploads\/image-300-1024x1013.png?v=1688474085\" alt=\"\"\/><\/figure>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"_TROUBLE_SHOOTING_LOG\"><\/span># TROUBLE SHOOTING LOG<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n<p class=\"has-background\" style=\"background-color: rgb(251, 243, 219)\">&#x1f4a1; <strong>S3 \uc774\ubca4\ud2b8 \u2192 SNS \uad6c\uc131\uc2dc \uc6d0\ud558\ub294 \uc751\ub2f5\uc744 \ubc1b\uc9c0 \ubabb\ud568<\/strong><\/p>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%EC%9B%90%EC%9D%B8\"><\/span>\uc6d0\uc778<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<blockquote class=\"wp-block-quote has-text-color\" style=\"color: rgb(0, 0, 0)\">\n<p>S3\uc5d0 \uc0dd\uc131\ub418\ub294 \uac1d\uccb4\uc5d0 \ub300\ud55c \uc774\ubca4\ud2b8\ub9cc SNS\ub85c \uc54c\ub9bc\uc744 \ud558\uae30 \ub54c\ubb38\uc5d0 \uc0ac\uc9c4 <span class='tooltipsall tooltipsincontent classtoolTips11'>URL<\/span> \uc751\ub2f5\uc744 \ubc1b\uc744 \uc218 \uc5c6\uc74c<\/p>\n\n<\/blockquote>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%ED%95%B4%EA%B2%B0_%EB%B0%A9%EC%95%88\"><\/span>\ud574\uacb0 \ubc29\uc548<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.gyuroot.com\/wordpress\/wp-content\/uploads\/image-301.png?v=1688474088\" alt=\"\"\/><\/figure>\n\n\n<blockquote class=\"wp-block-quote has-text-color\" style=\"color: rgb(0, 0, 0)\">\n<p>\uc704\uc640 \uac19\uc740 \ubc29\ud5a5\uc73c\ub85c \ub2e4\uc2dc \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uc5ec \ud574\uacb0<\/p>\n\n<\/blockquote>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n<p class=\"has-background\" style=\"background-color: rgb(251, 243, 219)\">&#x1f4a1; <strong>SQS\ub97c \ud2b8\ub9ac\uac70\ub85c \ud558\ub294 Lambda\uac00 \uc9c0\uc18d \ud638\ucd9c\ub418\ub294 \uc774\uc288\n<\/strong><\/p>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%EC%9B%90%EC%9D%B8-2\"><\/span>\n\uc6d0\uc778<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<blockquote class=\"wp-block-quote has-text-color\" style=\"color: rgb(0, 0, 0)\">\n<p>Lambda \ud568\uc218 \ucf54\ub4dc \uc624\ub958 \ubc1c\uc0dd\uc73c\ub85c \uc778\ud574 \ud638\ucd9c\uc774 \uc7ac\uc2dc\ub3c4 \ub428.<\/p>\n\n<\/blockquote>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%ED%95%B4%EA%B2%B0_%EB%B0%A9%EC%95%88-2\"><\/span>\ud574\uacb0 \ubc29\uc548<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<blockquote class=\"wp-block-quote has-text-color\" style=\"color: rgb(0, 0, 0)\">\n<p>\uba54\uc2dc\uc9c0 \ubcf4\uc874 \uae30\uac04\uc744 \uc870\uc815\ud558\uc5ec SQS \ub300\uae30\uc5f4\uc5d0\uc11c \ucc98\ub9ac\ub418\uc9c0 \uc54a\uc740 \uba54\uc2dc\uc9c0 \uc0ad\uc81c\n\ucd94\ud6c4 \ub370\ub4dc \ub808\ud130 \ud050(DLQ) \uc758 \uc0ac\uc6a9\uc744 \uace0\ub824\ud574 \ubcfc \ud544\uc694\uac00 \uc788\uc74c.<\/p>\n\n<\/blockquote>\n\n\n<p class=\"has-text-color\" style=\"color: rgb(0, 0, 0)\"><span style=\"color: rgba(120, 119, 116, 1)\">[\ub808\ud37c\ub7f0\uc2a4]<\/span><\/p>\n\n\n<p class=\"has-text-color\" style=\"color: rgb(0, 0, 0)\"><a href=\"https:\/\/docs.aws.amazon.com\/ko_kr\/lambda\/latest\/dg\/with-sqs.html#services-sqs-backoff-strategy\">Amazon SQS\uc5d0\uc11c Lambda \uc0ac\uc6a9 &#8211; \uc2e4\ud328\ud55c \ud638\ucd9c\uc5d0 \ub300\ud55c \ubc31\uc624\ud504 \uc804\ub7b5<\/a><\/p>\n\n\n<p class=\"has-text-color\" style=\"color: rgb(0, 0, 0)\"><a href=\"https:\/\/docs.aws.amazon.com\/ko_kr\/lambda\/latest\/operatorguide\/sqs-retries.html\">Lambda \ud638\ucd9c \ubaa8\ub4dc \ube44\uad50 &#8211; SQS \uc7ac\uc2dc\ub3c4 \uc774\ud574<\/a><\/p>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n<p class=\"has-background\" style=\"background-color: rgb(251, 243, 219)\">&#x1f4a1; <strong>Pre-signed <span class='tooltipsall tooltipsincontent classtoolTips11'>URL<\/span>\uc744 \uc0ac\uc6a9\ud558\uc5ec S3 \uc5c5\ub85c\ub4dc\ub97c \ud558\uc600\uc744 \ub54c, \ud574\ub2f9 \uac1d\uccb4 <span class='tooltipsall tooltipsincontent classtoolTips11'>URL<\/span>\uc5d0 \uc811\uc18d\ub418\uc9c0 \uc54a\ub294 \uc774\uc288\n<\/strong><\/p>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%EC%9B%90%EC%9D%B8-3\"><\/span>\uc6d0\uc778<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<blockquote class=\"wp-block-quote has-text-color\" style=\"color: rgb(0, 0, 0)\">\n<p>Pre-signed <span class='tooltipsall tooltipsincontent classtoolTips11'>URL<\/span> \uc0dd\uc131 \ubc0f S3 \uc5c5\ub85c\ub4dc \uc2dc ACL\uc744 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc74c.<\/p>\n\n<\/blockquote>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%ED%95%B4%EA%B2%B0_%EB%B0%A9%EC%95%88-3\"><\/span>\ud574\uacb0 \ubc29\uc548<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<blockquote class=\"wp-block-quote has-text-color\" style=\"color: rgb(0, 0, 0)\">\n<p>public-read ACL \uc9c0\uc815<\/p>\n\n<\/blockquote>\n\n\n<pre class=\"wp-block-code\"><code>\/\/ get presignedURL\nconst presignedURL = s3.getSignedUrl(&#039;putObject&#039;, {\n    Bucket: bucketTg,\n    ContentType: &#039;image\/jpeg&#039;,\n    ACL: &#039;public-read&#039;,\n    Key: key,\n    Expires: 60\n})\n\n\/\/ S3 putObject\nawait axios.put(presignedURL, data, {\n    headers: {\n        &#039;Content-Type&#039;: &#039;image\/jpeg&#039;,\n        &#039;x-amz-acl&#039;: &#039;public-read&#039;\n    }\n})<\/code><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"References\"><\/span>#References<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n<p class=\"has-text-color\" style=\"color: rgb(0, 0, 0)\"><a href=\"https:\/\/docs.aws.amazon.com\/ko_kr\/AmazonS3\/latest\/userguide\/grant-destinations-permissions-to-s3.html\">https:\/\/docs.aws.amazon.com\/ko_kr\/AmazonS3\/latest\/userguide\/grant-destinations-permissions-to-s3.html<\/a><\/p>\n\n\n<p class=\"has-text-color\" style=\"color: rgb(0, 0, 0)\"><a href=\"https:\/\/docs.aws.amazon.com\/AWSJavaScriptSDK\/latest\/AWS\/S3.html\">https:\/\/docs.aws.amazon.com\/AWSJavaScriptSDK\/latest\/AWS\/S3.html<\/a><\/p>\n\n\n<p class=\"has-text-color\" style=\"color: rgb(0, 0, 0)\"><a href=\"https:\/\/docs.aws.amazon.com\/ko_kr\/AmazonS3\/latest\/API\/API_PutObject.html\">https:\/\/docs.aws.amazon.com\/ko_kr\/AmazonS3\/latest\/API\/API_PutObject.html<\/a><\/p>\n\n<script type=\"text\/javascript\"> toolTips('.classtoolTips3','\uc5ec\ub7ec \uac1c\uc758 \ud504\ub85c\uadf8\ub7a8 \ud568\uc218\ub4e4\uc744 \ubaa8\uc544 \ud558\ub098\uc758 \ud2b9\uc815\ud55c \uae30\ub2a5\uc744 \uc218\ud589\ud560 \uc218 \uc788\ub3c4\ub85d \uad6c\uc131\ud55c \uc791\uc740 \uae30\ub2a5\uc801 \ub2e8\uc704'); <\/script><script type=\"text\/javascript\">jQuery(\"document\").ready(function(){ if (typeof(bulletscreentoolTips3content) == 'undefined'){ var bulletscreentoolTips3content  = [\"\\ucef4\\ud3ec\\ub10c\\ud2b8\"] ; var bulletscreenindex3content = 0;jQuery(document).ready(function($) {\t$('.classtoolTips3').mouseout(function(e) {\t\tvar x = e.pageX,\t\ty = e.pageY; bulletscreenindex3content = (bulletscreenindex3content + 1) % bulletscreentoolTips3content.length; $(\"<span class='bulletscreenfortoolTips' \/>\").text(bulletscreentoolTips3content[bulletscreenindex3content]).css({\"z-index\": \"555555\",\"top\": y - 10,\"left\": x+10,\"color\": \"#bf316f\",\"font-size\": \"24px\",  \"font-weight\": \"bolder\",\"position\": \"absolute\"}).appendTo(\"body\").animate({\"top\": y - 380,\"opacity\": 1},2500,function() {this.remove();});});});}}); <\/script><script type=\"text\/javascript\"> toolTips('.classtoolTips11','<span class=\"notion-enable-hover\" data-token-index=\"0\">Uniform Resource Locator<br\/><\/span><br\/><br\/><a href=\"\/wordpress\/?p=65\">Detail<\/a>'); <\/script>","protected":false},"excerpt":{"rendered":"<p># \ud559\uc2b5 \ubaa9\ud45c # \ud574\uacb0 \uacfc\uc81c # \uc2e4\uc2b5 \uc790\ub8cc # \uacfc\uc81c \ud56d\ubaa9\ubcc4 \uc9c4\ud589 \uc0c1\ud669 1. Lambda \ud568\uc218 \uc0dd\uc131 javascript \ucf54\ub4dc \uc791\uc131 build &amp; deploy 2. S3 \ubc84\ud0b7 \uc0dd\uc131 \uc18c\uc2a4 \ubc84\ud0b7 \uc0dd\uc131 \ud0c0\uac9f \ubc84\ud0b7 \uc0dd\uc131 \ud0c0\uac9f \ubc84\ud0b7 ACL \ud65c\uc131\ud654 3. Lambda \ud2b8\ub9ac\uac70 \ucd94\uac00 4. Lambda \uc2e4\ud589 \uc5ed\ud560\uc5d0 \uad8c\ud55c \uc815\ucc45 \ucd94\uac00 5. \ud14c\uc2a4\ud2b8 \uc774\ubbf8\uc9c0 \uc5c5\ub85c\ub4dc Lambda \uc2e4\ud589 &#8230; <a title=\"[Sprint] \uc11c\ubc84\ub9ac\uc2a4 \uc0ac\uc9c4\ucca9\" class=\"read-more\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1090\" aria-label=\"More on [Sprint] \uc11c\ubc84\ub9ac\uc2a4 \uc0ac\uc9c4\ucca9\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_eb_attr":""},"categories":[45],"tags":[],"_links":{"self":[{"href":"https:\/\/www.gyuroot.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1090"}],"collection":[{"href":"https:\/\/www.gyuroot.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gyuroot.com\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gyuroot.com\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gyuroot.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1090"}],"version-history":[{"count":1,"href":"https:\/\/www.gyuroot.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1090\/revisions"}],"predecessor-version":[{"id":1127,"href":"https:\/\/www.gyuroot.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1090\/revisions\/1127"}],"wp:attachment":[{"href":"https:\/\/www.gyuroot.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1090"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gyuroot.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1090"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gyuroot.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1090"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}